做应用和驱动没有绝对界限,掌握应用的人在学驱动你会觉得做产品更踏实,做驱动的人在学应用你能带领项目团队,所以学驱动只是让你学的知识更扎实。
C语言
重点掌握的下面知识点
- 数组
- 函数
- 指针
视频看B站郝斌
数据结构
重点掌握下面知识点
-链表
-队列
视频看B站郝斌
shell
重点掌握语法:
- sed, tr, awk三剑客的用法
- if,for,switch,while条件判断循环使用用法
- 正则表达式
- 特殊符号的用法
视频看b站
Makefile
看韦东山第三期的数码相框中通用Makefile文件,看懂就好。不要求会写。但要求掌握以下两点:
-bluez,bluealsa等开源项目要求自己会用autotools和automake生成makefile进行编译
-内核里添加一个驱动文件,编译进内核知道如何修改Makefile。
文件IO
需要掌握的知识点
1、掌握Linux文件IO的一套系统调用API:open、read、write、ioctl,close等。
2、熟练写出文件拷贝等功能模块。
3、理解I/O、缓冲的概念。
在Linux下,一切皆文件,学习文件IO是为了后面学习编写简单的驱动测试(操作打开控制字符设备、套接字、文件等)程序会用到。所以要想知道如何操作文件和外设,我们就必须熟练掌握文件IO,这是我们学习Linux下面编程最基本的知识点。
这里建议看看博客如何写出文件拷贝等功能的文章或者朱老师的视频,再去独立自己写。
后面的阶段学习需要开发板配套练习,所以资料就显得固然重要。建议买imx6ull的板子
虽然这个芯片不是最先进但是也是性价比好点
ARM裸机开发
掌握知识点
- arm架构、arm的模式、arm指令,寻址,异常,中断,异常向量表,
- 学会查看常见电路图,了解数据线、信号线、地址线、中断线,常见外设电路图
- 学会查看CPU芯片的用户手册
- 常见的外设的裸机驱动开发,led、key、adc、pwm、看门狗、i2c、spi、网卡、flash等
没基础可以看正点原子,朱有鹏,有基础可以看韦东山
Linux驱动开发
- 字符设备驱动概念inode、cdev、file_operations、file之间关系,理解里面的字符框架的OOP思想
- platform总线和设备树的关系;
- 同步互斥机制,自旋锁、信号量、原子操作;
- 按键的中断,等待队列,poll的实现;
- 其他复杂驱动等工作中用到再去学习。
- 调试技巧如:printk,gdb,addr2line,kdump,栈回溯,反汇编(具体可以看韦东山第二期视频调试部分)
对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
① LED驱动程序:
这是最简单的驱动程序。
② 按键驱动程序:
它也比较简单,从它引入“中断”。
③ 中断:
从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。
所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。
入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。
摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。
没基础可以看正点原子,朱有鹏,有基础可以看韦东山
系统移植
掌握知识点
- uboot的env设置
- uboot启动流程
- 用busybox或者buildroot制作根文件系统
- 内核的配置剪裁。
- 常用的驱动移植(如网卡,wifi),
- linux启动流程
- 自己添加uboot命令
能够学到这个阶段,那么恭喜你,你可以称为一名真正合格的Linux驱动工程师了。
如果后面还想深入某一个驱动,可以购买韦东山的驱动大全某个驱动专题。
驱动和内核紧密联系,所以深入驱动避免不了接触内核子系统,所以各位还想更深入的学习Linux内核各个子系统,像内存子系统,调度子系统,网络子系统,中断子系统,进程管理等的推荐笨叔叔的奔跑吧Linux,王利涛的嵌入式自我养成的教程
有一些面试题的文档存在百度网盘里
链接:https://pan.baidu.com/s/1lF4ID24OJJZAsfZhXYUCDQ
提取码:a5sv
有一些底层可以看的书籍存在百度网盘里
链接:https://pan.baidu.com/s/1QecLGRkBVVtUD5Bshf9Zsg
提取码:3wgz