记录一下自己的学习过程
实验原理及内容:
【实验内容】
针对嵌入式系统开发板的RGB灯设计驱动程序,完成驱动程序的编译和加载。设计一个驱动程序的测试程序,要求可以依次点亮三个灯,最后熄灭。
【实验原理】
对于字符设备驱动,一定需入口与出口。
入口:在insmod xx.ko 时执行led_chrdev_init函数。
出口:在rmmod xx.ko 时执行led_chrdev_exit函数。
硬件电路原理图如下图所示。LED_R、LED_G、LED_B阴极分别连接到 i.MX6ULL 芯片上GPIO1_IO04引脚、GPIO4_IO20引脚和GPIO4_IO19引脚。
实验步骤及数据记录:
将12.6文件夹拷贝到ubuntu
打开命令终端,进入root用户
zmy@ubuntu:~$ sudo -i
将12.6文件夹复制到目录/home/zmy/
root@ubuntu:~# cp -r /home/zmy/Desktop/12.6/ /home/zmy/
4、进入目录/home/zmy/12.6
root@ubuntu:/home/zmy/12.6#
修改startup.sh脚本程序,注意将下图红圈部分修改为你12.6文件夹所在目录
5、执行startup.sh脚本程序,脚本程序负责配置nfs环境,编译交叉编译工具以及下载内核和源代码。
root@ubuntu:/home/zmy/12.6# source startup.sh
6、切换目录到led_cdev目录
7、修改Makefile,第一行为指定内核位置,修改为内核所在位置;直接指定交叉编译工具链位置。
KERNEL_DIR=../ebf_linux_kernel_6ull_depth1/build_image/build
CROSS_COMPILE=/usr/local/arm/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
8、清除上一次编译的
make clean
重新编译程序
make
9、将生成的驱动文件.ko(led_cdev.ko)和应用程序(led_test)复制到共享文件夹目录
10、打开一个新的命令终端,配置minicom
配置开发板的ip地址(注意这里修改网口需要修改成你实际接网线的网口(eth1或eth2)):ifconfig eth1 192.168.1.25 netmask 255.255.255.0
从开发板去ping ubuntu系统:ping 192.168.1.110(注意这里是ubuntu的ip地址,可以用ifconfig获取)
11、挂载(192.168.1.110为ubuntu ip地址,/nfsFile为nfs共享文件夹路径)
sudo busybox mount -n -o nolock,rsize=1024 192.168.1.110:/nfsFile /mnt/
在minicom进入目录/mnt,加载驱动
root@npi:/mnt#
root@npi:/mnt# insmod led_cdev.ko
打印如下信息:
[ 73.632894] led_cdev: loading out-of-tree module taints kernel.
[ 73.646185] led chrdev init
执行测试程序
root@npi:/mnt# ./led_cdev_test
可以看到RGB灯依次闪烁,最后灭掉
14、卸载驱动
root@npi:/mnt# rmmod led_cdev
打印如下信息:
[ 168.431902] led chrdev exit
实验结果(结论):
可以看到RGB灯依次闪烁,最后灭掉。