VMware Workstation 16 PlayerにWindows7を導入。VMwareToolsインストールに少してこずる。

カテゴリー: ソフトウェア

VMwareToolsの導入に少し苦労したので覚書

ゲストOSはWindows7 HomePremium 32bit SP1

OS本体はすんなりインストール完了!

ディスクを入れ「新規仮想マシンの作成(N)」からインストール

あれれ?!「VMwareToolsのインストール」がブラックアウト

そこで、VMwareToolsの手動インストールすることにしました。

VMwareToolsのダウンロードページから、12.1.0をDL。Windows7 SP1 or laterとあるのでインストール条件はOKのはず

解決しないので、SP1上書きと更新プログラム適用を行うことに

まず、SP1をもう一度上書きインストールしてみる。Windows7 SP1のインストールページから手動インストールファイルをDL。

その後、VMwareToolsのコミュニティページで更新プログラムを適用する回答があったのでやってみる。

DLしたファイルはUSBメモリ経由でゲストOSへコピー

いずれもゲストOSで実行するものです。

この時点では、VMwareToolsが無効なので、まだD&Dやファイルの共有もできません。そこでUSBメモリ経由でゲストOSへパッチをコピー。

二番目のexeファイルはSP1インストールファイル

順番としては、

  1. kb976932 SP1再インストール(結果的にしなくても良かったかも・・・)
  2. KB4474419
  3. KB4490628
  4. KB4536952
  5. KB4534310

インストール後は再起動。Windows 7 のサポートが切れていますというメッセージが出たら、手順がうまく行ったことらしい。

パッチは無事クリア。VMwareToolsのインストールも無事終了。

コミュニティのおかげで助かりましたm(_ _)m

ESP32-S3-1-N16R8を試してみる-USBIFでCDCデバイス

カテゴリー: ESP32

ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
 今回は、ESP32-S3-1-N16R8で、JTAG用のUSBをCDCデバイスとして設定してみた覚書です(windows限定です)。

ESP-IDFでTinyUSBスタックが提供されている

私の開発環境であるPlatformIOのESP-IDFモードで確認します。Arduinoモードでも同名のライブラリが存在するようです。

sdkconfigでUSB許可しておく

PlatformIOでsdkconfig.esp23s3を編集して2行を”y”に変更しておきます(2行連続しているとは限りません)。

CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y

Espressif-ESP-IDF/USBサンプルをDL

GitHubから「tusb_serial_device」をDLします。簡単なループバックテストです。TeraTermでキー入力のバックを見るために「キーコード+1」を追加しました。

/*
 * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Unlicense OR CC0-1.0
 */

#include <stdint.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "sdkconfig.h"

static const char *TAG = "example";
static uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE + 1];

void tinyusb_cdc_rx_callback(int itf, cdcacm_event_t *event)
{
    /* initialization */
    size_t rx_size = 0;

    /* read */
    esp_err_t ret = tinyusb_cdcacm_read(itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE, &rx_size);
    if (ret == ESP_OK) {
		buf[0] += 1;   // 追加コード
        tinyusb_cdcacm_write_queue(itf,buf,rx_size);
	    tinyusb_cdcacm_write_flush(itf, 0);
        ESP_LOGI(TAG, "Data from channel %d:", itf);
        ESP_LOG_BUFFER_HEXDUMP(TAG, buf, rx_size, ESP_LOG_INFO);
    } else {
        ESP_LOGE(TAG, "Read error");
    }

    /* write back */
//    tinyusb_cdcacm_write_queue(itf, buf, rx_size);
}

void tinyusb_cdc_line_state_changed_callback(int itf, cdcacm_event_t *event)
{
    int dtr = event->line_state_changed_data.dtr;
    int rts = event->line_state_changed_data.rts;
    ESP_LOGI(TAG, "Line state changed on channel %d: DTR:%d, RTS:%d", itf, dtr, rts);
}

void app_main(void)
{
    ESP_LOGI(TAG, "USB initialization");
    tinyusb_config_t tusb_cfg;
    tusb_cfg.descriptor = NULL;
    tusb_cfg.string_descriptor = NULL;
    tusb_cfg.external_phy = false;
    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
    tinyusb_config_cdcacm_t acm_cfg;
    acm_cfg.usb_dev = TINYUSB_USBDEV_0;
    acm_cfg.cdc_port = TINYUSB_CDC_ACM_0;
    acm_cfg.rx_unread_buf_sz = 64;
    acm_cfg.callback_rx = &tinyusb_cdc_rx_callback; // the first way to register a callback
    acm_cfg.callback_rx_wanted_char = NULL;
    acm_cfg.callback_line_state_changed = NULL;
    acm_cfg.callback_line_coding_changed = NULL;
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
    /* the second way to register a callback */
    ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
                        TINYUSB_CDC_ACM_0,
                        CDC_EVENT_LINE_STATE_CHANGED,
                        &tinyusb_cdc_line_state_changed_callback));

