实验七嵌入式系统驱动实验

发布 2022-10-21 09:41:28 阅读 6066

实验七 arm9嵌入式系统硬件驱动基础开发实验。

实验目的】1.掌握嵌入式linux内核的配置编译及移植。

2.掌握arm linux驱动程序的开发流程。

实验内容】1.常用linux命令的使用。

2.嵌入式linux驱动程序开发步骤。

内核配置、编译以及移植。

实验设备】开发板。

2.串口线、usb线。

机(软件:vmware workstation6.5)

实验原理】嵌入式 linux是以linux为基础的嵌入式作业系统,它被广泛应用在移动**、个人数字助理(pda)、****器、消费性电子产品以及航空航天等领域中。linux是开放源**的操作系统,同时具有体积小、执行速度快、较好的可裁剪性与移植性等特点。针对arm cpu开发的具有mmu(memory management unit)功能的嵌入式linux操作系统是arm平台上操作系统的最佳选择。

通用的基于arm系统的linux开发步骤如下:

1)开发目标硬件系统:如选择微处理器,flash及其他外设等;

2)建立交叉编译工具:一般的gcc工具都是针对x86体系的,为了能够生成目标板可执行的**必须建立交叉编译工具;

3)开发bootloader:建立启动系统的主引导程序;

4)移植linux内核:如基于arm的linux2.4内核移植;

5)开发一个根文件系统:如yaffs文件系统的制作;

6)开发相关硬件的驱动程序:如lcd、keypad等;

7)开发上层的应用程序:如qt gui开发。

驱动程序的目的一般式驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。驱动程序既可以工作在有操作系统的环境下,也可以工作在无操作系统的环境中。通常在做一些简单的硬件控制时,由于功能比较单一,不需要操作系统来管理,所以针对这种情况下的驱动程序相对来说也比较简单,但是作为一个嵌入式系统,他要实现的任务也相对比较多,比较复杂,所以需要有操作系统来对他进行管理。

设备驱动程序是操作系统内核和及其硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。linux下的设备驱动程序是内核的一部分,运行在内核模式。

也就是说,设备驱动程序为内核提供了一个i/o接口,用户使用这个接口实现对设备的操作。我们在这个实验中主要是将驱动程序的c文件交叉编译后添加进内核,同时,在文件系统中添加驱动测试程序。最后将生成的系统映像文件烧进开发板中。

对于驱动程序的使用,有静态编译和动态编译两种,静态编译指的是将驱动程序添加到内核中,动态编译是指将驱动程序编译成驱动模块。我们采用第一种,即静态编译的方式添加驱动程序。驱动程序的开发步骤如下:

1)首先,用户在自己的驱动程序源文件中定义file_operations结构,并编写出设备需要的各种操作函数,对于设备不需要的操作函数用null初始化,这些操作函数将被注册到内核。当应用程序对相应的设备文件进行操作时,内核会找到相应的操作函数,并进行调用。如果操作函数使用null,操作系统就进行默认的处理。

2)设备驱动程序编写完成后,就可将其添加到linux内核中,这需要修改linux的源码,然后重新配置编译linux内核。

3)编写相应的驱动测试程序,**到arm板进行相应驱动的测试。

实验步骤】1.打开桌面上的虚拟机软件vmware workstation,用户名为root,密码为123456,即以超级用户的身份登录。打开终端,学习一下linux常用命令:

# cd / 切换到根目录。

# cd dir 切换到当前目录下的dir目录下。

# cd ..切换到上一级目录。

# ls 显示当前目录下的文件列表。

# vi file 编辑文件file

# tar xzvf 将文件file解压。

# rm file 删除文件。

# rm –fr dir 删除当前目录下叫dir的整个目录。

# cp source target 将文件source复制为target,可以指定文件路径。

# cat file 查看file的内容。

# mv file /dir 将当前目录下的file文件移动到dir目录下。

还有一些命令会在后面的使用中具体讲解。

2. 在终端里进入 /opt/friendlyarm/nano2410v2 目录下,其中有一个kernel文件夹,这就是我们要操作的linux的内核。进入kernel/drivers/char ,即内核驱动的字符型设备驱动文件夹,然后ls查看里面的文件列表,其中有一个 文件,这是一个led驱动程序,但此程序需要修改才能适用于我们的arm板。

3. 输入 vi ,对此文件进行编辑。在vi编辑器里面默认的是命令模式,键入i就进入了编辑模式。

程序里 led_table中定义了四个端口,我们将gpio_e13改为gpio_f7,即我们只对板子上的led2进行操作。修改之后按esc回到命令模式,然后输入 :wq 保存退出。

4. 打开kernel/drivers/char 目录下的makefile文件,即输入 vi makefile 。切换到编辑模式,在第199行里输入 obj-$(config_super2410_leds) +按esc键,输入 :

wq 保存退出。 这一步操作时为了在编译内核时将 编译成 文件。

