历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2020年10月30日 | STM32 usb_core.c分析

2020-10-30 来源:eefocus

usb_core.c这个c文件是个庞大的文件,主要是定义了usb2.0的标注协议处理函数。

下面是这个文件的所有函数:

/*******************************************************************************

* Function Name  : Standard_GetConfiguration.

* Description    : 返回当前配置变量的地址

* Input          : Length -需要的字节 How many bytes are needed.

* Output         : None.

* Return         : 如果'Length'值为0时,请求无效,返回1。长度不为0时,返回配置变量的地址

* Readme : 当配置值与摸个配置描述符中的配置编号一致时,表示选中该配置

*******************************************************************************/

uint8_t *Standard_GetConfiguration(uint16_t Length);






/*******************************************************************************

* Function Name  : Standard_SetConfiguration.

* Description    : 该函数用于设置配置值,主机发送该请求后,usb设备要配置自己的设备值

* Input          : None.

* Output         : None.

* Return         : 当该请求被执行了,返回USB_SUCCESS

*                  当请求无效时,然会USB_UNSUPPORT

*******************************************************************************/

RESULT Standard_SetConfiguration(void);






/*******************************************************************************

* Function Name  : Standard_GetInterface.

* Description    : 返回当前接口的备用接口

* Input          : Length -需要的字节数

* Output         : None.

* Return         : 当'Length'的值为0,请求无效,返回0,当长度不为0,返回备用接口的地址

*******************************************************************************/

uint8_t *Standard_GetInterface(uint16_t Length);






/*******************************************************************************

* Function Name  : Standard_GetStatus.

* Description    : 拷贝设备请求数据到"StatusInfo buffer".

* Input          : - Length -需要的字节数 

* Output         : None.

* Return         : 如果请求在数据块的末端,或则当'Length'为0是,请求无效,则返回0

*******************************************************************************/

uint8_t *Standard_GetStatus(uint16_t Length);






/*******************************************************************************

* Function Name  : Standard_ClearFeature.

* Description    : 清除或禁止某个指定的特性

* Input          : None.

* Output         : None.

* Return         : 当请求被执行,返回Return USB_SUCCESS,如果请求无效,返回USB_UNSUPPORT

*******************************************************************************/

RESULT Standard_ClearFeature(void);




/*******************************************************************************

* Function Name  : Standard_SetEndPointFeature

* Description    : 设置或使能端点的指定的特性

* Input          : None.

* Output         : None.

* Return         : 如果请求被执行,返回USB_SUCCESS,如果请求无效,则返回USB_UNSUPPORT

*******************************************************************************/

RESULT Standard_SetEndPointFeature(void);






/*******************************************************************************

* Function Name  : Standard_SetDeviceFeature.

* Description    : 设置或使能设备指定的特性

* Input          : None.

* Output         : None.

* Return         : 如果请求被执行,返回USB_SUCCESS,如果请求无效,则返回USB_UNSUPPORT

*******************************************************************************/

RESULT Standard_SetDeviceFeature(void);






/*******************************************************************************

* Function Name  : Standard_GetDescriptorData.

* Description    : Standard_GetDescriptorData用于描述符的传输.

*                : 这个函数用于驻留在flash或RAM里的描述符pDesc可以自相Flash或RAM

*                  这个函数的目的是具有不同的方式去响应描述符请求。

*                  它允许用户通过软件生成的某些描述符或则读取外部存储设备的描述符部分.

* Input          : Length - 这次传输的的数据长度

*                  pDesc  - 指向描述符结构体的指针

* Output         : None.

* Return         : 返回usb_wOffset指向的描述符部分的地址。这个地址指向的缓冲包含最起码Length个字节

*******************************************************************************/

uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc);




/*******************************************************************************

* Function Name  : DataStageOut.

* Description    : 数据阶段的控制写传输

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void DataStageOut(void);






/*******************************************************************************

* Function Name  : DataStageIn.

* Description    : 数据阶段的控制读传输

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void DataStageIn(void);






/*******************************************************************************

* Function Name  : NoData_Setup0.

* Description    : 处理没有数据阶段的建立请求

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void NoData_Setup0(void);






/*******************************************************************************

* Function Name  : Data_Setup0.

* Description    : 处理有数据阶段的建立请求

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void Data_Setup0(void);






/*******************************************************************************

* Function Name  : Setup0_Process

* Description    : 建立阶段的数据处理Get the device request data and dispatch to individual process.

* Input          : None.

* Output         : None.

* Return         : Post0_Process.

*******************************************************************************/

