PIC32MZ HighSpeed USB HOST Application Interface 2025.10.12


    [HOST]

    void usb_host_init(void)


     ホストモジュールを初期化します.
    アプリケーションソフトからこの関数を呼び出すことでホストプログラムが有効となります.

    int isUsbConnect(void)


     現在接続しているUSBデバイスの数を返します.

     HUBを接続しただけではデバイスの数は 0 です.
     USBコネクタに直接あるいは、USBコネクタに接続したHUBのポートにデバイスを接続すると 1 以上の値を返します.
     ただし、ホストプログラムがサポートしていないデバイスを接続した場合にはカウントされません.
     マウスを接続するとカウントされますが LAN-アダプタなどを接続してもカウントしません.

     USBデバイスの接続や取り外しの検出、接続検出後のエヌメレーション等の処理はこの関数を呼び出すことで実行されます. アプリケーションプログラムは、アプリケーションループの中でこの関数を必ず呼び出すようにしてください.

     なお、目的のデバイスを接続した後、アプリケーションシステムを停止するまでそのデバイスを取り外したり、新たなデバイスを接続することが無ければ、目的のデバイスの接続が確認された後は必ずしもこの関 数を呼び出す必要はありません.


    [MOUSE]

    int get_nums_mouse_device(void)


     現在接続しているUSBマウスの数を返します.
     マウスが接続されていなければ 0 を返します.

    int usb_mouse_read(int dev_no, uint8_t *buff, uint16_t buff_size)


     dev_no で指定するマウスからデータを読み出して buff に格納します.
     dev_no は 0 から始まり get_nums_mouse_device()関数が返す値 -1 までとなります.

     読み出したパケットサイズが buff_size より大きい時は、パケットの先頭から buff_size 分のみ buff に格納します.残りは捨てられます.
     読み出したデータのバイト数を返します. マウスのデータが読めなかった時は 0 を返します.
     dev_no で指定したマウスが存在しない場合やエラーが発生した時には -1 を返します.
     buff の大きさは8バイト確保されていれば通常問題ありませんが、特殊なマウスなどで読み出すデータ数が不明な場合には、64バイト確保してください.

    int usb_mouse_set_protocol(int dev_no, uint8_t protocol)


     dev_no で指定するマウスのプロトコルを protocol で指定するプロトコルに変更します.
     dev_no は 0 から始まり get_nums_mouse_device()関数が返す値 -1 までとなります.

     Bootプロトコルの場合には protocol に 0 を, Reportプロトコルの場合には 1 を設定します.
     プロトコルの変更にエラーがなければ 0 を、エラーが発生した場合には -1 を返します.
     戻り値が 0 であっても、マウスによってはプロトコルの変更ができないものもあります.
     一度 BootプロトコルにするとReportプロトコルに戻らないマウスも存在します.


    [KEYBOARD]

    int get_nums_keyboard_device(void)


     現在接続しているUSBキーボードの数を返します.
     キーボードが接続されていなければ 0 を返します.

    int usb_keyboard_read(int dev_no, uint8_t *buff, uint16_t buff_size)


     dev_no で指定するキーボードからデータを読み出して buff に格納します.
     dev_no は 0 から始まり get_nums_keyboard_device()関数が返す値 -1 までとなります.

     読み出したパケットサイズが buff_size より大きい時は、パケットの先頭から buff_size 分のみ buff に格納します.残りは捨てられます.
     読み出したデータのバイト数を返します. キーボードのデータが読めなかった時は 0 を返します.
     dev_no で指定したキーボードが存在しない場合やエラーが発生した時には -1 を返します.
     buff の大きさは8バイト確保されていれば通常問題ありません. 特殊なキーボードを接続し、データ数が不明な場合には、64バイト確保してください.

    int usb_keyboard_set_protocol(int dev_no, uint8_t protocol)


     dev_no で指定するキーボードのプロトコルを protocol で指定するプロトコルに変更します.
     dev_no は 0 から始まり get_nums_keyboard_device()関数が返す値 -1 までとなります.

     Bootプロトコルの場合には protocol に 0 を, Reportプロトコルの場合には 1 を設定します.
     プロトコルの変更にエラーがなければ 0 を、エラーが発生した場合には -1 を返します.

    int usb_keyboard_set_report(int dev_no, uint8_t led_ctrl)


     dev_no で指定するキーボードの NumLock, CapsLock, ScrlLock の3つのLEDの点灯・消灯の制御を行います.
     dev_no は 0 から始まり get_nums_keyboard_device()関数が返す値 -1 までとなります.
    
     led_ctrl に設定する値は次の通りです.
    
        bit 0: NUM_LOC
        bit 1: CAPS_LOC
        bit 2: SCROLL_LOCK           0:消灯 1:点灯
    
     dev_no で指定したキーボードが存在しない場合やエラーが発生した時には -1 を返します. エラーがなければ 0 を返します. LEDが実装されていないキーボードでは効果がありません.


    [HID GENERIC]

    int get_nums_hid_generic_device(void)


     現在接続しているHID ジェネリックデバイスの数を返します.
     デバイスが接続されていなければ 0 を返します.
     HIDジェネリックデバイスとは、クラスコード(3), サブクラスコード(0), プロトコルコード(0)のデ バイスです. ゲームコントローラなどがこれに該当します.

    int usb_hid_generic_read(int dev_no, uint8_t *buff, uint16_t buff_size)


     dev_no で指定するデバイスからデータを読み出して buff に格納します.
     dev_no は 0 から始まり get_nums_hid_generic_device()関数が返す値 -1 までとなります.

     読み出したパケットサイズが buff_size より大きい時は、パケットの先頭から buff_size 分のみ buff に格納します.残りは捨てられます.
     読み出したデータのバイト数を返します. デバイスからデータが読めなかった時は 0 を返します.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.

     buff の大きさは Low Speed デバイスなら 8バイト, Full Speed 以上のデバイスなら 64 バイトを確保してください.

    int usb_hid_generic_write(int dev_no, uint8_t *data, uint16_t data_size)


     dev_no で指定するデバイスへ data バッファから data_size バイトのデータを書き込みます.
     dev_no は 0 から始まり get_nums_hid_generic_device()関数が返す値 -1 までとなります.

     data_size で指定する書き込むデータの大きさは、USBのパケットサイズを超えていても構いません.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.
    そうでない場合には送信したバイト数(data_sizeに同じ)を返します.


    [AUDIO MIDI]

    int get_nums_midi_device(void)

     現在接続しているMIDIデバイスの数を返します.
     MIDIデバイスが接続されていなければ 0 を返します.

    int usb_midi_read(int dev_no, uint8_t *buff, uint16_t buff_size)


     dev_no で指定するMIDIデバイスからデータを読み出して buff に格納します.
     dev_no は 0 から始まり get_nums_midi_device()関数が返す値 -1 までとなります.

     読み出したパケットサイズが buff_size より大きい時は、パケットの先頭から buff_size 分のみ buff に格納します.残りは捨てられます.
     読み出したデータのバイト数を返します. デバイスからデータが読めなかった時は 0 を返します.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.

     data バッファの大きさは 64 バイトを確保してください.

    int usb_midi_write(int dev_no, uint8_t *data, uint16_t data_size)


     dev_no で指定するMIDIデバイスへ data バッファから data_size バイトのデータを書き込みます.
     dev_no は 0 から始まり get_nums_midi_device()関数が返す値 -1 までとなります.

     data_size で指定する書き込むデータの大きさは、USBのパケットサイズを超えていても構いません.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.
    そうでない場合には送信したバイト数(data_sizeに同じ)を返します.


    [USB SERIAL]

    int get_nums_serial_device(void)


     現在接続しているシリアルデバイスの数を返します.
     シリアルデバイスが接続されていなければ 0 を返します.

    int set_serial_port_parameter(int dev_no, int32_t *param)


     dev_no で指定するシリアルデバイスのパラメータを、param で指定する値に設定します.
     dev_no は 0 から始まり get_nums_serial_device()関数が返す値 -1 までとなります.
    
     param に設定する値は次の通りです.
    
      param[5]:
        param[0] = BAUDRATE;
        param[1] = DATABIT;
        param[2] = STOPBIT; 
        param[3] = PARITYBIT;
        param[4] = FLOW
     
        BAUDRATE:     115200/57600/38400/19200/9600/4800/2400 
        STOPBIT:      0/1/2       0=1bit  1=1.5bit   2=2bit
        PARITYBIT:    0/1/2/3/4   0=none  1=odd  2=even  3=mark  4=space
        DATABIT:      8/7/6/5
        FLOW:         0/1/2/4     0=none  1=rts/cts 2=dtr/dsr 4=xon/xoff
    
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.そうでない場合には 0 を返します.
     なお、CDC デバイスでは FLOW 制御の設定は無効です. FTDIのシリアルデバイスでは有効です.

     HOSTは、シリアルデバイスの認識過程の中で次のようなデフォルトのパラメータ設定を行います.
      115200bps, データ長8ビット, ストップ1ビット, パリティ無し、フロー制御無し

    int get_serial_port_parameter(int dev_no, int32_t *param)

     dev_no で指定するシリアルデバイスのパラメータを読み出して param に格納します.
     dev_no は 0 から始まり get_nums_serial_device()関数が返す値 -1 までとなります.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.そうでない場合には 0 を返します.
     FTDIシリアルデバイスではパラメータの読み出し機能がないため常に -1 を返します.

    int set_serial_port_state(int dev_no, uint8_t ctrl)


     dev_no で指定するシリアルデバイスのステートを ctrl で指定する値に設定します.
     dev_no は 0 から始まり get_nums_serial_device()関数が返す値 -1 までとなります.
    
     ctrl に設定する値は次の通りです.
    
        bit0=DTR     1=on 0=off
        bit1=RTS     1=on 0=off
    
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.そうでない場合には 0 を返します.
     HOSTは、シリアルデバイスの認識過程の中で DTR オン, RTS オン に設定します.

    int usb_serial_read(int dev_no, uint8_t *buff, uint16_t buff_size)


     dev_no で指定するシリアルデバイスからデータを受信して buff に格納します.
     dev_no は 0 から始まり get_nums_serial_device()関数が返す値 -1 までとなります.

     受信したデータのサイズが buff_size より大きい時は、buff_size 分のみ buff に格納し、残りは捨てられます.
     受信したデータのバイト数を返します. デバイスからデータを受信できなかった時は 0 を返します.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.

    int usb_serial_write(int dev_no, uint8_t *data, uint16_t data_size)


     dev_no で指定するシリアルデバイスへ data バッファから data_size バイト分のデータを送信します.
     dev_no は 0 から始まり get_nums_serial_device()関数が返す値 -1 までとなります.

     data_size で指定するデータの大きさは、USBのパケットサイズを超えていても構いません.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した場合には -1 を返します.
    そうでない場合には送信したバイト数(data_sizeに同じ)を返します.


    [MSC]

    int get_nums_msc_device(void)


     現在接続しているMSCデバイス(USBメモリやUSBカードリーダーなど)の数を返します.
     MSCデバイスが接続されていなければ 0 を返します.

    int usb_msc_sector_read(int dev_no, uint32_t read_sector, uint8_t *buff)


     dev_no で指定するMSCデバイスから、read_sector で示すセクターから1セクター分のデータ(512バイト)を読み出して buff に格納します.
     dev_no は 0 から始まり get_nums_msc_device()関数が返す値 -1 までとなります.
     read_sector で指定するセクターは、0 から usb_msc_capacity_read()が返す値までです.

     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.
     デバイスがレディ状態で無い時には、-2 を返します.
     デバイスのレディ状態の確認は、usb_msc_test_unit_ready()関数を呼び出すことで確認できます.
     正常に読み出せると 0 を返します.
     buff の大きさは 512 バイトを確保してください.

    int usb_msc_sector_write(int dev_no, uint32_t write_sector, uint8_t *buff)


     dev_no で指定するMSCデバイスの write_sector で示すセクターへ、 buff から1セクター分のデータを書き込みます.
     dev_no は 0 から始まり get_nums_msc_device()関数が返す値 -1 までとなります.
     write_sector で指定するセクターは、0 から usb_msc_capacity_read()が返す値までです.

     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.
     デバイスがレディ状態で無い時には、-2 を返します.
     デバイスのレディ状態の確認は、usb_msc_test_unit_ready()関数を呼び出すことで確認できます.
     正常に書き込めると 0 を返します.

    int usb_msc_test_unit_ready(int dev_no)


     dev_no で指定するMSCデバイスへ SCSIコマンドの TEST_UNIT_READY コマンドを発行しデバイスのレディ状態を確認します.
     デバイスがレディを返すまで、2.5秒間繰り返しこのコマンドを発行します.
     デバイスのレディが確認出来た時は 0 を返します.
     dev_no で指定したデバイスが存在しない場合や 2.5 秒の間にレディが確認出来なかった時には -1 を返します.
     状態確認の結果(レディあるいはアンレディ)は、ホスト内部に記憶されており、この関数が呼び出される度に更新されます.
     HOSTは、MSCデバイスの認識過程の中でこの関数を呼び出してデバイスのレディ状態を確認します.

    int usb_msc_request_sense(int dev_no)


     dev_no で指定するMSCデバイスへ SCSIコマンドの REQUEST_SENSE コマンドを発行します.
     コマンド実行が成功すれば 0 を返します.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には -1 を返します.
     コマンド実行で読み取ったセンスデータは内部で破棄しています. 確認することは出来ません.

    uint32_t usb_msc_capacity_read(int dev_no)


     dev_no で指定するMSCデバイスへ SCSIコマンドの READ_CAPACITY コマンドを発行します.
     コマンド実行が成功すれば、最終の論理セクター番号を返します.
     dev_no で指定したデバイスが存在しない場合やエラーが発生した時には 0 を返します.