mianmian驱动

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值