5. 打开kernel/drivers/char 目录下的 文件,即输入vi 切换到编辑模式,在第89行里输入dep_tristate ‘support super2410 leds’ config_super2410_leds,然后按esc键,输入 :wq 保存退出。

这样在运行menuconfig配置字符设备时就会出现 support super2410 leds 的字样,如果选中并编译通过,驱动程序就加到内核中了。

6. 返回到 /kernel 目录下面,输入 make menuconfig ,进行内核的配置。首先找到character devices,回车进入,找到 support super2410 leds (new),键入空格选中此项。

然后返回上一级,进入general setup,在 timer and cpu usage leds上键入空格,取消选中。如果选中则两个led分别用于timer和cpu,我们的测试程序将看不到效果,故在此处将其取消。

然后保存退出,这时可以进行linux内核的编译了。

7. 在终端里输入 make dep,这一步仅仅在第一次编译时需要,为的是编译时内核知道文件之间的依赖关系; 输入 make clean ,该命令用于清除以前编译内核时生成的所有目标文件、模块文件和临时文件; 输入 make zimage ,即将内核编译成gzip压缩形式的image。编译通过后会在目录 kernel/arch/arm/boot 下生成 zimage内核文件。

8. 编译好之后,我们查看 kernel/drivers/char 目录会看到 文件,如果没有则我们的led驱动程序没有加入到内核。另一种方法是在终端里kernel目录下输入 cat | grep leds,如果有matrix4_leds_init、matrix4_leds_ioctl、matrix4_leds_fops(这几个是文件里的函数)等,则表明驱动已经正确地加入到了内核。

9. 将zimage 文件拷贝到 /mnt/hgfs/share 文件夹里,则在windows下我们可以获得此文件。下面进行驱动测试程序的操作。

10. 在虚拟机的 /opt/frindlyarm/nano2410v2/examples 找到leds文件夹,里面有两个文件,是led的测试程序,makefile是用来指明编译文件时要用的编译器。在终端里进入此文件夹,输入 make 后在该文件下生成一个二进制程序led。

将其重命名为ledtest,拷贝到 /opt/friendlyarm/nano2410v2/root_qtopia_tp/sbin下。这个root_qtopia_tp文件夹是我们板子所使用的文件系统。

11. 将 root_qtopia_tp文件夹拷贝到 /opt/ friendlyarm/nano2410v2/mkyaffs文件夹下,在终端里进入此文件夹,输入命令 ./mkyaffsimage root_qtopia_tp 执行完后在mkyaffs文件夹下会生成文件,这是我们要**到arm板子上的文件系统映像文件。

12. 将前面的zimage和文件**到arm板,然后重新启动,通过windows主机的超级终端进行驱动程序的测试。

13.在windows主机下,打开开始-程序-附件-通讯-超级终端,输入自定义的名称,选择com口(默认com1即可),端口设置如下图:

将arm板上面的com0和主机的串口用串口线连接,上电后会在超级终端里看到启动信息,当出现“please press enter to active this console” 时键入回车进入操作系统,如下图。

此时可以通过超级终端控制我们的arm板了。

14. 这时候可以看到led2在闪烁,其控制程序是 /etc/ 下面的leds。输入 ./leds stop 后,则此程序被结束,led不再闪烁。

15. 进入 /sbin,查看文件列表会发现我们添加的驱动测试程序ledtest:

进入 /dev 会看到我们加入内核的驱动leds(驱动程序中定义的驱动名称为leds),如下图:

这时候我们进行驱动程序的测试,输入ledtest 1 1则点亮led2,输入ledtest 1 0则熄灭led2。

实现一个简单的linux字符设备驱动

步骤1: 编写驱动程序

#include

#include

#include

#include

#include

#include

#include

#include

#definedevice_name"cdev_zhangwei"

10. intnumber_of_devices=1;

嵌入式系统实验

哈尔滨德强学院。实验报告 题目 嵌入式系统设计。院 系 德强商务学院计算机系。姓名 指导教师 多智华。系主任 葛雷 2010年10月15日。实验。一 使用ads1.2调试程序。一 实验内容和目的。1 熟悉adtide adt2000 support 运行环境。2 使用adtide adt2000 s...

嵌入式系统 实验

实验一 基于ads的c语言程序实验。一 实验环境。pc机一台 ads 1.2集成开发环境一套。二 实验目的。通过实验了解使用ads 1.2编写c语言程序,并进行调试。三 实验内容。在c语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到c语言下的主程序,然后,执行c程序,具体...

嵌入式系统设计实验七

合肥学院。嵌入式系统设计实验报告。20 13 2014第2学期 专业 11级自动化卓越班。实验项目 qt编程环境搭建实验 实验成员 指导老师干开峰。实验时间 2014 年 5 月 23 日 电子信息与电气工程系。2014年4月制。实验七 qt编程环境搭建实验。1 掌握qt编程环境搭建。2 学会使用q...