LED,时钟,IIC,misc,nand,sd,input,framebuffer。
1.会根据原理图,数据手册,流程图写出裸机代码。参考1
用户空间和内核空间的交互:1.系统调用(例如字符设备驱动file_operations) 2.文件系统(proc,sysfs,debugfs)3.netlink(udev,也就是热插拔) 4.共享内存(我没懂,要再看看)5.copy_from_user,copy_to_user
2.怎么写一个驱动?
比较固定的模式,搭一个init,exit的框架
init中去register申请主次设备号,cdev_init(&test_cdev, &test_fops);
int ret = cdev_add(&test_cdev, mydev, MYCOUNT),加入到内核链表上。
driver_add
添加设备类的操作,class_create和device_create以让内核帮我们发消息给udev,让udev自动创建和删除设备文件。
/dev目录下应用层通过open,read,write函数和驱动层交互,核心是fops。
/sys目录下应用层通过attibutes和驱动层交互。
参考1
nand
write 80h(命令)->write address->write data->write 10h->根据状态寄存器判断数据是否写成功(将页数据写到接口电路缓冲区,接口电路将数据从缓冲区写到真正的存储系统中需要时间(soc不断读取状态寄存器))->ECC
mmc裸机
状态机和命令
1.通过gpio设置位sd卡工作模式
2.设置上拉
3.设置控制器clk(96M 分频为48M),先设置sd时钟(400K),后面识别sd卡后再给合适的时钟
4.sd卡控制器的一些设置,比如清中断
5.检查数据线是否准备好发送cmd0(复位所有mmc卡到空闲状态),查看response
6.cmd8查看是否有响应,没有就是卡的版本太低,或者没卡,不识别的卡,sd卡电压不对
7.acmd41=cmd55+cmd41 acmd41有回复OCR寄存器就是sd卡,acmd41没回复就是mmc卡。根据OCR查看sd卡是否上电完成。
8.cmd2,读出卡的cid寄存器和cmd3,读出rca寄存器,读出卡的相对地址,使卡进入stand-by状态。
9. 发cmd7使卡进入transfer状态
10.cmd16设置块大小,
11.获取csd相关信息,block大小,卡的容量
11.根据sd的版本重新设置时钟
12.清中断,cmd24 cmd25读写,此时sd卡变为programming状态,等写完成,转换为transfer状态
MSYS:cpu(1G),ddr(200M)
DSYS: 视频,编解码
PSYS:内部外设,串口,sd接口,I2c,(前面30-40M)usb