首页 Linux驱动学习笔记2
文章
取消

Linux驱动学习笔记2

一、Firefly Linux SDK开发

官方提供Linux开发的整套SDK。

1. 使用repo工具更新SDK

repo是Google开发的用于管理Android版本库的一个工具,使用Python对git进行了一定的封装。

1
2
3
.repo/repo/repo sync -l
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all

2. SDK目录

3. 配置

1
./build.sh aio-3399-jd4-ubuntu.mk

aio-3399-jd4-ubuntu.mk为编译生成Buildroot固件的配置文件(使用export指向外部配置文件):

1
2
3
4
export RK_UBOOT_DEFCONFIG=firefly-rk3399 # 编译uboot配置文件
export LINUX_KERNEL_DEFCONFI=firefly_linux_defconfig # 编译kernel配置文件
export RK_KERNEL_DTS=rk3399-firefly-aiojd4 # 编译kernel用到的dts(设备树)
export RK_PARAMETER=parameter-ubuntu.txt # 分区信息,GPT表

4. 编译各个组件为Buildroot固件的组件

通常一个嵌入式设备上运行的软件包括bootloaderlinux内核和rootfs,各个部分可以独立去开发,在使用的时候分别去交叉编译,烧写这些软件组件。buildroot工具提供了一种更加高效的管理方法,它把bootloaderlinux内核和rootfs集成在一起,可以非常方便的去定制、管理、编译和组装一个自己需要的软件系统,仅需通过配置(menuconfiggconfigxconfig)即可。

5. 固件打包

uboot.img(引导程序镜像)、boot.img(内核+设备树镜像)、rootfs.img(根文件系统镜像)、parameter.txt(配置信息)打包到固件里。

1
./build.sh updateimg

6. 难点:配置分区表parameter-ubuntu.txt

FIRMWARE_VER: 8.1
MACHINE_MODEL: RK3399
MACHINE_ID: 007
MANUFACTURER: RK3399
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3399
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x00020000@0x0003a000(oem),0x00700000@0x0005a000(rootfs),-@0x0075a000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
  • 0x00002000@0x00004000(uboot)指定uboot程序的分区大小0x00002000和分区起始地址0x00004000
  • boot分区包含内核和设备树信息。

U-Boot是一个主要用于嵌入式系统的 BootLoader引导加载程序,支持包括ARMx86的计算机系统结构,自由软件协议是GNU。主要用于开机时将内核加载到内存中,启动操作系统。

二、GPIO驱动开发

1. 设备树DTS概念

  • 设备树(dt, device tree):在系统引导启动阶段进行设备初始化的时候,将设备树中描述的硬件信息传递给操作系统。
  • dts(device tree source):设备树源文件,描述设备信息的。
  • dtc(device tree compiler):设备树编译/反编译/调试工具。
  • dtb(device tree binary):二进制设备树镜像
  • dtsi(device tree source include):类似设备树文件的头文件,可被dts文件通过include引用,dtsi文件一般是描述硬件共性部分。
  • 设备驱动源码 = 驱动代码(操作方法) + 设备代码(描述硬件资源和数据)。
  • 驱动代码和设备代码匹配时,驱动代码的probe函数会被调用去解析设备代码
  • 硬件资源信息写在dts文件中,不必在修改内核源码。
  • 内核要增加解析dts文件格式的代码。

设备树运作框架:

2. GPIO驱动

配置GPIO硬件和解析:

probe()用于解析硬件设备,自己还得编写GPIOfile_operations结构体、open()read()write(),然后在入口函数中将结构体注册到内核。