IMX6ULL 学习笔记(持续更新)

目录

  • 前言
  • 第一章 搭建开发环境
    • 一、配置静态IP
    • 二、搭建开发环境
    • 三、构建Linux系统
      • 1.编译完整系统
  • 第二章 IMX6ULL的驱动开发
    • 一、三种Linux驱动
    • 二、GPIO引脚操作方法
      • 1.使能GPIO引脚
      • 2.设置GPIO模式
      • 3.设置方向寄存器DIR
      • 4.设置数据寄存器 DAT
    • 三、驱动程序读取设备树节点信息
    • 四、编写驱动注意事项
    • 二、分析源码
  • 二、其他

前言

      我买了韦东山的 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驱动

  1. 字符设备驱动。按照字符读写,传输不定长数据的设备,GPIO、IIC、SPI、USB
  2. 块设备驱动。以固定大小的长度传输数据,SD卡、TF卡驱动、EMMC、
  3. 网络设备驱动。网卡、WiFi

二、GPIO引脚操作方法

1.使能GPIO引脚

使用时钟控制模块(CCM),使能GPIO引脚,使得这个引脚可以操作。看原理图(下图),得知LED2所用引脚为GPIO5_3。
IMX6ULL 学习笔记(持续更新)_第1张图片

看芯片手册 《IMX6ULLRM.pdf》第18章(635页) ,如下图。得知要想使能GPIO5, 就需要操作寄存器CCGR1的CG15位
IMX6ULL 学习笔记(持续更新)_第2张图片
如下两张图所示,要使能时钟,只要将对应位设置成11就行,但CCGR1的CG15是reserve保留位,所以默认使能,不用设置就能用。
IMX6ULL 学习笔记(持续更新)_第3张图片IMX6ULL 学习笔记(持续更新)_第4张图片

2.设置GPIO模式

        根据芯片手册,一个GPIO引脚也许可以用于不同的模式,比如GPIO、IIC、SPI等,要选择GPIO工作于哪种模式。
        根据LED2的原理图,GPIO5_3在芯片手册中海油另一个名字 SNVS_TAMPER3.找到第32章IOMUX,他的作用就是设置引脚的工作模式。
        如下图,只要将该寄存器的 低4位设成 0x05 即可。
IMX6ULL 学习笔记(持续更新)_第5张图片

3.设置方向寄存器DIR

将GPIO引脚设置成input/output

  • 设置成input,则引脚可以写数据
  • 设置成output,则引脚可以读

找到芯片手册第28章,看GPIO的 memory Map, 可以看到GPIO5的方向寄存器和数据寄存器。写0表示设成 input,写1表示设成 output
在这里插入图片描述
IMX6ULL 学习笔记(持续更新)_第6张图片

4.设置数据寄存器 DAT

  • 当第3步设成 input 时,写DAT寄存器
  • 当第3步设成 output 时,读DAT寄存器

根据LED原理图,写0则电路导通,LED亮

三、驱动程序读取设备树节点信息


#include  //如果不包含该头文件,会提示隐式声明函数的错误

/*读取指定的节点,参数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);

四、编写驱动注意事项

  1. 内核中不能用 printf 打印,否则会报类似如下的错误,只能用prink。在串口上如果看不到printk打印信息,执行shell命令 dmesg
	警告: 隐式声明与内建函数‘printf’不兼容

二、分析源码

      芯片出厂时原厂都会提供自己自己的Linux源码包,IMX6ULL给出的是内核为Linux-4.9.88的源码,客户 (比如正点原子、韦东山就是芯片原厂的客户) 在实际开发时基于这个源码包开发自己想要的功能,最终得到的就是SDK。

如下图,买到开发板以后商家在自己的SDK里也提供了芯片源码包供我们开发。
IMX6ULL 学习笔记(持续更新)_第7张图片

二、其他

你可能感兴趣的:(笔记,单片机,stm32,物联网)