本文完整代码下载路径 github:simulate_i2c_e2
前言
教导不是灌注贯注,而是点燃火焰
入门学习咱就别瞎掰要多努力多刻苦,来点心动的不好吗👇👇👇👇
百万年薪还是梦吗? 国芯正处风口浪尖,驱动开发的春年难道要来了?
赶紧来篇鼓(you)励(pian)广大懵青大众多多青睐驱动开发,最近公司老大可是求贤若渴,无奈某聘一览心酸。
嵌入式驱动开发,通常在不同开发平台有不同的方向含义,现在主流为Linux驱动开发,为什么主流是Linux驱动开发就不多介绍了,还有的是RTOS(适时操作系统)、MCU单片机开发等等,BootLoader开发相对门槛高一些有机会再介绍。
驱动开发主要编程语言为C语言,没错,C语言。
运行在硬件上的操作系统,通过驱动程序管理硬件资源,驱动程序在不同的软件平台通常会不一样,比如Liunx上的驱动不能直接用在Windows或者IOS上,但是同样的硬件就算操作系统换了,但是对硬件的控制逻辑基本不会变。
正题
祖师爷(Linus Torvalds:Linux之父)说过“Talk is cheap. Show me the code”。
说太多没用,直接教大家怎么写一个Linux驱动,驱动的内容是:
Linux下实现模拟的I2C控制器和e2prom的访问:
a.不模拟总线协议
b.完整模拟I2C总线协议和器件
本文代码跟踪仓库:github:simulate_i2c_e2
之所以用模拟的呢,是为了免去实验平台的限制,我们可以在Linux PC上编译实验,也可以在虚拟机上,不需要真的有一个I2C控制器和e2prom。
I2C总线是嵌入式开发里面比较常见通信总线,e2pom是一种非易失性存储,也就是掉电不丢失,一般嵌入式产品会使用I2C+e2prom的组合实现基础的设备信息存储管理。比如在e2里面存储着设备信息,系统起来后从e2里面读取等。
这篇实现a题的内容,主要介绍软件,下一篇再通过b题来介绍总线。
环境装备
Linux环境x1,用于编码和实验,建议内核版本4.9以上,推荐选择deepin,不是一味推荐国产,而是可以直接安装QQ、微信等软件真的太香了 deepin主页
手指x10,用于快速码代码
脑子x1,用于。。。
构思
代码不能敲之过急,要显示构思清楚,尽然是Linux驱动开发,那就要搞清楚Linux驱动框架,主要有两点:
- “一切皆文件”,驱动将硬件抽象成文件,供app使用;
- Device & Driver,Linux将硬件设备抽象成软件层面的Device,软件驱动程序Driver通过name或者dts或者acpi和Device进行匹配,一个Device只能同时被一个Driver控制。
上面提到的dts和acpi先搁着不管,详细的Device和Driver怎么匹配的可以先大概了解下 Linux设备驱动——Platform设备与驱动match probe过程
充其量也就是C语言的函数接口调来调用,最后用字符串或值比较、匹配,两个的关键属性值一样就匹配命中,触发初始化。
那么我们这里的题目就谈到了I2C控制器和e2prom,有两个硬件设备就有两个Dev,一个Dev对应一个Drv:
- I2C控制器Dev & I2C控制器Drv
- e2prom Dev & e2prom Drv
忙碌了一周了,不摸鱼不打盹,要过周末去了。
=======================================
目录结构
打开一个终端(一般是快捷键ctl+shift+t),在系统主目录创建一个文件夹,这将会是我们编码的主目录。
#linux下mkdir是新建目录的意思,-p是如果该目录已存在不报错,目录不存在就创建
mkdir ~/workspace/gooohi/ -p
新建四个目录,分别是上面说的2个Dev和2个Dri开发目录,模块化鲜明一些,不会混。
#进到我们创建的目录里面
cd ~/workspace/gooohi/
#创建四个目录
mkdir simulate_i2cdev simulate_i2cdrv simulate_e2dev simulate_e2drv
编写主Makefile,这个主Makefile预期功能是遍历四个目录,编译成内核驱动模块。
Linux编写Makefile和代码首先要选一个编辑器,推荐使用vim编辑器,文本编辑器的选用这里就不多介绍了。
Linux下的几个基础命令和路径概念介绍: