linux下使用usb总线实现类似于tcp/ip的server/client通信

硬件环境:2440开发板,pc,USB数据线

软件环境:ubuntu,linux 3.4.2


要实现标题的功能,需要写四个程序

1.pc端的host驱动,这个可以借鉴drivers/usb/下的usb-skeleton.c,只需要更改它的vendor_id 和produce_id 即可

2.host端的用户层程序

3.gadget端驱动,即运行在2440上的usb gadget驱动,2440的usb控制器驱动已经写好了,位于drivers/usb/gadget/s3c2410_udc.c,它通过usb_add_gadget_udc将自己注册到udc-core, 类似与host端的usb-core, gadget端驱动也有udc-core,位于drivers/usb/gadget/udc-core.c. usb功能驱动通过usb_gadget_probe_driver将自己注册到udc-core。

4.gadget端用户层程序。


目前遇到的问题总结如下:

1.3c2410_udc.c的debug函数dprintk如果将printk(KERN_DEBUG "%s", printk_buf);  的KERN_DEBUG删除,会出现枚举失败的情况,猜想的原因可能是不加KERN_DEBUG,因为默认printk输出到终端,而加了KERN_DEBUG默认不会输出到终端,需要用dmesg来查看。因为输出到终端,导致需要时间开销较大,造成枚举时给host端的返回数据不够及时,导致出错。

2.usb-skeleton驱动在用户层调用read之后,会陷入内核,调用usb-skeleton的read,而read在提交urb之后会调用wait_for_completion等待数据到来,而如果gadget端数据没有过来,就一直在等,而且用户端的进程杀不掉,因为此时阻塞在内核,也就是说,如果gadget端不发数据过来,skeleton驱动会一直阻塞。这是用户层的进程会发现状态是D,这样的进程用kill -9是杀不掉的。


今天先记录这么多,日后会继续更新,并贴出代码。




你可能感兴趣的:(嵌入式)