关于在u-boot中使用usb进行通信(二)

转载请标明原处:https://blog.csdn.net/weixin_42066997/article/details/80082684


在执行完fboot_interface_init函数后,会进入一个while(1)循环,执行fastboot_poll函数,该函数定义在u-boot\arch\arm\cpu\slsiap\common\cmd_fastboot.c

关于在u-boot中使用usb进行通信(二)_第1张图片

该函数用于检测usb的连接状态,如果usb没连接,会返回DISCONNECT,并重新执行do...while循环,如果检测到连接,则执行fboot_usb_int_hndlr函数

这是目前最简单的函数,直接调用s3c_udc_int_hndlr,该函数定义在u-boot\arch\arm\cpu\slsiap\devices\dwc_otg_hs.c

关于在u-boot中使用usb进行通信(二)_第2张图片

这个函数是usb的核心函数,相对比较复杂,包括注册usb设备,接收数据包,发送数据包

s3c_usb_set_init函数:注册usb设备

关于在u-boot中使用usb进行通信(二)_第3张图片

还记得之前说的全局变量is_fastboot吗,该值为1,执行fboot_usb_set_descriptors

关于在u-boot中使用usb进行通信(二)_第4张图片

该函数用于配置usb描述符,包括设备描述符,配置描述符,接口描述符,端点描述符,我们需要注意的是,设备的vendorIDvid),productIDpid),端口地址EndpointAddress

端口地址为一个字节,最高位D7代表传输方向,1为输入,0为输出,D3D0为端口号,D6D4保留,设为0

vidpid在另一个函数fboot_usb_descriptor中被重新定义,fboot_usb_descriptor定义在u-boot\arch\arm\cpu\slsiap\common\cmd_fastboot.c

关于在u-boot中使用usb进行通信(二)_第5张图片

vidpid都是长度为2个字节的编号,vid最好不要随便改,pid可以修改

 

s3c_usb_pkt_receive函数:接收数据包

关于在u-boot中使用usb进行通信(二)_第6张图片

该函数通过读取寄存器状态获知是否有数据需要接收,如果有数据,会调用fboot_usb_int_bulkout,定义在u-boot\arch\arm\cpu\slsiap\devices\fastboot.c

关于在u-boot中使用usb进行通信(二)_第7张图片

该函数非常简单,调用s3c_usb_read_out_fifo从管道读数据就行了,该函数定义在u-boot\arch\arm\cpu\slsiap\devices\dwc_otg_hs.c

关于在u-boot中使用usb进行通信(二)_第8张图片

s3c_usb_transfer函数:发送数据包

关于在u-boot中使用usb进行通信(二)_第9张图片

这个函数看起来很复杂,但实际上我们只要关心fboot_usb_int_bulkin函数就可以了,该函数定义在u-boot\arch\arm\cpu\slsiap\devices\fastboot.c

关于在u-boot中使用usb进行通信(二)_第10张图片

该函数也很简单,调用s3c_usb_write_in_fifo往管道里写数据就行了,定义在u-boot\arch\arm\cpu\slsiap\devices\dwc_otg_hs.c

关于在u-boot中使用usb进行通信(二)_第11张图片

你可能感兴趣的:(关于在u-boot中使用usb进行通信(二))