嵌入式linux培训实验教材.doc_第1页
嵌入式linux培训实验教材.doc_第2页
嵌入式linux培训实验教材.doc_第3页
嵌入式linux培训实验教材.doc_第4页
嵌入式linux培训实验教材.doc_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式linux培训实验教材中程在线 实验一 嵌入式开发环境的建立1 实验目的掌握嵌入式开发环境的构建,熟悉课程实验的开发板掌握安装交叉编译工具的安装方法2 实验内容安装vmware虚拟机,安装linux系统安装arm-linux-gcc交叉编译工具熟悉开发板,安装USB驱动程序,下载bootloader,kernel,rootfs映像编写hello.c程序,进行编译并运行3 实验步骤:3.1 安装vmware虚拟机,安装linux系统安装vmware 5.5.3版本,安装文件在光盘目录“windows平台工具Vmware”下。双击进行安装。安装完成后,创建虚拟机。点击菜单“FileNewVirtual Machine”,开始创建向导。Virtual machine configuration中选择Typical选项。Guest Operating System选择Linux选项。Network bridged networking选择Use bridged networking选项。在虚拟机配置好后,可以在虚拟机上安装linux系统。具体安装方法参见QQ2440V3 用户手册的第五章,建立linux 开发环境。3.2 安装arm-linux-gcc交叉编译编译器的文件在光盘目录/linux下。操作命令如下:#tar xvzf arm-linux-gcc-2.95.3.tgz C #tar xvzf arm-linux-gcc-3.4.1.tgz C #mkdir p /opt/FriendlyARM/QQ2440 ;建立工作目录,备用更改虚拟机系统的路径,把arm-linux-gcc工具链加入到搜索路径中。执行该命令, 将把arm-linux-gcc( 版本2.95.3 和3.4.1) 分别安装到/usr/loca/arm/2.95.3 和/usr/loca/arm/3.4.1 目录,其中,2.95.3 版本是用来编译VIVI 的,3.4.1 版本是用来编译内核的,两个版本均可以用来编译应用程序等。然后运行命令#gedit /root/.bashrc编辑/root/.bashrc 文件,在最后一行export PATH=$PATH:/usr/loca/arm/3.4.1/bin如图,保存退出。最后执行source命令,使设置的路径信息生效。命令如下: source .bash_profile检查是否安装成功。输入如下命令,如果安装成功,将打印出正确的版本信息。 #arm-linux-gcc -v3.3 配置网络文件系统NFS 服务(1)设置共享目录运行命令#gedit /etc/exports编辑nfs 服务的配置文件( 注意:第一次打开时该文件是空的),添加以下内容:/opt/FriendlyARM/QQ2440V3/root_nfs *(rw,sync,no_root_squash)其中:/opt/FriendlyARM/QQ2440/root_nfs 表示nfs共享目录,可作为开发板的根文件系统通过nfs 挂接;* 表示所有的客户机都可以挂接此目录rw 表示挂接此目录的客户机对该目录有读写的权力no_root_squash 表示允许挂接此目录的客户机享有该主机的root 身份 (2) 建立共享目录拷贝光盘中的root_nfs.tgz 文件到某一个目录,进入此目录,执行以下命令:#tar xvzf root_nfs.tgz C /opt/FriendlyARM/QQ2440/root_nfs该命令将把root_nfs 的内容解压安装到/opt/FriendlyARM/QQ2440/root_nfs 目录。(3) 启动和停止nfs 服务在命令行下运行:#/etc/init.d/nfs start这将启动nfs 服务,可以输入以下命令检验nfs 该服务是否启动。# mount -t nfs localhost: /opt/FriendlyARM/QQ2440/root_nfs /mnt/如果没有出现错误信息, 您将可以浏览到/mnt 目录中的内容和/opt/FriendlyARM/QQ2440/root_nfs 是一致的。使用这个命令可以停止nfs 服务:#/etc/init.d/nfs stop3.4 安装USB驱动程序,下载bootloader,kernel,rootfs映像开机进入BIOS 模式,Supervivi 在出厂的时候已经预装入板子的Nor Flash 中,设置跳线J1 为Nor Flash 启动,即可进入BIOS 模式。安装USB 驱动如果您是第一次使用,WindowsXP 系统会提示您发现了新的USB 设备,按照以下步骤安装好USB 驱动:(1) 出现以下提示,请选择红色方框方式选择,点“下一步”(2) 出现以下提示,选择“从列表或指定位置安装”,点“下一步”(3)选择开发板提供的光盘中USB 驱动所在的位置,点“下一步”安装完成后,可以使用工具DNW,此时观察DNW 标题栏,可以看到USB 连接OK,如图通过串口和DNW工具可以烧写Bootloader、Kernel、Rootfs等映像。3.4 编写hello.c程序,进行编译并运行交叉编译示例程序首先进入测试程序源代码目录#cd /opt/FriendlyARM/QQ2440/examples/hello然后,使用命令行手工编译示例程序#arm-linux-gcc o hello main.c或者借助编译脚本进行编译#make最后将生成hello 可执行文件。通过串口传送文件到开发板在串口控制台上运行命令:#rz再通过串口工具发送文件即可。更改文件的属性为可执行。#chmod +x hello#./hello实验二 Bootloader程序1 实验目的熟悉VIVI的代码结构和编译方法。熟悉u-boot的代码结构和编译方法。2 实验内容编译vivi代码并下载到开发板,更改VIVI的分区,并进行实验。编译uboot代码并下载到开发板。3 实验步骤:3.1 vivivivi 的源代码包vivi.tgz 位于光盘的linux目录,把vivi.tgz 复制到某一个目录,进入该目录。运行命令:#tar xvzf vivi.tgz C /opt/FriendlyARM/QQ2440执行该命令将把vivi 源代码解压到/opt/FriendlyARM/QQ2440 目录,进入vivi 源代码目录,执行make menuconfig然后执行“make”开始编译,#make 然后把生成的VIV映像文件下载到开发板中去,具体下载方法参见QQ2440V3 用户手册3.1.2节。 3.2 u-bootu-boot代码位于光盘的u-boot-1.1.6目录。把u-boot-1.1.6代码进行解压,#tar jxvf u-boot-1.1.6.tar.bz2 C /opt/FriendlyARM/QQ2440执行该命令将把vivi 源代码解压到/opt/FriendlyARM/QQ2440 目录,进入u-boot-1.1.6源代码目录,执行make QQ2440_config然后执行“make”开始编译,#make 然后把生成的u-boot.bin映像文件下载到开发板中去,具体下载方法参见QQ2440V3 用户手册3.1.2节。实验三 Linux内核编译1 实验目的熟悉Linux的内核代码结构。掌握Linux内核配置方法。掌握Linux内核编译方法。2 实验内容编译Linux内核,并下载内核映像。定制一个满足需要的最小Linux内核,看裁剪后的内核文件有多大。3 实验步骤:3.1 使用缺省配置文件编译内核解压内核源代码Linux 内核的源代码包linux-2.6.13-QQ2440V3.tgz 位于光盘的linux目录,您在该目录下还会看到类似linux-2.6.13-QQ2440_20071205.tgz 的文件,这是我们最新一次更新光盘的内核源代码包,它以为日期结尾,老客户也可以在我们网站下载最新文件,不再另行通知。把内核源代码包复制到某一个目录,进入该目录,运行以下命令:#tar xvzf linux-2.6.13-QQ2440_20071205.tgz C /opt/FriendlyARM/QQ2440装载缺省配置文件然后执行“make menuconfig”,出现配置内核界面,选择进入“Load an AlternateConfiguration File”配置栏:输入配置文件名如config_cs8900_n35 并回车,在主菜单里选择退出并保存设置。编译内核再次提示:编译内核需要arm-linux-gcc-3.4.1 版本的编译器,请务必检查安装好。输入以下命令,开始编译内核:#make zImage编译结束后,会在arch/arm/boot 目录下生成linux 内核映象文件:zImage3.2 定制Linux内核上面我们使用缺省文件配置和编译了内核,其实linux 内核的配置选项有很多,下面我们就常见的一些选项分别予以图解,帮助你尽快熟悉内核配置,以便定制自己需要的内核。运行make menuconfig 后,进入内核配置主菜单如何配置CPU 选项在主菜单里面,选择System Type,按回车进入。可以看到,系统大部分使用了标注了S3C2410 的选项,这是因为S3C2410 和S3C2440的很多寄存器地址等地址和设置是完全相同的,该版本的linux-2.6 内核不再对这两种CPU 分别设置。如果您要选择板级选项,可以进入S3C24XX Implementations 子菜单,里面有很多常见的使用基于S3C2410 和S3C2440 的目标板平台选项它们分别对应于arch/arm/mach-s3c2410/mach-* 开头的文件,如IPAQ H1940 对应于mach-h1940.c,我们的开发板平台为QQ2440V3/mini2440,它对应于mach-QQ2440V3.c。另外, 在这个文件中, 还会用到一个机器码MACH_TYPE, 该机器码的定义文件为arch/arm/tools/mach-types,其中,我们开发板的机器码为782,它还对应于vivi 源代码中include/platform/smdk2440.h 文件的MACH_TYPE如何配置优盘的支持因为要优盘用到了SCSI 命令,所以我们先增加SCSI 支持。在Device Drivers 菜单里面,选择SCSI device support,按回车进入选中:* legacy /proc/scsi support SCSI disk support然后选择返回Device Drivers 菜单,再选择USB support,按回车进入USB support菜单找到并选中 USB Mass Storage support何配置CS8900 网卡驱动要配置CS8900 网卡驱动,首先要配置网络协议支持在主菜单中,选择Netwoking,回车进入选中* Networking support并选择Networking options,按回车进入一般我们选择TCP/IP 协议就够了,但推荐使用我们缺省配置的几个选项,如图选择完毕,一直退回到主菜单,并选择进入Device Drivers 菜单。找到Network device support,选择进入找到并进入Ethernet (10 or 100Mbit) 选项选中: CS8900 support Generic Media Independent Interface device support如何配置串口驱动依然在Character devices 菜单中,选择进入Serial drivers - - -,并做如图选择。如何配置RTC 实时时钟驱动依然在Character devices 菜单中,选中RTC 驱动支持,如图。注意:不要选中Enhanced Real Time Clock Support如何配置yaffs 文件系统的支持选择进入File Systems - - -菜单,再选择进入Miscellaneous filesystems -,如图:实验四 根文件系统1 实验目的熟悉Linux的根文件系统。掌握Linux文件系统映像的生成方法。掌握busybox的编译方法。2 实验内容yaffs 根文件系统映象的制作。制作CRAMFS根文件系统映像。编译生成busybox。3 实验步骤:3.1 yaffs 根文件系统映象的制作制作yaffs 文件系统映象需要使用mkyaffsimage 工具程序在此,我们以制作测试用的root_default.img 文件系统映象为例,来介绍yaffs 文件系统映象的制作。(1)把光盘中的mkyaffsimage.tgz 文件拷贝到某一个目录,进入该目录,然后执行以下命#tar xvzf mkyaffsimage.tgz -C /usr/sbin这将把制作工具mkyaffsimage 安装到系统的可执行路径/usr/sbin(2) 拷贝光盘中的root_default.tgz 到某一个目录,进入该目录,然后执行以下解压命令:#tar xvzf root_default.tgz -C /opt/FriendlyARM/QQ2440(3) 把您自己制作的应用程序或者其他文件放入文件系统,如hello 例子程序:#cp examples/hello/hello root_default/sbin(4)使用mkyaffsimage 制作yaffs 文件系统映象:可以看到,已经在当前目录下生成了root_default.img 映象文件,使用前面章节介绍的烧写方法,可以通过USB 把root_default.img 烧写到目标板。3.2 CRAMFS根文件系统映像的制作制作CRAMFS文件系统映象需要使用mkcramfs工具程序。操作步骤与3.1类似。命令如下mkcramfs p root_default rootfs.cramfs3.3 制作busyboxbusybox-1.2.0.tgz文件在光盘的/linux目录下。拷贝到系统中并进行解压。#tar xvzf busybox-1.2.0.tgz -C /opt/FriendlyARM/QQ2440进入到相应的busybox-1.2.0目录。#make menuconfig#make#make installbusybox-1.2.0目录下生成_install目录,其中又包含了bin和sbin两个子目录。两个子目录中除了busybox文件外,其他均是指向该文件的符号连接。实验五 Linux系统架构实验1 实验目的能根据Linux架构知识来解决实际的问题。能根据需要完成系统架构的改变。2 实验内容根据需要,系统需要设立两个文件系统分区,一个存储根文件系统,根文件系统中的数据只读,不可写;另一个分区用来保存数据,需要可读可写。请根据要求来更改相应的代码与设置。实现该系统架构的要求。3 实验步骤:3.1 修改Linux中Nand分区信息nand的分区信息参见 arch/arm/mach-s3c2410/mach-sbc2440.c,需要对下面的结构进行修改。struct mtd_partition bit_default_nand_part = 0 = .name = bootloader, .offset = 0x00000000, .size = 0x00030000, ,1 = .name = kernel, .offset = 0x00050000, .size = 0x00200000, ,2 = .name = root, .offset = 0x00250000, .size = 0x03dac000, ;3.2 制作CRAMFS根文件系统 根文件系统采用CRAMFS文件系统,可以实现只读。3.3 加载新的分区对保存数据的分区需要进行加载。可以修改/etc/fstab文件。实验六 编写内核模块程序1 实验目的掌握内核模块程序的框架掌握2.6内核版本中内核模块的编译方法2 实验内容通过代码树编译内核模块通过Makefile文件编译内核模块3实验步骤3.1通过代码树编译内核模块内核模块的程序的实验步骤:编写helloworld.c文件。实验代码附后。拷贝helloworld.c文件到开发板内核代码树的driver/char目录下。修改开发板内核代码树的driver/char目录下的Makefile文件。添加obj-m += helloworld.o执行命令: make modules在开发板内核代码树的driver/char目录下生成文件helloworld.ko。下载helloworld.ko到开发板上(用串口命令rz)。并加载模块:insmod helloworld.ko卸载模块:rmmod helloworld3.2 通过Makefile编译内核模块linux2.6版本的内核编译需要Linux内核代码树。通用的Makefile文件为:没有定义KERNELRELEASE,则说明是直接从命令行调用的,因此要调用内核构造系统。ifeq ($(KERNELRELEASE),) KERNELDIR ?= /lib/modules/$(shell uname -r)/build # The current directory is passed to sub-makes as argument PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:rm -rf *.o * core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules modules_install clean如果已定义KERNELRELEASE,则说明是从内核构造系统调用的,因此可利用其内建语句。else # called from kernel build system: just declare what our modules are obj-m := hello.o hellop.o endif4 实验代码#include #include MODULE_LICENSE(Dual BSD/GPL);static int hello_init(void)printk(KERN_ALERT Hello, worldn);return 0;static void hello_exit(void)printk(KERN_ALERT Goodbye, cruel worldn);module_init(hello_init);module_exit(hello_exit);5 独立实验(可选做)5.1模块参数传递实验在内核模块程序中加入模块参数,通过加载命令insmod传递模块参数到模块程序中。实验七 编写字符设备驱动程序1 实验目的掌握字符设备驱动的编写掌握阻塞型I/O驱动程序的编写掌握GPIO引脚的控制方法2 实验内容2.1编写LED字符设备驱动编写LED设备的字符驱动,主设备号为:230。LED字符驱动只支持ioctl方法,不提供open,close,read,write等方法。用户使用命令ioctl(cmd参数可以选0或1,arg参数值用来指示第几个LED灯),可以控制LED灯的亮与灭。3 相关知识3.1 驱动程序如何访问硬件。如何操作硬件,需要查看开发板的原理图及所涉及的芯片的数据手册。对于S3C2440,在linux驱动程序中操作其寄存器时,不能使用物理地址,而要使用虚拟地址。它们的转换关系非常简单:#define io_p2v(x) (x) | 0xa0000000) / 物理地址转换为虚拟地址#define io_v2p(x) (x) & 0xa0000000) / 虚拟地址转换为物理地址这些宏在内核include/asm-arm/arch-s3c2440/hardware.h中定义。也可以使用内核include/asm-arm/arch/s3c2440.h中定义的宏,比如要访问GPIO A 的控制寄存器器(物理地址为0x56000000),可以使用宏GPCON(0)。4.2 GPIO引脚介绍开发板带有4 个用户可编程I/O方式LED,如图所示LED 硬件原理图,下表为LED 对应的I/O口。 序号名称GPIO端口1LED1GPB52LED2GPB63LED3GPB74LED4GPB8S3C2440的I/O PORTS含GPA、GPB、GPH八个端口。八个端口的控制寄存器基本一致。下面列出其控制寄存器。GPxCON:用于选择引脚功能。GPxDAT:用于读/写引脚数据。GpxUP:用于确定是否使用内部上拉电阻(x为A、B、H,没有GPAUP寄存器)。PORT A与PORT B-H在功能选择方面有所不同,GPACON中每一位对应一根引脚(共23根引脚)。当某位设为0时,相应引脚为输出引脚,此时我们可以在GPADAT中相应位写入0或1让此引脚输出低电平或高电平;当某位设为1时,相应引脚为地址线或用于地址控制,此时GPADAT无用。一般而言GPACON通常设为全1,以便访问外部存储器件。PORT A我们暂时不必理会。PORT B-H在寄存器操作方面完全相同。GPxCON中每两位控制一根引脚:00表示输入、01表示输出、10表示特殊功能、11保留不用。GPxDAT用于读/写引脚:当引脚设为输入时,读此寄存器可知相应引脚的状态是高是低;当引脚设为输出时,写此寄存器相应位可令此引脚输出低电平或高电平。GpxUP:某位为0时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉。PORT B的引脚5、6、7、8对应LED1-4,在驱动程序中按照上述说明设置GPBCON、GPBDAT这两个个寄存器,即可控制LED的亮灭。内核给我们提供了两个函数来设置GPIO的控制寄存器和数据寄存器,非常方便,它们的代码在include/asm-arm/arch-s3c2440/s3c2440.h中:s3c2410_gpio_cfgpin 设置GPIO引脚的功能(如输入,输出,中断等。)s3c2410_gpio_setpin 设置GPIO引脚电平set_irq_type 设置GPIO引脚中断属性5 实验步骤5.1 LED设备驱动程序LED设备驱动程序提供了应用程序控制访问LED灯的接口。#include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAMEleds#define LED_MAJOR 231static unsigned long led_table = S3C2410_GPB5,S3C2410_GPB6,S3C2410_GPB7,S3C2410_GPB8,;static unsigned int led_cfg_table = S3C2410_GPB5_OUTP,S3C2410_GPB6_OUTP,S3C2410_GPB7_OUTP,S3C2410_GPB8_OUTP,;static int sbc2440_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)switch(cmd) case 0:case 1:if (arg 4) return -EINVAL;s3c2410_gpio_setpin(led_tablearg, !cmd);return 0;default:return -EINVAL;static struct file_operations sbc2440_leds_fops = .owner=THIS_MODULE,.ioctl=sbc2440_leds_ioctl,;static int _init sbc2440_leds_init(void)int ret; int i;ret=register_chrdev(LED_MAJOR,DEVICE_NAME, &sbc2440_leds_fops);if (ret 0) printk(DEVICE_NAME cant register major numbern); return ret;devfs_mk_cdev(MKDEV(LED_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);for (i = 0; i private_data,来区分不同设备。实验八 中断处理实验1 实验目的掌握linux系统中的中断处理掌握tasklet机制的使用掌握定时器的使用方法2 实验内容2.1编写采用中断模式的按键驱动程序对开发板上的按键K1,K2,K3,K4编写驱动,使其工作在中断模式,每压下一个键,就会触发相应的中断程序。3 基础知识3.1 按键的原理开发板附带的4个按键,使用s3c2440的4个外部中断EINT5-8。按键的原理示意图如下:3.2 S3C2440的GPIO中断功能板子附带的简易键盘带有4个用户可编程I/O 方式按键,如图所示, K1-K4使用的s3c2440的4个外部中断EINT0,EINT2,EINT11,EINT19。内核已经给我们提供好了参数,不再需要自己去研究寄存器了。使用外部的中断的流程如下:1)注册中断函数,当中断发生时,将调用此函数。2)设置引脚的中断触发方式,共有五种方式:#define IRQT_RISING(_IRQT_RISEDGE) 上升沿触发#define IRQT_FALLING(_IRQT_FALEDGE) 下降沿触发#define IRQT_BOTHEDGE(_IRQT_RISEDGE|_IRQT_FALEDGE) 双沿触发(上升沿、下降沿都触发)#define IRQT_LOW(_IRQT_LOWLVL) 低电平触发#define IRQT_HIGH(_IRQT_HIGHLVL) 高电平触发3)当中断发生时,读取引脚的电平状态,即可知道是上升沿触发还是下降沿触发。5 实验步骤5.1 中断模式的按键字符驱动程序#include #include #include #include /* for in_interrupt */#include /* for udelay */#include #include #include #define S3C2410_VA_GPIO S3C24XX_VA_GPIO#include #include #include #include #include #include #defineDEBUGstatic int DELAY=10000;#if 0void tasklet_func(void);DECLARE_TASKLET(mytasklet,tasklet_func,0);void tasklet_func(void) printk(haha,we enter the taskletn);#endif static void button_k4_interrupt(int nr, void *devid, struct pt_regs *regs) if(*(volatile unsigned short *)S3C2410_GPFDAT & (0x1)=0)#ifdefDEBUGprintk(Now IRQ_EINT0 K4 down!n);#endifstatic void button_k3_interrupt(int nr, void *devid, struct pt_regs *regs) if(*(volatile unsigned short *)S3C2410_GPFDAT & (0x12)=0) #ifdef DEBUG printk(Now IRQ_EINT2, K3 down!n);#endifstatic void button_k2_interrupt(int nr, void *devid, struct pt_regs *regs)int i; if(*(volatile unsigned short *)S3C2410_GPGDAT & (0x13)=0) #ifdef DEBUG printk(Now IRQ_EINT11, k2 down!n);#endif#if 0 s3c2410_gpio_setpin(S3C2410_GPB5, 0); mdelay(200); #endif static void button_k1_interrupt(int nr, void *devid, struct pt_regs *regs) if(*(volatile unsigned short *)S3C2410_GPGDAT & (0x111)=0) #ifdef DEBUG printk(Now IRQ_EINT19, k1 downn);#endif#if 0 tasklet_schedule(&mytasklet);#endif static int _init HW_button_init(void) int ret = -ENODEV; int delay ; s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_EINT0); s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_EINT2); s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_EINT11); s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPG11_EINT19); set_irq_type(IRQ_EINT0,IRQT_FALLING); set_irq_type(IRQ_EINT2,IRQT_FALLING); set_irq_type(IRQ_EINT11,IRQT_FALLING); set_irq_type(IRQ_EINT19,IRQT_FALLING); ret = request_irq(IRQ_EINT0, button_k4_interrupt, SA_INTERRUPT, button_k4, NULL); if (ret) printk(KERN_INFO request button IRQ failed (%d)n, IRQ_EINT0); return ret; ret = request_irq(IRQ_EINT2, button_k3_interrupt, SA_INTERRUPT, button_k3, NULL); if (ret) printk(KERN_INFO request button IRQ failed (%d)n, IRQ_EINT2); return ret; ret = request_irq(IRQ_EINT11, button_k2_interrupt, SA_INTERRUPT, button_k2, NULL); if (ret) printk(KERN_INFO request button IRQ failed (%d)n, IRQ_EINT11); return ret; ret = request_irq(IRQ_EINT19, button_k1_interrupt, SA_INTERRUPT, button_k1, NULL); if (ret) printk(KERN_INFO request button IRQ failed (%d)n, IRQ_EINT19); return ret; #if 0s3c2410_gpio_cfgpin(S3C2410_GPB5, S3C2410_GPB5_OUTP);s3c2410_gpio_setpin(S3C2410_GPB5, 1);#endif return ret;int _init s3c2410_button_init(void) int ret = -ENODEV; ret = HW_button_init(); if (ret) return ret; return 0;int init_module() s3c2410_button_init();void cleanup_module() free_irq(IRQ_EINT0, NULL); free_irq(IRQ_EINT2, NULL); free_irq(IRQ_EINT11, NULL); free_irq(IRQ_EINT19, NULL);6 独立实验(可选做)6.1 定时器应用使用定时器,通过使用定时器,让LED灯不停闪烁。实验九 网卡驱动实验1 实验目的掌握网卡驱动的程序框架掌握网络协议栈的接口2 实验内容2.1编写虚拟网络接口驱动程序实现一个虚拟回路的网络接口,注册到linux网络子系统中。该网络接口实现的功能是:把任何通过该网络接口发送报文的目标地址与源地址互换,然后提交到本机的协议栈。测试方法:在shell中用ifconfig命令设置该网络接口“my0”的ip地址(如)。然后用ping命令测试同一网段的任一地址,本机都能接收到ping命令的回应。3 基础知识3.1网络驱动模块的注册过程一个网络设备对应于内核就是一个net_device结构。定义在中,该结构包括了网络设备的各种参数和操作函数。当驱动程序准备好后,就可以向内核注册了。1.分配net_device结构。为net_device 结构体分配空间,并初始化其中大部分成员。可以使用alloc_etherdev()函数或者alloc_netdev()函数。alloc_etherdev()申明在,定义在/net/ethemet/eth.c,其中调用了alloc_netdev(),定义在/net/core/dev.c。辅助函数ether_setup定义在/net/ethernet/eth.c。2.手工初始化net_device中的其他成员。Net_device 中还包括了驱动程序自己定义的私有结构体,用户需要初始化其中的成员。3.向内核注册。通过register_netdev()注册,通过unregister_netdev()卸载。3.2 net_devic结构中数据成员1.nameIFNAMSIZ :设备名称2.Unsigned long mem_end;3.Unsigned long mem_start ;设备内存信息,保存了设备使用的共享内存之起始地址和终止地址4.unsigned long base_addr; 网络接口的I/O基地址5.Unsigned char irq: 中断号.6.Unsigned char if_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论