新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 2440裸机学习心得(下)

2440裸机学习心得(下)

作者: 时间:2016-11-29 来源:网络 收藏
NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。
NOR比较好操作,因为集成了系统地址线和数据线在芯片内,而NAND只有8个I/O,要操作,还需要结合相应硬件,如2440里有的NAND控制器。
14、基于OHCI的USB主机(仅做了枚举)
发现了一个很好的博客讲这个的:http://lancelot.blog.51cto.com/393579/328233
部分经典内容摘要:
在OHCI规范中,最重要的几个概念是端点(EndPoint - ED)、传输描述符(Transport Descriptor - TD)、主机控制器通信区(HCCA)。其中ED负责确定传输类型(控制传输、批量传输、同步传输和中断传输)。TD确定传输参数。HCCA用于确定数据传输是否完毕。
OHCI(基本流程)
进行控制/批量传输的主要处理流程如下:
1、创建控制/批量传输的ED列表;
2、创建ED下的TD列表;
3、设置命令到相应寄存器开始数据传输;
4、在中断处理程序中判断数据传输是否结束;
在OHCI层,主要完成如下功能:
l通过控制端口读写数据(包含SETUP、DATA、STATUS等3个TD);
l通过控制端口发送设置命令(没有DATA的TD);
l通过批量端口读数据;
l通过批量端口写数据;
l中断处理程序;
在OHCI的体系下,判断数据是否传输完毕是需要通过中断程序来判断的,当USB主机设置了HcControl和HcCommandStatus寄存器开始传输数据后,AM9200自动开始数据传输,并且定期的检查HcDoneHead寄存器的内容,并且将其转移到HCCA.DoneHead。然后产生中断,触发中断处理程序。
在中断处理程序中需要判断当前结束的TD是否是当前命令的最后一个TD,这样才能确保整个ED处理完毕。
进行U盘的数据传输时需要通过批量传输端口收发数据,所使用的协议为Mass Storage协议
要学习的一种数据结构与结构体结合应用的模式:
声明时:
typedef struct _ED {
…………
} ED,*P_ED;
__inline void CreateEd(unsigned int EDAddr,………….)
{
P_ED pED = (P_ED) EDAddr;//这个在函数中创建结构体pED来初始化
pED->Control =…………………….
}
调用时,因16字节对齐:
__align(16) EDed;(声明)
CreateEd(
(unsigned int) &ed,// ED Address
………….
);
简单的USB设备枚举,读取描述符:(控制传输步骤)
搞好最重要的3个数据结构:
端点描述符ED,传输描述符TD和共享数据域HCCA
由于HCCA只是创建一个空间域,不需要初始化
而ED和TD在设备枚举时需要不同初始化,故还要创建两个
初始化结构体函数:CreateEd和CreateGenTd
初始化OCHI寄存器(仅限枚举部分,不涉及中断)
复位,设置帧间隔,初始化HcDoneHead,设置HC为运行状态
写HCCA(开拓一片域)
检测是否有USB设备
设一定的时间检测,如for(i=0;i<100000;i++)
设备枚举的5个过程:第一步,主机得到设备描述符
第二步为设备分配地址
第三步,主机用新的地址再次获取设备描述符
第四步,主机读取设备全部配置描述符
第五步,主机发送SETUP数据包,用以设置配置,允许所有端点进入工作状态。
注意:控制写传输需要3个TD:第一个发送Setup包,第二个用于接收握手或零长度的数据包,第三个用于发送状态;
控制读传输需要4个TD:第一个发送Setup包,第二个用于接收数据,第三个用于发送一个零长度的数据包,,第四个用于接收状态
具体有两种方法判断TD是否传送完成:
中断法
初始化好中断寄存器rHcInterruptEnable |= (1<<1)|(1<<31);
rHcInterruptStatus |= (1<<1);
pISR_USBH = (int)USBH_interrupt;
rINTMSK = ~BIT_USBH;
当有TD完成时,便进入中断。
如何判断枚举过程中每一步是否最后一个TD完成呢?
可以通过TD创造函数中DelayInterrupt即DI变量设置来巧妙解决
当DI=0x7时,即使TD完成也不会进入中断的,故可以只在每一阶段最后的TD设为非0x7,其余的设为0x7,这样进入中断就代表是最后数据发送完成了
2、状态检测法:
可以通过rHcCommandStatus寄存器中第二位是否1来判断Controllistfilled。
当其为1时,表示还有TD在队列,没发送完成
为0时,表示无TD在队列,全部发送完
可以这样检测:while(rHcCommandStatus&&0x02)
{
Delay(50);
}
具体的UFI读写设备参考网上的吧(弄了很久,还没弄成功)
1、查询
2、读余量
3、读写扇区
好啦,到这里,算是结束了,开始带LINUX系统的真正学习啦,GO
一切都会有新的开始。。。。。。。。。。

上一页 1 2 3 下一页

关键词: 2440v裸机学

评论


技术专区

关闭