2024年10月31日木曜日

STM32H723 USB BULK転送したい(3)HOSTからBULK trans/read

STM32H723をtargetとして、STM32CubeIDEでCDC Classを生成し、これを雛形にBULK transferを行います.

今回は、専らLinux HOSTのお話です.Linux HOSTから文字列"hirasaka"を送信し、すぐにLOOPBACKで"HIRASAKA"が返ってくることの確認です.

STM32のfirmwareは前回のままです.
SYM32のfirmwareの受信→返信の肝の部分はどこかというと、、、HOSTから何か送られてきたらここがcallされるように、CDC雛形が出来ています.大文字変換を追加しました.
usbd_cdc_if.c
264行
static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len){
  USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceHS);
  for(int i=0; i<*Len; i++) Buf[i]&=0b11011111; ←大文字変換
  CDC_Transmit_HS(Buf, *Len); ←即時LOOPBACK
  return (USBD_OK);
}

それで、とあるLinuxのcodeを動かすと、こんな反応が返ってきます.
There are 7 USB device.
0 0789/0198 Logitec
1 1d6b/0003 Linux 6.8.0-47-generic xhci-hcd
2 0483/5740 HIRASAKA
-->found my device.
3 046d/c534 Logitech
4 04d9/1603  
5 0557/7000  
6 1d6b/0002 Linux 6.8.0-47-generic xhci-hcd
kernel 0
config 0
interface 0
loopback HIRASAKA
loopback HIRASAKA
loopback HIRASAKA

Linuxのcodeを以下に記します.
コンパイルのおまじないはこんな感じ.
gcc eprw.c -I/usr/include/libusb-1.0 -lusb-1.0 -lm -o eprw
libusbを使います.

ここから最後までがcodeです.

2へ   4へ


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <libusb.h>    // usblib1.0

struct libusb_device_descriptor desc;
libusb_device_handle* h_dev;
unsigned char text[512];

int main(int argc, char *argv[])
{
  // search device
  libusb_device **list;
  libusb_device *found = NULL;
  libusb_init( NULL );    // initialize USBLIB
  int dcnt = libusb_get_device_list(NULL,&list);
  if(dcnt<0) exit(1);
  printf("There are %d USB device.\n",dcnt);
  for(int i=0;i<dcnt;i++) {
    libusb_device *device = list[i];
    libusb_get_device_descriptor(device, &desc);
    int ret = libusb_open(device, &h_dev);
    if(ret==0) {
      libusb_get_string_descriptor_ascii(h_dev, desc.iManufacturer, text, sizeof(text));
      int vid = desc.idVendor;
      int pid = desc.idProduct;
      printf("%d %04x/%04x %s\n",i,vid,pid,text);
      if(strcmp("HIRASAKA",text)==0) {
found = device;
printf("-->found my device.\n");
      }
      libusb_close(h_dev);
    }
  }
  libusb_free_device_list(list,1);

  // open
  libusb_open(found, &h_dev);
  int r;
  r = libusb_set_auto_detach_kernel_driver( h_dev , 1 );
  printf("kernel %d\n",r);
  r = libusb_set_configuration( h_dev , 1 ); 
  printf("config %d\n",r);
  r = libusb_claim_interface( h_dev , 1 ); // select interface
  printf("interface %d\n",r);

  // transfer & read 10 times
  unsigned char sendbuf[] = "hirasaka";
  unsigned char readbuf[100];
  int actlen;
  for(int i=0; i<10; i++){
    readbuf[0]=0;
    r = libusb_bulk_transfer(h_dev, 1, sendbuf, 8, &actlen, 1000);
    r = libusb_bulk_transfer(h_dev,0x81, readbuf, 8, &actlen, 10000);
    readbuf[8]=0;
    printf("loopback %s\n",readbuf);
    sleep(1);
  }

  libusb_close(h_dev);  
}

0 件のコメント:

コメントを投稿