《电子科大微嵌实验报告四》由会员分享,可在线阅读,更多相关《电子科大微嵌实验报告四(7页珍藏版)》请在金锄头文库上搜索。
1、电子科技大学实验报告课程名称微处理器系统与嵌入式系统综合实验实验名称基于ARM的模块方式驱动程序实验任课教师实验教师姓名学号实验地点科 B239 分组号时间年月日一、实验目的1. 掌握Linux系统下设备驱动程序的作用与编写技巧2. 掌握Linux驱动程序模块加载和卸载的方法3. 了解ps与pl之间的通信方法二、实验内容1. 基于ees331开发板编写led驱动程序。2. 编写led驱动,修改makefile,并将led驱动动态加载入linux内核中。3编写关于led的测试程序,交叉编译后运行,控制led灯的亮灭。三、实验步骤1.在vivado里搭建好硬件工程,包括:led、sw和uart模块
2、。(详见实验2)2搭建好后生成比特流文件,利用SDK软件将fsbl文件、比特流文件、u-boot文 件生成boot.bin启动文件。(详见实验2)3在led目录下,编写led驱动源代码,修改三个部分:1)添加led的地址:/* Modify the address to your peripheral */#define ees331_led_PHY_ADDR/* Modify the address to your peripheral */led驱动的初始化函数为如下:int _init ees331_led_init(void)int ret;GPIO_Regs = ioremap(ee
3、s331_led_PHY_ADDR, 32);ret = misc_register(&ees331_led_dev);if (ret)printk(ees331_led:ERROR Misc device register failedn); return ret;,printk(ees331_led: success! Module init completen); iowrite32(255, GPIO_Regs);return 0; /* Success */2) 添加控制函数的代码,如下:static int ees331_led_ioctl(struct file *filp, u
4、nsigned int reg_num, unsigned long arg)/* Add your code here */通过led地址给led寄存器赋值/* Add your code here */return 0;3) 在驱动的文件操作结构体添加代码,如下 static const struct file_operations ees331_led_fops =.owner = THIS_MODULE,/* Add your code here */.open =,.release =,.read =,.unlocked_ioctl =,/* Add your code here *
5、/;4. 打开Makefile文件,修改其中部分,加入交叉编译器和内核源码树目录,如下。 ifneq ($(KERNELRELEASE),)obj-m := ees331_led.oelseifeq ($(TARGET),)TARGET := $(shell uname -r)endifPWD := $(shell pwd)/* Add your code here */CC =KDIR ?=/* Add your code here */default:echo $(TARGET) module.target$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesc
6、lean:rm -f *.ko *.o modules.order Module.symvers *.mod.? .ees331_led*.*rm -rf .tmp_versions module.targetinstall: ees331_led.koinstall-mode 0644 ees331_led.ko /lib/modules/$(shell catmodule.target)/kernel/drivers/char/sbin/depmod -a $(shell cat module.target) ees331_led.ko:$(MAKE)endif在需要添加部分加入交叉编译器
7、和内核源码树目录$(CROSS_COMPILE)gcc、/home/zynq/Downloads/2016.3/linux-xlnx-xilinx-v2016.35打开一个终端,在led目录下执行make命令,生成.ko驱动模块文件。 make6. 将测试文件ledtest.c进行交叉编译,(或者在开发板上执行gcc命令),生成可执 行文件ledtest,将驱动文件和测试文件放到开发板里。arm-linux-gnueabihf-gcc ledtest.c -o ledtest7. 将驱动文件和测试文件通过网线拷贝到开发板SD里:*.1.12:/home/zynq/driver_code/led
8、/ledtest/root *.1.12:/home/zynq/driver_code/led/ees331_led.ko/root8打开putty软件,选择对应的com 口,波特率选择为115200,进入到linux系统里, 在led目录下执行insmod命令,将驱动模块动态加载到内核中,在/dev/目录中用ls 命令可以查看到相应的设备。insmod ees331_led.ko9. 在终端里执行可执行程序ledtest输入一个数,可以在开发板上观察到led灯二进制 显示。./ledtest10. 执行命令rmmod将驱动模块卸载。rmmod ees331_led四、实验结果/* Modif
9、y the address to your peripheral */#define ees331_led_PHY_ADDR 0x4120_0000/* Modify the address to your peripheral */通过led地址给led寄存器赋值GPIO_Regs = ioremap(ees331_led_PHY_ADDR, 32); iowrite32(arg, GPIO_Regs);.open = ees331_led_open,.release = ees331_led_release,.read = ees331_led_read,.unlocked_ioctl =
10、 ees331_led_ioctl,也11色|avalnull poreP7B1UCrAjnQ lanl faunlO ranLLl HiunJ.2zaacl4匸匸y42二匸讯5ttyifttyS tty5Drandot 9 Shan 相日 stdt-rr 日匸镒乱 stdout tty 匸匸yo txya. ttylD r-cyll tcyli- 丄丄 c存3 u-jiiTwy2 = ey5C 疔 ttyC ery29tty30匚匸!?奇灯 TE-61 ty6J 匸tY石3 tty? 匸匸抨匸匚yP50VM即 Tiri l-l IB |Ij ij * 11 .” JlvcsaS 亡日连吕 v
11、gaarbiter vitclidcfl n-n;cticlag3 mdH 口】* KdevcC; zeroII side devices linitctl I1E1JMLT, |tanjg 严1-1 QCp-ccntrqlXccxiO laapl | loops iQCisa1 口口弗 loopS 工 口 QU 1 i.口aza-developer t /dci cd rdatl.in*rQ-iaeveleper t-# 亠/ledt ex: plee canf val1iplt&je4 匸2 y 七 EO 1- 一一Z匸匸7 9-9 o 1 y2y2y2V3J3/3 二 Ext匕匕 二 J
12、d UVUIJ五、实验总结实验中学习了很多Linux操作系统常用的命令,以及简单的Linux设备驱动程序和led 驱动的原理等。在实验过程中也遇到了很多问题,首先就是命令行符号错误,导致很 长时间浪费,警示自己以后要仔细小心。然后在补充代码的过程中思路不清晰以至于 代码出错,改正过来之后就顺利完成实验了。六、实验思考题1. 驱动里led的地址是怎么查看的?可以在硬件工程里面查看led的地址。2. 模块化的最大优点是什么? 每个模块可以实现不同的功能,方便团队之间分工协作。3. printk()函数的作用是什么,怎么查看printk函数打印的消息?printk ()函数的作用是将printk ()的内容输出到控制台。在shell中使用dmesg指令就可以查看printk函数打印的消息。1 在终端下输入:2 while true3 do4 sudo dmesg -c5 sleep 16 done4. 文件操作结构体struct file_operations的作用是什么? 用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。