2440裸机学习心得(下)
的数据复制到SRAM的程序
看看这函数,了解一下就行了
附加:nandflash、norflash、SDRAM的区别:
ROM在系统停止供电的时候仍然可以保持数据,
RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。
SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲
动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。
RAM |
SRAM |
DRAM |
SDRAM,DDR RAM等 |
ROM |
EROM,E2PROM等 |
NANDFLASH、NORFALSH等 |
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
2440v裸机学 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)