驱动移植【简略版】
一、RTC时钟
测试一下看看能不能用就行
二、LED指示灯驱动
1.在设备树找到LED的节点,改对应的引脚,
2.还需要注意引脚的复用引脚有没有被其它东西占用,可以通过NXP官方提供的cofingue tool软件去查看,注释掉就行
三、RJGT102加密芯片驱动
1.rjgt102.tar.gz.temp文件拉进去虚拟机,在虚拟机下改名为rjgt102.tar.gz为压缩包文件。
2.cd 到 /home/hugo/Demo
目录下
把rjgt102.tar.gz拷贝到 /home/hugo/Demo
目录下
cd /home/hugo/Demo
3.在工作目录解压rjgt102.tar文件
hugo@hugo-virtual-machine:~/Demo$ tar -xvf rjgt102.tar.gz
4.修改i2c.c里面对应i2c节点:
根据原理图,看加密芯片接在I2C总线哪个编号,修改i2c.c里面对应i2c节点。(在原理图中,是I2C1,但是在代码中是I2C0,从0开始算起的)
5.修改Makefile交叉编译路径,按照自己实际情况去修改。
我这里的有一个环境变量配置文件,已经包括了交叉编译器所在的路径,我在编译文件前,都会先激活这个环境变量配置文件,让它生效,所以我这里的Makefile不需要配置完整的CC交叉编译器路径。
5.1 (我的环境变量配置文件路径:)
5.2 修改后的Makeifile文件
- (只是回顾:可以看交叉编译2 )
# 源文件与目标定义
src = $(wildcard ./*.c)
object = $(patsubst %.c,%.o,$(src))
target = rjgt102# 交叉编译器配置(直接从环境变量中引用)
CC = aarch64-poky-linux-gcc# 目标系统根目录
SDKTARGETSYSROOT = /home/hugo/SDK/sysroots/aarch64-poky-linux# 编译选项
CFLAGS = -O2 -pipe -g -feliminate-unused-debug-types \-mcpu=cortex-a53+crc+crypto \-fstack-protector-strong \--sysroot=$(SDKTARGETSYSROOT) \-isystem $(SDKTARGETSYSROOT)/usr/include$(target): $(object)$(CC) -o $@ $^ $(CFLAGS)%.o: %.c$(CC) -o $@ -c $< $(CFLAGS).PHONY: clean
clean:rm -f $(target) $(object)
6. 编译
使能交叉编译工具链的环境变量:
source /home/hugo/SDK/environment-setup-aarch64-poky-linux
清理再编译:
make clean && make
结果:
6.1 如果报错,手动验证有没有头文件能不能找到:
# 检查 string.h 是否存在
ls $(SDKTARGETSYSROOT)/usr/include/string.h # 应存在
# 检查编译器是否能找到该头文件
echo '#include <string.h>' | aarch64-poky-linux-gcc -E -xc - --sysroot=$(SDKTARGETSYSROOT) -isystem $(SDKTARGETSYSROOT)/usr/include
# 若无报错,则配置成功
7. 加密芯片执行
四、硬件看门狗
1.看原理图
2.通过在设备树注册的方式,看看SET0 \ SET1 \SET2 接的GPIO引脚 对应的编号是多少
1.给对应的GPIO口进行注册
2.重新编译生成设备树dtb,在开发板上使用命令查看GPIO引脚对应的编号。
命令:
# 查看GPIO映射(需要内核启用DEBUG_FS)
cat /sys/kernel/debug/gpio
输出中会显示所有已注册的GPIO。
找到gpiochip3
(对应GPIO4)的基地址,然后找到了我们自己在设备树给GPIO4_1 / GPIO4_0 / GPIO4_21配置的节点名字(set0 set1 set2 下面图是旧图是user-set2,不要紧),然后看到GPIO引脚对应的编号是96 97 117 。
3. 编写脚本去设置GPIO引脚的值(改变SET1 SET2 SET0的值)
把设备树dts文件里的看门狗代码注释掉。
使用GPIO对应的编号编写脚本watchdog.sh 去设置GPIO引脚的值(高低电平),通过设置GPIO引脚的值设置看门狗模式。
#!/bin/bash
# Copyright 2021 Tronlong Elec. Tech. Co. Ltd. All Rights Reserved.
# Description:
# Watch dog test.## 这个脚本SET1和SET2的值固定是1,只改变SET0的值去设置10s或60s延时复位,有需要可以修改其它值
#################################################
## GPIO4_1 --> SET0 97 ##
## GPIO4_0 --> SET1 96 ##
## GPIO4_21 --> SET2 117 ##
#################################################readonly VERSION="1.0"
GPIO=""
SET0_PIN=97
SET1_PIN=96
SET2_PIN=117# Watchdog timeout
# 开始时默认是60s,set0,1,2的值都为1
# 1: 60s
# 用来保存看门狗超时时间,然后下面的代码会根据这个值来设置看门狗超时时间
s0_val=1
s1_val=1
s2_val=1# Help message.
# 用来打印帮助信息
usage() {echo "Usage: $1 <options> [-g gpio <-t timeout>]options:--gpio(-g) Watch dog gpio number (e.g 124)--timeout(-t) Watch dog timeout(unit: second, value: 10 or 60)--version(-v) Print version.--help(-h) Print this help message.e.g../watchdog.sh -g 124 -t 10"
}# Program entry function
# 程序入口函数
main() {#一、判断第一个参数case $1 in#1.如果第一个参数的值为--help或者-h,则打印帮助信息并退出,$0表示脚本名称./watchdog.sh--help | -h) usage $0 exit 0;;#2.如果第一个参数的值为--gpio或者-g,则判断参数个数是否小于4,如果小于4则打印帮助信息并退出--gpio | -g)if [[ $# < 4 ]]; then usage $0exit 0fi #如果参数个数大于等于4,则继续执行下面的代码GPIO=$2 #将第二个参数赋值给GPIO变量,这个引脚用来喂狗的if [[ $3 != "--timeout" && $3 != "-t" ]]; then #判断第三个参数是否为--timeout或者-t,如果不是则打印帮助信息并退出usage $0exit 0fi if [[ $4 == 60 ]]; then #判断第四个参数是否为10,如果是则将TIMEOUT变量赋值为0s2_val=1s1_val=1s0_val=1elif [[ $4 == 10 ]]; then #判断第四个参数是否为60,如果是则将TIMEOUT变量赋值为1s2_val=1s1_val=1s0_val=0else #如果第四个参数既不是10也不是60,则打印帮助信息并退出usage $0exit 0fi;;#3.如果第一个参数的值为--version或者-v,则打印版本信息并退出--version | -v)echo "Version: ${VERSION}"exit 0;;*)usage $0exit 0;;esac # case..esac结构#二、开始喂狗echo "Feeding the watch dog..."# 1.Configure watchdog 10 second timeout # 设置喂狗的模式(10s还是60s),导出SET0引脚,# 并设置为输出模式,根据TIMEOUT的值设置SET0引脚的值if [[ ! -d /sys/class/gpio/gpio${SET2_PIN} ]]; thenecho ${SET2_PIN} > /sys/class/gpio/exportfiecho out > /sys/class/gpio/gpio${SET2_PIN}/directionecho $s2_val > /sys/class/gpio/gpio${SET2_PIN}/valueif [[ ! -d /sys/class/gpio/gpio${SET1_PIN} ]]; thenecho ${SET1_PIN} > /sys/class/gpio/exportfiecho out > /sys/class/gpio/gpio${SET1_PIN}/directionecho $s1_val > /sys/class/gpio/gpio${SET1_PIN}/valueif [[ ! -d /sys/class/gpio/gpio${SET0_PIN} ]]; thenecho ${SET0_PIN} > /sys/class/gpio/exportfiecho out > /sys/class/gpio/gpio${SET0_PIN}/directionecho $s0_val > /sys/class/gpio/gpio${SET0_PIN}/value# 2.Export WDI pin # 导出WDI引脚,并设置为输出模式,为下面喂狗做准备if [[ ! -d /sys/class/gpio/gpio${GPIO} ]]; thenecho ${GPIO} > /sys/class/gpio/exportfiecho out > /sys/class/gpio/gpio${GPIO}/direction# Feed watch dog# 循环喂狗,循环去给WDI引脚赋值0和1while true; doecho 1 > /sys/class/gpio/gpio${GPIO}/valuesleep 1echo 0 > /sys/class/gpio/gpio${GPIO}/valuesleep 1echo "feeding..."done#三、如果程序执行到这里,说明上面循环退出了,表明程序异常退出了,需要重启系统echo "Feed the watch dog done!"
}#使用‘@` 可以将所有参数作为一个整体传递给函数或命令
#@表示将所有传递给脚本的参数转发给main` 函数
main $@
4. 执行硬件看门狗脚本程序
# 124是喂狗的GPIO编号
# 10是设置系统复位延时为10s
# &是放到后台去执行
./watchdog.sh -g 124 -t 10
# 124是喂狗的GPIO编号
# 60是设置系统复位延时为60s
./watchdog.sh -g 124 -t 60 &
5.(另一种方法)将看门狗写到设备树里直接写死
可以像第2步一样,把(SET0 SET1 SET2)的 GPIO引脚的高低电平的值写死,固定就是那个延时时间进行复位。
五 、以太网
一个千兆网口、两个百兆网口(其中一个百兆网口是扩展的)。
百兆网口接在usb hub上,会自动识别。
六、USB有问题
七、HDMI
八 、4G模块 (还有两个模块没有调)
在设备树里使能4G的电源引脚(PCIE引脚,因为4G模块插在PCIE接口,然后通过协议转换芯片转的usb然后接在usb总线上)
九、wifi
8188(因为wifi模块硬件接触不良)
8811 (参考创龙官方提供的8188 Makeflie文件 去修改8811的Makefile文件)
1.根据创龙提供的指导文档,使用rtl8821cu.tar.gz源码包对评估板进行RTL8811 模块驱动适配,(因RTL8821CU驱动向下兼容RTL8811协议)。
将usb_wifi_test 的 src 目录下的 WIFI 驱动源码拷贝至/home/hugo/Demo/usb_wifi_test/src
目录下
2.在环境方面,内核镜像和模块编译成功,打开Makefile配置交叉编译环境,指定IMX8平台、交叉编译链及内核源码路径。Makefile关键修改的参数如下:
指定目标平台:CONFIG_PLATFORM_FS_IMX8 = y
配置交叉编译链路径:CROSS_COMPILE = aarch64-poky-linux-
绑定内核源码路径:KSRC = /home/hugo/IMX8/Kernel/Linux-5.4.70
3.驱动编译:加载SDK环境变量并执行make命令,成功生成8821cu.ko(实际向下兼容8811)WIFI驱动文件。
hugo@hugo-virtual-machine:~/Demo/usb_wifi_test/src/rtl8821cu$ source /home/hugo/SDK/environment-setup-aarch64-poky-linux
hugo@hugo-virtual-machine:~/Demo/usb_wifi_test/src/rtl8821cu$ make
文件系统修改
1.系统主机名修改
修改制卡包里面的文件系统文件试试。看看重新制卡会不会变?
2.指示灯脚本
直接放后台运行就行