注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动学习——USB驱动(七)之USB鼠标(3)  

2011-01-18 10:34:12|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接昨天上文,先简短说一下D12的中断过程,当D12完成一个操作后,就会产生中断请求信号,以通知CPU进行相关的处理,导致中断发生的事件有:总线复位,D12进行挂起,成功接发数据等。这次实验采用的是时钟轮询查询引脚电平状态来达到实验目的的,也可以采用中断方式。
在D12的文档中我们可以看到端点端点0是控制输入输出,我们D12目前做为从机使用,也就是说,主机检测到D12后,会自动向控制端点发送一系列的命令,这时,就需要我们从端点0中读取一系列的数据了。
首先,我们要使用一个端点选择的命令,好让D12明白要读取哪个端点的数据。
 void D12SelectEndpoint(uint8 Endp)
 {

  D12WriteCommand(0x00 + Endp);
 }

函数内的函数数D12WriteCommand(0x00 + Endp),我们上面介绍的非常清楚,好,我们发现实际写入的是端点号,查D12的文档发现,从0x00~0x05代表着端点0~3的输出和输入,也就是说0x00代表着控制输出, 0x01代表控制输入(在模式0下,控制输入和输出的端点正是端点0,OK,要多看D12的文档),以下依次类推。然后我们就可以读取端点的数据了。
D12ReadEndpointBuffer(uint8 Endp,uint8 Len,uint8 *Buf),函数里调用了读缓冲区的命令字D12_READ_BUFFER,这个值用宏定义成了0xF0,根据读命令的格式,第一个字节保留,第二个字节为接收长度,第三个字节开始,才是实际数据的长度,这里有一个规定,如果读取的LEN比实际的小,则读LEN长度,否则只读实际的接收的数据长度。本函数有一个返回值,代表着实际读到的数据长度。
所以看这个函数的第一个D12ReadByte没有用到,直接再读一次j = D12ReadByte(),然后下面自然是判断LEN,然后FOR循环来使用D12ReadByte()中的D12GetData()来读取实际长度

的数据。这个缓冲区的大小我查了下,0xF0允许一次最大读130个字节。(写也是这个数),OK,这样数据就接收完成了。
我们知道,一般中断机制要求在使用完成一个中断后要清除状态标志和缓冲区,以可以再次进入中断并使用缓冲区。好的,我们就开始做这件事儿,函数D12ClearBuffer(void)调用D12WriteCommand(D12_CLEAR_BUFFER)来完成这个动作,#define D12_CLEAR_BUFFER    0xF2,这个命令可以把缓冲区的数据清空。用D12上的话:当一个信息包完全接收之后内部端点缓冲区满标志置位所有后续的包将被返回的NAK 拒绝当微控制器已读取数据它应当通过清缓冲区命令来释放缓冲区当缓冲区清空之后新的信息包就可被接受了。
当然,对SETUP包,控制端点需要再做一个特殊的动作,才会使清除和有效缓冲区生效,那就是Acknowledge Setup;这是为了保障控制传输建立的过程的数据不会丢失,并且也不会返回有错误的数据。直到处理完成这个建立过程,并发送Acknowledge Setup命令駈,才能清空(Clear Buffer)和使能(Validate Buffer)缓冲区。前者针对输出端,后者针对输入端。
下面我们清中断标志位,前面的书中讲过,清除端点中断标志要使用读最后传输状态命令(read last transaction status register),这里我们使用一个函数D12ReadEndpointLastStatus(0);各端点的中断标志位在此命令执行后被清零,另外两位(6,7)在读取本寄存器后被自动清零。我们的程序里用这个返回值和0x20与,从尔看第5位是否为1,来判断是否为建立包,分别来处理不同的情况,即建立包要多一个ACK的命令,否则直接清空。
ACK的函数是void D12AcknowledageSetup(void),这个函数我们得稍微提一下,他是分两种情况来进行下发的,即端点0有输入和输出两种形式,我们一并处理了就是了。一般我们是先读取端点数据然后再清除之,因为可能选择端点会重复,所以具体的代码里只使用一次就可以了,但一定要对应清楚。别弄糊涂了。OK,今天就记到这儿,下午开始USB的标准请求。

  评论这张
 
阅读(812)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017