基于宋宝华《Linux设备驱动开发详解-基于最新的Linux4.0内核》。
驱动工程师必须按照相应的架构设计驱动。
操作系统 | 驱动特点 |
---|---|
无 | 每一种设备驱动都会定义一个软件模块,包含.h文件和.c文件. .h文件 - 定义该设备驱动的数据结构并声明外部函数。 .c文件 - 进行驱动的具体实现。 |
有 | 需要将驱动融入内核。 设计面向操作系统内核的接口,该接口有操作系统规定。 |
操作系统的作用: 多任务并发;提供内存管理机制(让每个进程都可以独立的访问4GB的内存空间)。
操作系统通过给驱动制造麻烦来达到给上层应用提供便利的目的。
Linux驱动针对的对象是存储器和外设,分为3个基础大类:
Linux设备驱动需要的基础:硬件基础、c语言基础、Linux内核基础、多任务并发控制和同步基础。
有效的帮助文档:Linux内核源代码中包含的Documention目录。
Linux源代码阅读交叉索引:
NOR Flash的特点是 可芯片内执行(eXecute In Place, XIP),程序可以直接在NOR内运行。
NAND Flash以块方式进行访问,不支持芯片内执行。
DRAM以电荷形式进行存储,数据存储在电容器中,由于电容器会因漏电而出现电荷丢失,所以DRAM器件需要定期刷新。
与SDRAM相比,DDR SDRAM同时利用了时钟脉冲的上升沿和下降沿传输数据,因此,在时钟频率不变的情况下,数据传输频率加倍。
USB传输速度:
USB 2.0的bulk模式只支持1个数据流。
USB 3.0增加的Bulk Streams模式,可以支持多个数据流,每个数据流被分配一个Stream ID(SID),每个SID与一个主机缓冲区对应。
以太网MAC和PHY之间采用MII(媒体独立接口)连接。
以太网隔离变压器是处于以太网PHY与连接器之间的磁性组件,作用:信号传输,阻抗匹配,波形修复,信号杂波抑制,高电压隔离。
SD/SDIO的传输模式:
CPLD由完全可编程的与或门阵列以及宏单元构成。“与或”阵列完成组合逻辑功能,触发器完成时序逻辑功能。
FPGA基于LUT(查找表)工艺。查找表本质上是一片RAM。
芯片手册阅读:
Linux内核是一个演变而不是一个设计。一直朝着3个方向发展:
Linux 2.6以后,总线、设备、驱动三者之间因为一定的联系性而实现对设备的控制。
Linux 2.6以后,内核模块从.o变为.ko。
Linux内核源代码:
内核一般要做到drivers与arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时,内核的通用部分(如kernel,fs,ipc,net等)则与具体的硬件(arch和drivers)剥离。
Linux内核的组成:
绝大多数进程(以及进程中的多个进程)是由用户空间的应用创建的。
内核空间和用户空间的具体界限是可以调整的,在内核配置选项Kernel Features—>Memory split,可以设置界限为2GB或者3GB。
Linux内核的内存管理底层的Buddy算法,用于管理每个页的占用情况,内核空间的slab以及用户空间的C库的二次管理。
Kswapd(交换进程)是Linux中用于页面回收的内核线程,采用最近最少使用(LRU)算法进行内存回收。
在Linux中网络接口可分为网络协议和网络驱动程序。
ARM处理器的7种工作模式:
在AutoCAD中进行设计丝印,然后在AI中打开。
环境:
dwg (viewres,2000) -> 输出wmf -> ai
文件,输出,图源文件,选中地址,确定,鼠标会变成框的形式,选中你要转的图,回车或是空格。
使用Viewres命令重生成一下文件,让线条圆滑。
AutoCAD默认的精度是1000,范围值是1-20000。
精度太小线条不够圆滑,精度太高,生成的曲线导入CDR或AI后会不连续,一个封闭的曲线会被分割成几段,重新使它们成为可用的封闭的曲线会花很多时间。
经过试验,精度设置成2000,生成的曲线不仅封闭的,而且也足够圆滑。
在Adobe Illustrator中就可以打开ai文件了。
注意:如果是字体,需要检查,可能需要精细调节和编辑。
Excel文件格式:xls或xlsx
检查的文件:a.xlsx
删除行后生成的新文件名:anew.xls
删除条件:第二列中值不是“OK”
删除行:不符合条件的所有行
https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas-bsp.git/
最近,做了一批板子,不像以前的板子一样,工作不正常。
花了将近5个工作日,终于把问题原因找到了:就是这个RC电路造成的。
如下图所示的电容滤波电路,在应用中很常见。
如果电容值选择不合适,会导致问题比较麻烦,特别是系统中还使用了看门狗电路。
下图是使用的系统构成框图。
有三部分:MCU电路,看门狗,模块。
MCU的复位由硬件看门狗提供。
看门狗的喂狗由MCU来完成。
模块的电源由MCU的一个IO口控制,缺省不上电。电路中电阻R0用于给电容提供放电回路。另外,模块的供电电源电路是厂家推荐电路。
基本工作流程: MCU工作后,初始化IO口,然后根据需要设置IO口,打开MOS管,给模块供电。同时,喂狗。
使用中,发现部分板子能够正常工作,大部分板子不能正常工作,用示波器检查看门狗的输出,发现:周期性的输出复位信号,但是该周期又不是看门狗芯片手册中的周期信号,其周期比不喂狗的周期短很多。
上电后,MCU工作。当打开MOS管给模块供电时,瞬时先对电容充电,充满到模块的正常工作的阈值后,模块可以工作。
但是,这个瞬时充电会导致3V3的供电电压有个波动。
由于看门狗的检测电压阈值是2.93V,当这个波动使得3V3跌落至2.93V以下时,看门狗就会输出复位信号,复位MCU。
然后,MCU有重复上面的过程,打开MOS管供电。。。
。。。
看门狗周期输出复位信号。
模块被周期上电。
。。。
减小电容的值(4.7uF -> 0.1uF),从而减少波动,即减小电源电压跌落的幅度。
使得电源跌落幅度维持在看门狗检测的阈值(2.93V)以上,这样,看门狗就不会输出复位,从而保证MCU正常工作了。
以前用同样大小的电容(4.7uF)从来没有发现问题,为什么这批板子就出问题呢?
回头再仔细考虑这个问题,发现并不简单,还有更深层的原因:采购。
这批板子采用的是新购买的电容,从淘宝上购买的,当时也没有要求精度。
测量后发现其值大概是5.9uF左右,与设计的4.7uF(原来是用的大厂的料)差距还是不小的。而原来采用的电容值还是比较靠谱的。
同时,也说明了一个问题:原来设计的4.7uF使系统工作在一个临界状态。
以下两点需要注意:
采购物料时,一定要从大厂采购,同时标明精度,如%1。
设计系统时,一定要留有余量,不要让系统工作在一个临界状态。虽然这种临界状态不好获知。就像电影《疯狂的石头》中,那个来自国外的“高手”在中国购买的登山绳长度就没有考虑余量,所以被坑了。