目录
前言
我买了韦东山的 IMX6ULL pro 开发板,本文记录学习笔记、遇到的问题和技术总结等,文章内容随学习进度持续更新。
正点原子也有 IMX6ULL 开发板,但韦东山除了LInux外还有 HarmonyOS 的教学资源。
韦东山的教学视频驱动部分是收费的,一千多,而且视频还没更新完,正点原子课程完全免费且已经比较完整。所以学习驱动时看正点原子的课,在韦东山的开发板上开发,两家因为芯片一样,所以代码都互通。
第一章 搭建开发环境
一、配置静态IP
192.168.5.9 - 开发板IP
192.168.5.10 - 笔记本主机IP
192.168.5.11 - Ubuntu IP
二、搭建开发环境
1.挂载NFS,方便传输文件
2.配置交叉编译工具链,在~/.bashrc
中添加工具链绝对路径,执行source ~/.bashrc
使配置生效
三、构建Linux系统
我们需要把定制好的Linux系统移植到开发板上,Linux平台上有很多开源的Linux系统构建框架,他们的作用是编译出文件系统、uboot、系统镜像等,比如Buildroot、OpenWrt、yocto等,本文使用Buildroot进行编译。
1.编译完整系统
同时编译bootloader 、rootfs、Uboot并生成整体的系统镜像
(1)选择要用的congfig文件make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
(2)用图形界面对即将要编译的系统作配置make menuconfig
(3) make all
第二章 IMX6ULL的驱动开发
一、三种Linux驱动
- 字符设备驱动。按照字符读写,传输不定长数据的设备,GPIO、IIC、SPI、USB
- 块设备驱动。以固定大小的长度传输数据,SD卡、TF卡驱动、EMMC、
- 网络设备驱动。网卡、WiFi
二、GPIO引脚操作方法
1.使能GPIO引脚
使用时钟控制模块(CCM),使能GPIO引脚,使得这个引脚可以操作。看原理图(下图),得知LED2所用引脚为GPIO5_3。
看芯片手册 《IMX6ULLRM.pdf》第18章(635页)
,如下图。得知要想使能GPIO5, 就需要操作寄存器CCGR1的CG15位
如下两张图所示,要使能时钟,只要将对应位设置成11就行,但CCGR1的CG15是reserve保留位,所以默认使能,不用设置就能用。
2.设置GPIO模式
根据芯片手册,一个GPIO引脚也许可以用于不同的模式,比如GPIO、IIC、SPI等,要选择GPIO工作于哪种模式。
根据LED2的原理图,GPIO5_3
在芯片手册中海油另一个名字 SNVS_TAMPER3
.找到第32章IOMUX
,他的作用就是设置引脚的工作模式。
如下图,只要将该寄存器的 低4位设成 0x05 即可。
3.设置方向寄存器DIR
将GPIO引脚设置成input/output
- 设置成input,则引脚可以写数据
- 设置成output,则引脚可以读
找到芯片手册第28章,看GPIO的 memory Map, 可以看到GPIO5的方向寄存器和数据寄存器。写0表示设成 input,写1表示设成 output
4.设置数据寄存器 DAT
- 当第3步设成 input 时,写DAT寄存器
- 当第3步设成 output 时,读DAT寄存器
根据LED原理图,写0则电路导通,LED亮
三、驱动程序读取设备树节点信息
#include <linux/of.h> //如果不包含该头文件,会提示隐式声明函数的错误
/*读取指定的节点,参数path必须以根节点 "/" 开头。
*rg.参数为“/memory”,表示读取设备树根节点下的memory节点
*/
struct device_node *of_find_node_by_path(const char *path);
/*读取指定设备树节点的数组
* np:上一个函数读到的设备树节点
* propname:节点中的数组名称
* out_values:读到的数据保存在out_values 数组中
* sz:要读多少个数组元素*/
int of_property_read_u32_array(const struct device_node *np, const char *propname,
u32 *out_values, size_t sz);
四、编写驱动注意事项
- 内核中不能用 printf 打印,否则会报类似如下的错误,只能用prink。在串口上如果看不到printk打印信息,执行shell命令
dmesg
。
警告: 隐式声明与内建函数‘printf’不兼容
二、分析源码
芯片出厂时原厂都会提供自己自己的Linux源码包,IMX6ULL给出的是内核为Linux-4.9.88
的源码,客户 (比如正点原子、韦东山就是芯片原厂的客户) 在实际开发时基于这个源码包开发自己想要的功能,最终得到的就是SDK。
如下图,买到开发板以后商家在自己的SDK里也提供了芯片源码包供我们开发。