uint8_t Setup0_Process(void);






/*******************************************************************************

* Function Name  : In0_Process

* Description    : 处理默认端点的所有IN令牌包

* Input          : None.

* Output         : None.

* Return         : Post0_Process.

*******************************************************************************/

uint8_t In0_Process(void);




/*******************************************************************************

* Function Name  : Out0_Process

* Description    : 处理默认端点上的所有OUT令牌包

* Input          : None.

* Output         : None.

* Return         : Post0_Process.

*******************************************************************************/

uint8_t Out0_Process(void);






/*******************************************************************************

* Function Name  : Post0_Process

* Description    : 为防止错误,停止端点0Stall the Endpoint 0 in case of error.

* Input          : None.

* Output         : None.

* Return         : 如果控制状态是PAUSE,返回0;如果不是返回1

*******************************************************************************/

uint8_t Post0_Process(void);






/*******************************************************************************

* Function Name  : SetDeviceAddress.

* Description    : 设置设备和所有使用过的端点地址

* Input          : Val:设备地址

* Output         : None.

* Return         : None.

*******************************************************************************/

void SetDeviceAddress(uint8_t Val);






/*******************************************************************************

* Function Name  : NOP_Process

* Description    : 没有处理函数

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void NOP_Process(void);


这里简单地介绍几类函数。

首先要将的是关于USB特性(Feature)和状态的函数,这些函数包括:Standard_SetEndPointFeature();Standard_SetDeviceFeature;Standard_ClearFeature();Standard_GetStatus();这四个函数。

先讲讲 USB的Feature。对于USB的设备来说,特性就是否支持远程唤醒;如果是 对于USb的端点来说,端点是否有效(打开)就是端点的特性。

在 Standard_SetDeviceFeature函数中就是设置usb支持远程唤醒。

/*******************************************************************************

* Function Name  : Standard_SetDeviceFeature.

* Description    : 设置或使能设备指定的特性

* Input          : None.

* Output         : None.

* Return         : 如果请求被执行,返回USB_SUCCESS,如果请求无效,则返回USB_UNSUPPORT

*******************************************************************************/

RESULT Standard_SetDeviceFeature(void)

{

  SetBit(pInformation->Current_Feature, 5); //置位Current_Feature的D5,即支持远程唤醒

  pUser_Standard_Requests->User_SetDeviceFeature(); //调用User_SetDeviceFeature(),该函数在usb_prop.c中注册

  return USB_SUCCESS;

}



在 Standard_SetEndPointFeature()函数中就是停止(STALL)输入端点或则输出端点。

RESULT Standard_SetEndPointFeature(void)

{

  uint32_t    wIndex0;

  uint32_t    Related_Endpoint;

  uint32_t    rEP;

推荐阅读

史海拾趣

Easy Magnet Corp公司的发展小趣事

随着市场需求的不断变化,Easy Magnet Corp公司意识到,只有不断创新才能保持竞争优势。因此,公司加大了研发投入,不断推出具有创新性的产品。其中,一款集成了微型化、高性能和高稳定性的磁性传感器,因其独特的优势,在智能手机、平板电脑等电子产品中得到了广泛应用。这一技术突破不仅提升了公司的知名度,也为公司带来了可观的收益。

GSR Technology Ltd公司的发展小趣事

在电子行业的初期,GSR Technology Ltd专注于研发高性能的传感器技术,特别是针对工业自动化领域的GSR(Ground Surveillance Radar,地面监视雷达)技术。通过多年的技术积累和研发创新,公司成功开发出具有高精度、长距离监测能力的GSR系统,填补了市场空白。这一技术突破吸引了众多工业客户的关注,公司迅速获得市场准入,并与多家知名企业建立了长期合作关系。

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

在电子行业的初期,GSR Technology Ltd专注于研发高性能的传感器技术,特别是针对工业自动化领域的GSR(Ground Surveillance Radar,地面监视雷达)技术。通过多年的技术积累和研发创新,公司成功开发出具有高精度、长距离监测能力的GSR系统,填补了市场空白。这一技术突破吸引了众多工业客户的关注,公司迅速获得市场准入,并与多家知名企业建立了长期合作关系。

e2v technologies公司的发展小趣事

2016年,e2v被Teledyne Technologies公司收购,成为Teledyne e2v。这一合并不仅为e2v带来了更多的资源和支持,也为其开启了新的发展篇章。Teledyne e2v在继续保持其在图像传感器领域的领先地位的同时,也积极拓展新的市场和应用领域,为电子行业的发展贡献更多的力量。

地博电子(DIBO)公司的发展小趣事

为了满足不断增长的市场需求,地博电子在2017年创立了株洲地博光电材料有限公司,打造了第二智造基地。新基地的建设不仅进一步提高了公司的生产能力和研发水平,还为公司的长期发展提供了强有力的支持。在株洲地博高科技园一期建设完成后,地博电子的产能和品质都得到了显著提升。

Benchmarq Microelectronics Inc公司的发展小趣事

在国内市场取得一定成绩后,Benchmarq Microelectronics Inc开始积极拓展国际市场。公司积极参加国际电子展会和交流活动,与国际同行建立合作关系,将产品打入国际市场。同时,公司还加强品牌建设,提升品牌知名度和美誉度。通过广告宣传、媒体报道等多种方式,公司成功塑造了专业、可靠的品牌形象,赢得了客户的信任和认可。

问答坊 | AI 解惑

精密整流滤波电路图

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 我想要一个精密整流滤波电路图,其输入交流电压为0到4v.  …

查看全部问答>

基于LabVIEW的虚拟信号处理系统

基于LabVIEW的虚拟信号处理系统…

查看全部问答>

大家使用protel还是cadence?

大家在工作中硬件设计时是protel用的多还是cadence用的多啊?…

查看全部问答>

tornado2.2下可不可以进行操作符重载?

对一些简单的操作符进行重载,编译没有问题,下载时却提示错误。 有没有人遇到过这种情况??…

查看全部问答>

sja1000,ep9307,can通信驱动,连续接收4帧后,第5帧,经常丢失

os:wince5.0 cpu:ep9307 200MHz CAN:sja1000 ------------------------- 我现在用的是一块工控板,直接用的别人给的nk.bin,有can的驱动源码 我在wince里做应用,发现别人连续发送5帧的话,大部分情况下,只能接收到前4帧。 我做了个测试 ...…

查看全部问答>

连连看游戏能写入单片机吗?

连连看游戏能写入单片机吗? 还有一个50M的程序能写入单片机吗,单片机最大的程序空间最大为多少容量?    求助各位大虾…

查看全部问答>

请给我点建议,我的项目该如何计划

接到一个项目,主要功能是用串口接传感器,收发数据,进行数据管理这样一个软件。要求在PC和wince设备上运行。我没有做过CE的项目,不知道是应该做一个程序在2个环境都能正常运行好呢,还是分别各做一个。用VC还是C#好。请路过的朋友给点建议好吗, ...…

查看全部问答>

我似乎很迷茫啊 软件 ?硬件 ? 如何选择?

我很喜欢搞软件 又对硬件很痴迷 现在才刚起步 不知道自己到底往哪个方向发展  从小就喜欢做东西 现在对软件开发又爱不释手 最重要是 现在软件硬件都不是很好  也不晓得自己更偏向于哪个方面! 迷茫啊 ~~~各位给点建议,好不好?~~~ …

查看全部问答>

香水,ST有没有能跑wince的ARM呀?

                                 我看M系列都是总线不开放的芯片。那样的芯片跑CE几乎不可能的…

查看全部问答>

HELP 急急急

原来用的msp430f1232  换成msp430f2232后仿真器找不到单片机 电路和原来是一样的  难道是我的仿真器不支持2系列?我的仿真器版本是MSP-FETP430F1.3…

查看全部问答>