#if (CONFIG_TINYUSB_CDC_COUNT > 1)
    acm_cfg.cdc_port = TINYUSB_CDC_ACM_1;
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
    ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
                        TINYUSB_CDC_ACM_1,
                        CDC_EVENT_LINE_STATE_CHANGED,
                        &tinyusb_cdc_line_state_changed_callback));
#endif

    ESP_LOGI(TAG, "USB initialization DONE");
}

windows10、11ではそのままつながる

UMによるとTinyUSBはUSB-CDC-ACMクラスに準拠しています。Windows10、11では外部ドライバーのインストール無しに使えます。

ローカルエコーONにして”abcdefg”と打った画面です。コードに+1して帰ってきます。

Windows8、8.1マシンは持っていないので未確認ですが、「8以降」と記載されていたのでおそらく大丈夫。できない場合は下記の方法でインストールします。

Windows7ではドライバインストール必要

ESP-IDFのUMに従って汎用CDCドライバをインストールします

Zadig.exeで汎用CDCドライバインストール

zadigはJTAGデバッガでも使う汎用USBドライバです。今回DLしたのは「zadig-2.7.exe」。USB-Serial(CDC)を選択してインストールします。

ESP32-S3-1-N16R8を試してみる-GPIO動作

カテゴリー: ESP32

ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。

今回は、秋月販売のモジュールESP32-S3-1-N16R8を使う確認です。販売されているESP32-S3-DevkitC-1とはモジュールの種類が違うので乗せ換えて動かしてみます。

N16R8を使いたい。

高性能マイコンとして使ってみたいだけなので、ESP32-S3-DevkitCで動作確認して、N16R8でも同じに動作させたいのです。

ESP32-S3-DevkitCはD3N8、モジュール品はN16R8、PSRAMでGPIO33~37使う。

DevkitC搭載のS3の彫刻は「D3N8」ですが、データシートにD3N8という型番はないのでおそらく「ESP32-S3-WROOM-1-N8」と推測します。HPに「N8」と書いてありました(^^)。

N8とN16R8との(私が)気になる違いは、PSRAMがQuad→OctalSPIです。接続ピンが増えるらしくデータシートによるとGPIO33~37はPSRAM用となりGPIOとしての使用は非推奨となっています。いま検討している事案では、このポートが汎用で使用可否が懸案事項なのです。まずはデフォルト状態でGPIO33~37使えるかどうか確認です。

DevkitCにN16R8を載せかえる

DevkitCとしてブレッドボードで確認したいので乗せ換えます。

外したN8デバイスには25Q64ES1Gが使われていた。

外してみたら8ピンQuad64MbitSPIFlashが搭載されてましたがSPIは一組です。N16R8ではこれがOctalになるそうで、SPI組が増えてGPIO33~37にOctalSPI信号が割り当てられると想像つきます。N16R8を分解して接続を見る必要ありますが、PSRAMを使用しない設定にできればそのままでIOポートとして使えると推定します。まずはデフォルトでなにも設定しないでポートとしてアクセスしてみます。

PlatformIOで確認。とりあえずGPIO36,37は汎用IOで使えた。

確認プログラム抜粋です(PlatformIOのBlink Exampleを流用)

#define BLINK_GPIO (gpio_num_t)45
#define SW6			(gpio_num_t)37
	・
	・
static void blink_led(int s_led_state) {
    gpio_set_level(BLINK_GPIO, s_led_state);
}
	・
	・
static void configure_led(void)
{
    gpio_reset_pin(BLINK_GPIO);
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}

void ledTestTask(void *pvParameters) {
    for(;;) {
		if(gpio_get_level(SW6)==0) s_led_state=1; else s_led_state=0;
        blink_led(s_led_state);
        vTaskDelay(50);
    }
}

extern "C" void app_main() {
    gpio_reset_pin(SW6); gpio_set_direction(SW6, GPIO_MODE_INPUT);
    gpio_set_pull_mode(SW6,GPIO_PULLUP_ONLY);
    configure_led();
    xTaskCreate(ledTestTask,"ledtest", 2048, NULL, 5, NULL);
    while (1) {
		vTaskDelay(100);
	}
}

というわけで、とりあえずデフォルトでGPIO36をLED出力、GPIO37をスイッチ入力としてみたところ、無事に動作しました。めでたしめでたし。信号波形もきれいで衝突・干渉等はありません。

PSRAMを使わない・・という設定をきちんと確認する必要はあると思います。

sdkconfigに「PSRAM」のキーワードがなかったので、そう簡単には見つかりませんが、これから関連項目を探すことにします。

次はJTAG用USBを使った汎用CDCの確認です

これができれば、単なる高性能マイコンボードとして使える用途が増えそうです。