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です.
#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 件のコメント:
コメントを投稿