//=========================By xiaowei
/*
*/
//=========================
1、硬件介绍
1、SGM7227,USB高速切换开关,OE是芯片使能,低电平才能使总线导通;
S脚是切换控制;
USB协议
https://segmentfault.com/a/1190000015995506
2、软件移植
移植文件分析
stm32自带USB接口,OTG-FS(全速)和OTG-HS(高速),因为stm32f4只带有高速PHY,想使用高速模式,就需要外扩高速PHY,在此为USB3300。
系统配置一个Device端口,一个Host端口;
Device端口连接主机,在此处为POS机,外接USB3300作为高速PHY;
Host端口连接打印进,使用了STM32内置的全速PHY;
移植时,我们重点要修改的就是 USB_APP 文件夹下面的代码。其他代码(USB_OTG 和USB_DEVICE 文件夹下的代码)一般不用修改。
需要修改的文件:
usb_bsp.c 提供了几个 USB 库需要用到的底层初始化函数,包括: IO 设置、中断设置、VBUS配置以及延时函数等,需要我们自己实现。 USB Device(Slave)和 USB Host 共用这个.c 文件。
usbd_desc.c 提供了 USB 设备类的描述符,直接决定了 USB 设备的类型、断点、接口、字符串、制造商等重要信息。这个里面的内容,我们一般不用修改,直接用官方的即可。注意,这里: usbd_desc.c 里面的: usbd 即 device 类,同样: usbh 即 host 类,所以通过文件名我们可以很容易区分该文件是用在 device 还是 host,而只有 usb 字样的那就是 device 和 host 可以共用的。
usbd_usr.c 提供用户应用层接口函数,即 USB 设备类的一些回调函数,当 USB 状态机处理完不同事务的时候,会调用这些回调函数,我们通过这些回调函数,就可以知道 USB 当前状态,比如:是否枚举成功了?是否连接上了?是否断开了?等,根据这些状态,用户应用程序可以执行不同操作,完成特定功能。
usbd_storage_msd.c 提供一些磁盘操作函数,包括支持的磁盘个数,以及每个磁盘的初始化和读写等函数。本章我们设置了 2 个磁盘: SD 卡和 SPI FLASH。
这些文件都是以回调函数的方式被内核调用,需要用户编写具体的应用程序;
使用时,需要定义 USB_OTG_CORE_HANDLE ,是一个全局结构体类型,用于存储 USB 通信中 USB 内核需要使用的的各种变量、状态和缓存等,任何 USB 通信(不论主机,还是从机),我们都必须定义这么一个结构体以实现 USB 通信。
USB 初始化非常简单,只需要调用 USBD_Init 函数即可,本章的 USB 读卡器属于 USB 设备类,所以使用该函数。该函数初始化了USB 设备类处理的各种回调函数,以便 USB 驱动库调用。执行完该函数以后, USB 就启动了,所有 USB 事务,都是通过 USB 中断触发,并由 USB 驱动库自动处理。
USB设备需要存储介质,需要用户定义存储介质驱动。
USB驱动会自己调用处理函数进行处理,用户需要改动的是底层的驱动,即磁盘的读写;具体在usbd_storage_msd.c里面,
磁盘回调函数结构体:
USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
{
STORAGE_Init,
STORAGE_GetCapacity,
STORAGE_IsReady,
STORAGE_IsWriteProtected,
STORAGE_Read,
STORAGE_Write,
STORAGE_GetMaxLun,
(int8_t *)STORAGE_Inquirydata,
};
读操作:
int8_t STORAGE_Read (uint8_t lun,
uint8_t *buf,
uint32_t blk_addr,
uint16_t blk_len)
{
buf=&U_DISK[blk_addr*512];
return 0;
}
USB启动阶段请求
这个博客分析的挺好:
https://www.cnblogs.com/Daniel-G/p/3993883.html
USB内核处理
USB_OTG_CORE_HANDLE 是全局变量,
- 用于存储 USB 通信中 USB 内核需要使用的的各种变量、状态和缓存等,任何 USB 通信(不论主机,还是从机),我们都必须定义这么一个结构体以实现 USB 通信,
typedef struct USB_OTG_handle
{
USB_OTG_CORE_CFGS cfg;
USB_OTG_CORE_REGS regs;
#ifdef USE_DEVICE_MODE
DCD_DEV dev;
#endif
#ifdef USE_HOST_MODE
HCD_DEV host;
#endifdda
#ifdef USE_OTG_MODE
OTG_DEV otg;
#endif
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
USB_OTG_CORE_HANDLE分析:
这是个全局结构体,内部存储内核处理USB设备,主机的变量;
当USB作为Device设备时,USB_OTG_CORE_HANDLE定义为DCD_DEV ;
其参数如下:
typedef struct _DCD
{
uint8_t device_config;
uint8_t device_state;
uint8_t device_status;
uint8_t device_old_status;
uint8_t device_address;
uint8_t connection_status;
uint8_t test_mode;
uint32_t DevRemoteWakeup;
USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS];
USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS];
uint8_t setup_packet [8*3];
USBD_Class_cb_TypeDef *class_cb;
USBD_Usr_cb_TypeDef *usr_cb;
USBD_DEVICE *usr_device;
uint8_t *pConfig_descriptor;
}
DCD_DEV , *DCD_PDEV;
DCD_DEV 结构说明:
DCD_DEV结构包含用于实时保存与设备,控制传输状态机以及端点信息和状态相关的所有信息的所有变量和结构。
中断处理
- 所有USB的事件都是通过中断触发,并由内核自动处理。
在此处USB_OTG_CORE_HANDLE USB_OTG_Core;
用来作为主机结构;
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END ;
用来作为从机设备;
OTG概念
On-The-Go,即OTG技术就是实现在没有Host的情况下,实现设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接两台设备间的USB口,将拍出的相片立即打印出来;也可以将数码照相机中的数据,通过OTG发送到USB接口的移动硬盘上,野外操作就没有必要携带价格昂贵的存储卡,或者背一