基于ARM的模块方式驱动程序
作者: Saint
掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a
微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1
GitHub:github.com/saint-000
优快云: https://me.youkuaiyun.com/qq_40531974
一、实验目的
1.掌握Linux系统下设备驱动程序的作用与编写技巧
2.掌握Linux驱动程序模块加载和卸载的方法
3.了解串口驱动的原理和工作方式
了解串口驱动的原理和工作方式
二、实验内容
1.基于ees331开发板编写led驱动程序。
2.编写led驱动,修改makefile,并将led驱动动态加载入linux内核中。
3.编写关于led的测试程序,交叉编译后运行,控制led灯的亮灭。
4.修改uart驱动,修改makefile,修改设备树,并将uart驱动动态加载入linux内核中。
5.编写关于uart的测试程序,交叉编译后运行,进行串口通信。
三、实验步骤
Led驱动
1.在vivado里搭建好硬件工程,包括:led、sw和uart模块。(详见实验2)
2.搭建好后生成比特流文件,利用SDK软件将fsbl文件、比特流文件、u-boot文件生成boot.bin启动文件。(详见实验2)
3.在driver_code/led目录下找到ees331_led.c源文件,双击打开源文件,也可以通过终端命令gedit 打开:编写led驱动源代码,然后添加控制函数的代码
4.打开Makefile 文件,修改其中部分,加入交叉编译器和内核源码树目录,在需要添加部分加入交叉编译器和内核源码树目录$(CROSS_COMPILE)gcc、/home/zynq/Downloads/2016.3/linux-xlnx-xilinx-v2016.3
5.虚拟机中打开一个终端,在led目录下执行make命令,生成.ko驱动模块文件。make
6.将测试文件ledtest.c进行交叉编译,(或者在开发板上执行gcc命令),生成可执行文件ledtest。arm-linux-gnueabihf-gcc ledtest.c -o ledtest
7.在win7系统里打开putty软件,选择对应的com口,波特率选择为115200。
8.putty的窗口里,进入到arm-linux系统里,将ees331_led.ko和 ledtest文件拷贝到SD卡根文件系统的root目录下。
scp zynq@192.168.1.12:/home/zynq/driver_code/led/ledtest /root
scp zynq@192.168.1.12:/home/zynq/driver_code/led/ees331_led.ko /root
9.putty的窗口里,在/root(~)目录下执行insmod 命令,将驱动模块动态加载到内核中。
insmod ees331_led.ko
驱动加载成功后,在/dev/目录中用ls命令可以查看到相应的设备。
ls /dev/
10.putty的窗口里,返回到/root目录,在/root(~)目录下运行测试程序ledtest,putty的ARM-linux 操作系统的命令行输入:
./ledtest
11.putty的窗口里,程序会提示:please enter the led status,输入与希望显示的led 状态对应的ledstatus 值(输入十进制值即可),观察led 的显示情况。
12.putty的窗口里,卸载led驱动模块:
rmmod ees331_led
UART驱动
1.在vivado里搭建好硬件工程,包括:led、sw和uart模块。
2.搭建好后生成比特流文件,利用SDK软件将fsbl文件、比特流文件、u-boot文件生成boot.bin启动文件。
3.在driver_code/BOOT相应目录下找到devicetree.dts源文件,打开源文件(图中的目录是devicetree目录,实际是BOOT),修改设备树文件
4.在虚拟机终端中,将设备树文件dts转换成dtb格式,并通过读卡器将devicetree.dtb拷贝到SD里的BOOT分区里:dtc -I dts -O dtb -o devicetree.dtb devicetree.dts
5.在driver_code/uartlite目录下修改测试程序uart.c。
6.对提供的测试程序uart.c 进行交叉编译,生成可执行文件uart,在终端下输入以下命令:
cd /home/zynq/driver_code/uartlite
sudo su (密码:1)
source zynq-env.sh
arm-linux-gnueabihf-gcc uart.c -o uart
7.对驱动文件进行编译,生成驱动模块uartlite.ko,在同一个终端下继续输入命令:
make
8.在win7系统里打开putty软件,选择对应的com口,波特率选择为115200。
9.putty的窗口里,将uartlite.ko和uart文件拷贝到SD卡的root目录下。
scp zynq@192.168.1.12:~/driver_code/uartlite/uart /root
scp zynq@192.168.1.12:~/driver_code/uartlite/uartlite.ko /root
10.putty的窗口里,进入到arm-linux系统里,在/root(~)目录下执行insmod 命令,将驱动模块动态加载到内核中。
insmod uartlite.ko
驱动加载成功后,在/dev/目录中用ls命令可以查看到相应的设备。
ls /dev/
11.用双头usb线将开发板上PL的串口(5上)与上位机连接,打开串口助手,选择对应的com口与波特率9600。
12…putty的窗口里,在/root(~)目录下运行测试程序uart,putty的ARM-linux 操作系统的命令行输入:
./uartlite
四、实验结果
1.基于ARM的模块方式驱动程序实验.在Linux虚拟机下编写实验程序。
(1)设置IP
1.sudo du (取得用户权限)
2.ifconfig (