题记:
虽有嘉肴,弗食,不知其旨也;虽有至道,弗学,不知其善也。是故学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也。故曰:教学想长也。《兑命》曰:“学学半。”其次之谓乎。
我们的文化真是博大精深,短短的几句话,精准地描述了教与学之间的关系。学学半——教人也是学习的一半。
读研的时候,带本科生的实验课,面对千奇百怪的提问,可以深刻的感受到自己的不足——不能够讲解地让别人理解,就说明自己的理解不够透彻,做不到庖丁解牛。
在写博文的时候,也有这种感觉,想要负责任地写出一篇文章,不仅仅要在技术上说服自己,还要思考用什么样的方式才能让读者更快更好地明白自己要说的东西,文章难写啊……
闲话休提,书归正传。
1 在Vivado中添加axi-gpio IP核,并挂载到axi-lite总线上
添加IP核后,可以利用指令自动完成axi-lite接口的连接。这里我把自动生成的时钟和复位信号发生模块删除了,保留着应该也没有影响。
在关闭Vivado之前,记得查看一下IP的物理地址,或者在SDK中查看。后面修改dts文件的时候会用到。
2 制作BOOT.bin文件
这里也不用多说,网上教程也很多。
3 编写驱动并编译生成*.ko文件
这里给出代码,编译方法参考上一篇博文
4 修改dts文件,将设备信息添加至设备树
reg = <0x41200000 0x1000>;里面的两个参数分别对应axi_gpio的物理地址和寄存器空间大小
还有一个坑:
两个compatible属性的内容,是设备和驱动注册的关键,匹配时利用该字段进行对比。具体如何进行匹配,后续再深入剖析。
5 生成dtb文件
6 启动系统,加载驱动
以上两步,可以参考之前的博文,这里不再重复。
7 输入指令,操作led
实际上这是Digilent提供的教程,做完之后,是一头雾水,根本不明白到底怎么回事,稀里糊涂地就可以操作led了。
当时想的问题有:
i) 在学习最简单的Linux驱动时,有module_init()和module_exit()函数,在加载和卸载驱动时会被调用,为什么这里没有?
ii) 这个好像和一般的设备驱动不太一样,什么是platform driver?
iii) 搜索了一下platform driver,更加迷糊了,不过platform driver和普通的设备驱动是有区别的,既然开始了,就先研究platform driver吧。
文章评论(0条评论)
登录后参与讨论