首页 嵌入式linux系统设计与开发实验指导书V1.5.5

嵌入式linux系统设计与开发实验指导书V1.5.5

举报
开通vip

嵌入式linux系统设计与开发实验指导书V1.5.5 嵌入式Linux系统设计与开发 实验指导书 计算机学院 2010年4月 《嵌入式LINUX系统设计与开发》实验指导书纲要 1.目的 辅助《嵌入式linux系统设计与开发》理论教学,提高学生嵌入式方向的实验、实践操作能力及创新开发能力。 2.内容 章节 主要知识点 实验内容 实训目标及要求 学时 实验性质 实验级别 第一章 嵌入式linux开发基础 1. 开发平台简介 2. 开发流程 3. 构建嵌入式linux系统的环境 1. 熟悉嵌入式科研教学平台UP-Techpxa270s...

嵌入式linux系统设计与开发实验指导书V1.5.5
嵌入式Linux系统设计与开发 实验指导书 计算机学院 2010年4月 《嵌入式LINUX系统设计与开发》实验指导书纲要 1.目的 辅助《嵌入式linux系统设计与开发》理论教学,提高学生嵌入式方向的实验、实践操作能力及创新开发能力。 2.内容 章节 主要知识点 实验内容 实训目标及要求 学时 实验性质 实验级别 第一章 嵌入式linux开发基础 1. 开发平台简介 2. 开发 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 3. 构建嵌入式linux系统的环境 1. 熟悉嵌入式科研教学平台UP-Techpxa270s的使用 2. 构建嵌入式linxu系统开发环境 3. 通过minicom或超级终端进行宿主机及开发板的通讯并查看开发板系统目录 1. 掌握嵌入式LINXU系统开发流程 2. 掌握软硬件开发环境的建立及使用 2 验证性 必做 第二章 嵌入式linux系统基础 1. Makefile编写 2. Linux多线程库编程 3. 进程应用程序设计 1. Makefile与Helloworld 2. 生产者——消费者协议 3. 进程管理模拟实验 1. 熟练掌握makefile写法 2. 掌握linux c程序开发,具有使用多线程编程能力 3. 掌握进程应用程序的设计与实现 3 综合性 必做 第三章 嵌入式linux内核 1. Bootloader引导系统 2. Linux内核定制、裁剪及添加 3. 文件系统的构建 1. Blob的重新烧写 2. Linux内核裁剪及编译 3. 文件系统的构建 1. 理解ARM的初始化及引导过程 2. 熟练掌握内核定制、裁剪及添加 3. 掌握busybox构建文件系统 6 设计性 必做 第四章 嵌入式linux接口设计与驱动程序 1. 驱动程序结构 2. Framebuffer机制 3. 触摸屏 4. V4L 5. IDE_CF 6. Usb 1. 虚拟驱动模块实验 2. Lcd控制实验 3. Tslib移植和使用 4. Linux视频V4L驱动实验 5. CF模块、U盘接口实验 1. 熟练掌握驱动程序结构 2. 读懂并理解触摸屏、LCD、等驱动程序与测试程序的设计与编写 6 综合性 选做 第五章 嵌入式linux开源软件移植与应用 1. 嵌入式web服务器goahead 2. 嵌入式数据库SQLite 3. 嵌入式媒体播放器Mplayer 4. Web服务gSOAP 5. Web浏览器Konqueror 6. 开源软件移植的一般过程与注意事项 1. 嵌入式web服务器goahead实验 2. SQLite移植实验 3. Mplayer到ARM平台上的移植 4. Web服务gSOAP实验 5. Web浏览器Konqueror移植 1. 掌握开源软件移植的一般过程 2. 理解相关软件的版本与依赖关系,包括交叉编译器 6 综合性 选做 第六章 嵌入式linux下的通信应用 1. 串口通信 2. 网络通信 3. 蓝牙通信 4. Can总线通信 5. GPRS/GPS通信 1. 串口通信实验 2. socket相关程序设计 3. 蓝牙通信实验 4. Can总线实验 5. GPRS/GPS通信实验 1. 掌握四种常用的通信方式,理解相关的程序设计思路与实现方式 2. 透彻理解can总线原理,熟练掌握基于该总线下的程序设计 6 综合性 选做 第七章 嵌入式图形界面用户编程——QT 1. 嵌入式GUI 2. QT/QTE移植与程序设计 3. Qtopia平台的移植和编程操作 1. Qt图形界面相关程序设计 2. 电子点菜系统 1. 理解QT/QTE与Qtopia的移植过程和相应程序设计方法 2. 掌握qt与qtopia的程序设计 3 设计性 选做 第八章 综合项目实例 1. 嵌入式linux系统的一般设计与开发过程 2. 综合项目开发实践 1. 基于嵌入式平台的电梯监控系统 2. 基于蓝牙的无线点菜系统 3. 基于嵌入式与web service的智能家居系统 1. 掌握嵌入式linux系统一般设计与开发过程 2. 掌握按格式要求,撰写高质量的设计与开发报告,体会软件工程过程 3. 培养学生良好的团队协作精神 4. 培养学生对实际嵌入式项目良好的独立思考和解决问题的能力 - 设计性 选做 3.参考教材 · UP-TECHPXA270-S-LINUX实验指导书 博创科技 · 俞辉 嵌入式linux实验实例实例教程 机械工业出版社 目录 5第一章 嵌入式linux开发基础 51. 开发平台简介 72. 嵌入式Linux 开发流程 8实验1.1:建立嵌入式linux系统开发环境 19第二章 嵌入式linux系统基础 19实验2.1:Makefile和Hello world 22实验2.2:多线程应用程序设计——生产者-消费者协议 26第三章 嵌入式linux内核 26实验3.1:引导装载程序(BOOTLOADER)移植实验-BLOB 33实验3.2:Linux 内核移植与编译实验 36实验3.3:文件系统实验 44第四章 嵌入式linux接口设计与驱动程序 44实验4.1:虚拟驱动模块实验 50实验4.2:LCD控制实验 58实验4.3:触摸屏驱动实验 63实验4.4:IDE_CF卡模块读写实验 66实验4.5:U盘接口实验 70第五章 嵌入式linux开源软件移植与应用 70实验5.1:嵌入式web服务器goahead实验 71实验5.2: SQLite移植实验 72实验5.3: Mplayer到ARM平台上的移植 72实验5.4: Web服务gSOAP实验 73实验5.5: Web浏览器Konqueror移植 75第六章 嵌入式linux下的通信应用 75实验6.1:串行端口程序设计 77实验6.2:网络传输实验 79实验6.3:蓝牙无线通讯实验 86实验6.4:CAN总线实验 88第七章 嵌入式图形界面用户编程——QT 88实验7.1:Qt图形界面相关实验 89实验7.2: 91实验7.3: 93第八章 综合项目实例 93实验8.1: 94实验8.2: 94实验8.3: 第一章 嵌入式linux开发基础 1. 开发平台简介 嵌入式linux系统的实验实践教学中,使用的是pxa270平台。如图,图1-1为up-techpxa270s实验箱正视图。 基于Intel XSCALE 架构最新的PXA270 嵌入式微处理器最高主频可达624MHz,加入了Wireless MMX 技术,大大提升了多媒体处理能力;同时PXA270 还加入了Intel SpeedStep动态电源管理技术,在保证CPU 性能的情况下,最大限度地降低移动设备功耗。PXA270可以广泛应用于PDA、智能手机、PMP 产品中。 图1-1:Up-techpxa270-S实验箱正视图 博创科技的UP-TECHPXA270 教学科研平台主要是面向计算机、软件专业的高端平台,微处理器主频稳定运行在520MHz,可运行WinCE5.0 和Linux 2.6.x 操作系统,支持QT/E、miniGUI 等嵌入式图形界面,提供完整的驱动和应用程序。 UP-TECHPXA270 教学科研平台由处理器核心板、主板及LCD 三部份组成。 UP-TECHPXA270 核心模块资源: 􀂾 基于Intel XScale 架构内核的嵌入式处理器PXA270,内部集成iwmmx 指令,加速处理 器对多媒体数据的 处理速度。 · 系统稳定工作在520MHZ 主频 · 64MB SDRAM、16MB Nor Flash、64MB Nand Flash 库 · UP-TECHPXA270 主板资源: · 10M/100M 以太网 · AC97 音频接口 · 8”TFT LCD,分辩率为640x480 · VGA 接口 · USB 主(host)接口4 个,从(device)接口1 个 · CF 卡接口 · IDE 接口 · SD 卡接口 · PCMCIA 接口(可以扩展有线/无线网路接口等) · PS2 鼠标键盘接口 · CMOS 摄像头接口 · 触摸屏(四线电阻式) · 2 个RS232 标准串口 · JTAG 接口(包括14Pin 和20Pin 标准) · 32 位扩展总线接口,和UP-NetARM2410、UP-NetARM2410-S 平台兼容。 · irDA 接口 · 实时时钟 · IIC、SPI 接口 开箱指南 博创科技UP-TECHPXA270 教学科研平台包含以下部分:开发板、电源、网线、串口线、并口线、并口JTAG 转换线、随机附带光盘。 UP-TECHPXA270 软件资源: · bootloader:blob · 操作系统:linux 2.4.x 和linux 2.6.x 内核 UP-TECHPXA270 应用软件: · mplayer 媒体播放器,实现MPEG4、AVI、WMV 等多种媒体解码。 · GUI:QT/E、miniGUI · 摄像头视频采集 硬件连接 1.UP-TECHPXA270 外围端口说明 · 电源:电源输入插座,直流电9V-12V 输入。 · 串口1,对应了PXA270 处理器的Bluetooth 功能的串口,三线串口标准。 · 串口0,对应了PXA270 处理器的全功能串口,九线串口标准。 · VGA 接口,可以直接和显示器,投影仪等连接。DB19 阴性插座标准。 · USB 主控(host)端口4 个,包括过流保护和ESD 保护,支持热插拔。 · 主板上FPGA,使用Altera 公司的cyclone 系列EP1C3T144。 · USB 设备(device)端口 · 8、10/100M 自适应以太网接口 · 主板上FPGA 的编程接口 · pxa270 的JTAG 接口,包括14Pin 和20Pin 两种标准 · LCD 背光逆变器模块,注意高压! · 12、168Pin 扩展总线插座 · 13、6x6 键盘扫描接口 · 14、PS/2 鼠标键盘接口 · 15、触摸屏接口, · 16、CF 卡接口,此CF 卡工作在IDE 模式。和背面的IDE 硬盘接口公用一个IDE 通道。默认情况下CF 为主IDE 设备,IDE 硬盘为从IDE 设备。 · 17、扩展LCD 接口,支持TFT 、CSTN 等LCD 模式 · 18、MMC 卡接口。 · 19、板载MIC 接口。当音频插座连接以后,MIC 输入自动切换到音频插座。 · 20、音频输入输出插座。 · 21、音量调节电位器旋钮。 · 22、PCMCIA 接口,通过转接器可以支持CF 卡。 · 23、复位按钮。 · 24、电源按钮。其工作模式类似于ATX 电源。系统插上电源,按一下此轻触开关,系统上电。再按一下此轻触开关,系统电源关闭。当系统起来以后,可以通过控制FPGA 寄存器,死锁电源按钮(即,单击轻触开关,对系统没有影响)。但是,可以通过长按此开关3 秒钟,使系统电源关闭。 2.系统硬件资源分配 外设 说明 bank 物理地址范围 总线 中断数 Nor flash 系统启动,存储操做系统内核、参数等信息 0 0x0—0x1000000 16 位 0 Nand Flash 系统的海量存储 1 0x04000000-0x04000008 16 位 0 FPGA 管理系统中断等外设 2 0x08000000-0x08000400 32 位 注1 IDE 系统IDE 和CF 接口 2 0x08800000-0x08800040 32 位 1 PCMCIA 16 位PCMCIA 接口 (3) 0x20000000—0x30000000 16 位 2 网卡 SMC91c111,10/100M 网卡芯片 4 0x10000000—0x10010000 32 位 1 连接系统 首先,连接电源,将随机附带的一根电源线的一头插入到UP-TECHPXA270-S 的电源接口,将电源线的另外一端插入到电源插座中;然后连接串口线,一端连接PC 的串口,另一端连接到如图1所示的串口;最后连接网线,将随即附带的灰色的网线一端连接到UP-TECHPXA270 的网口(靠近电源的),另一端连接到本地的局域网中。 提示:a. UP-TECHPXA270-S 具有两个串口,分别为UART0 和UART1,在本手册中使用UART0,即 下方的串口。 b.随机附带的的网线用作直接连接UP-TECHPXA270-S 和PC c.FPGA 通过PAX270-S 处理器的GPIO0 扩展中断 2. 嵌入式Linux 开发流程 在一个嵌入式系统中使用linux 开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过如下的过程: 1 建立开发环境,操作系统一般使用REDHAT-LINUX,版本7 到9 都可以,选择定制安装或全部安装,通过网络下载相应的GCC 交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。 2 配置开发主机,配置MINICOM,一般的参数为波特率115200,数据位8 位,停止位1,无奇偶校验,软件硬件流控设为无。在WINDOWS 下的超级终端的配置也是这样。MINICOM 软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。配置网络,主要是配置NFS 网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。 3 建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT 等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的ARM7、ARM9 系列芯片,这样就需要编写烧写开发板上FLASH 的烧写程序,网络上有免费下载的WINDOWS 下通过JTAG 并口简易仿真器烧写ARM 外围FLASH 芯片的烧写程序。也有LINUX 下的公开源代码的J-FLASH 程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂家的仿真器当然比较容易烧写FLASH 了,这对于需要迅速开发自己的应用的人来说可以极大提高开发速度,但是其中的核心技术是无法了解的。 4 下载别人已经移植好的LINUX 操作系统,如UCLINUX、ARM-LINUX、PPC-LINUX 等,如果有专门针对你所使用的CPU 移植好的LINUX 操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带MMU 的CPU 可以使用模块方式调试驱动,对于UCLINUX 这样的系统好像只能编译进内核进行调试。 5 建立根文件系统,从www.busybox.net 下载使用BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc 目录下,包括: /etc/init.d/rc.S 、/etc/profile 、/etc/.profile 等, 自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs genromfs 等工具产生烧写映象文件。 6 建立应用程序的FLASH 磁盘分区,一般使用JFFS2 或YAFFS 文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性FLASH(NOR 型)512K-32M,有的系统使用非线性FLASH(NAND 型)8-512M,有的两个同时使用,需要根据应用规划FLASH 的分区 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 7 开发应用程序,可以放入根文件系统中,也可以放入YAFFS、JFFS2 文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于UCOS-II 的方式。 8 烧写内核、根文件系统、应用程序。 9 发布产品。 实验1.1:建立嵌入式linux系统开发环境 一、实验目标: 1.熟悉linux操作系统的使用。 2.掌握嵌入式系统开发环境的建立。 二、预备知识: 掌握linux的基本操作。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 配置网络,配置FTP,配置NFS及使用超级终端。 五、实验步骤: 1. 配置网络 配置网络,包括配置IP 地址、NFS 服务、防火墙。网络配置主要是要安装好以太网卡,对于一般常见的RTL8139 网卡,REDHAT9.0 可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。然后配置宿主机IP 为192.168.0.121。如果是在有多台计算机使用的局域网环境使用此开发设备,IP 地址可以根据具体情况设置。如图1.4-1 所示: 图1.4-1 网络配置 双击设备eth0 的蓝色区域,进入以太网设置界面,如图1.4-2,1.4-3 所示: 图1.4-2 以太网常规设置界面 图1.4-3 以太网路由设置界面 对于REDHAT9.0,它默认的是打开了防火墙,因此对于外来的IP 访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用NFS mount 它,许多网络功能都将无法使用。因此网络安装完毕后,应立即关闭防火墙。操作如下:点击红帽子开始菜单,选择安全级别设置,选中无防火墙。如图1.4-4 所示: 图1.4-4 安全级别设置 在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将iptables 服务的勾去掉,并确保nfs 选项选中。 2. 配置NFS: 点击主菜单运行系统设置->服务器设置->NFS 服务器(英文为:SETUP->SYSTEM SERVICE->NFS),点击增加出现如下在界面,在目录(Drictory):中填入需要共享的路径,在主机(Hosts):中填入允许进行连接的主机IP 地址。并选择允许客户对共享目录的操作为只读(Read-only)或读写(Read/write)。如图1.4-5 所示: 图1.4-5 NFS 基本设置 下图1.4-6 是一些常规选项设置,可以作如下设置。 图1.4-6NFS 常规设置 下图1.4-7 是对客户端存取服务器的一些其他设置,按下图设置。 图1.4-7 NFS 用户访问设置 当将远程根用户当作本地根用户时, 对于操作比较方便,但是安全性较差。最后点确定退出时则完成NFS 配置。配置好后,界面应显示如下图1.4-8 所示: 图1.4-8 配置好的NFS 我们也可以手工编写/etc/exports 文件,其格式如下:共享目录 可以连接的主机(读写权限,其他参数)例如:/up-techpxa270 192.168.0.*(rw,sync)表示将本机的/up-techpxa270 目录共享给ip 地址为192.168.0.1-192.168.0.254 的所有计算机,可以读取和写入。修改好后保存,可以用以下命令开启nfs 服务:/etc/rc.d/init.d/nfs restart配置完成后,可用如下办法简单测试一下NFS 是否配置好了:在宿主机上自己mount 自己,看是否成功就可以判断NFS 是否配好了。例如在宿主机/目录下执行:mount 192.168.0.121:/ up-techpxa270 /mnt/nfs其中192.168.0.121 应修改为您自己主机的IP 地址。然后到/mnt/目录下看是否可以列出/up-techpxa270 目录下的所有文件和目录,可以则说明mount 成功,NFS 配置成功。 3. 配置主机的TFTP 服务 方法(一):用vi 打开“/etc/xinetd.d/tftp”,做相应的修改。 vi /etc/xinetd.d/tftp 如下图示: 图 1.4-9 方法(二) :键入setup ;选择“System services”; 启用相应的服务。 图 1.4-10 图 1.4-11 重启xinetd 服务: /etc/rc.d/init.d/xinetd restart Pxa270 板的配置: 4.设置PC 机minicom 1) 在linux 平台的X window 界面下建立一个终端(右键点击屏幕——>新建终端),在终端的命令行提示符后键入minicom,回车,您就会看到minicom 的启动画面(见图1.4-12)。若没有启动X window 则在命令行提示符后直接键入minicom。 图1.4-12 minicom 启动画面 2) minicom 启动后,先按Ctrl+A 键,再按Z 键(注意不是连续按,Ctrl+A 松开后才按Z),进入 主配置界面(见图1.4-13)。按”O”进入配置界面(见图1-17),按上下键选择Serial port setup, 进入端口设置界面,这里有几个重要选项改为如下值(见图1.4-14): (在Change which setting 后按哪个字母就进入哪项的配置,如按A 进行端口号配置。) A————Serial Device :/dev/ttyS0 (端口号使用串口1) E————BPS/par/bits :/115200 8N1 (波特率) F,E 硬件流,软件流都改为NO,若要使用PC 机的串口2 来接板子的串口1 做监控,改为: /dev/ttyS1 即可。 3) 选好后按ESC 键退出到图1.4-14 所示画面,选择Save setup as df1 保存退出,以后只要启动minicom 就是该配置,无需再做改动。 图1.4-13 主配置界面 图1.4-14 配置界面 图1.4-15 端口设置界面 2.通过minicom 终端对pxa270 板进行网络设置。 连接好开发板连线,上电,通过PC 机minicom 口,以root 身份登陆。 用ifconfig 命令查看当前开发板IP 的设置。修改/etc/rc.sysinit 文件中ifconfig eth0 192.168.0.102 为您自己想要的IP 地址。这里按照缺省的IP 设置值:192.168.0.102。 3.重启开发板,通过终端从PC 机ping 目标板的IP,确保网络连线通畅。 4.将主机中/up-techpxa270 挂载到开发板的/mnt/nfs. mount -o nolock 192.168.0.121:/ up-techpxa270 /mnt/nfs (其中的IP 是主机的, 依个人设置填写) · Windows平台下设置调试串口 首先需要连接PC 串口,进行PC串口设置。连接串口至PC 相应接口,另一端连接在硬件平台的Uart0 上。确认连接无误。打开超级终端软件,进入如下图1-13 所示界面: 图1-13 填入连接名,选择图标,点击“确定”,如下图1-14 所示。 图1-14 连接时选择通讯使用串口,有的PC 可能有两个串口,使用时请确认选择已连接到平台的串口。点击“确定”。 修改波特率为115200bps,数据流控制为“无”,结果如下图1-15 所示: 图1-15 之后点击“确定”。开启PXA270-S 硬件平台电源,监视超级终端输出,等待系统启动,表示配置完毕。如下图1-16 所示。 图1-16 ➔ 挂载RAMFS 分区 RamDisk 是把内存的一部分分配作为一个分区使用。换句话说,把用户的一部分内存,作为一 个硬盘驱动器使用,用户可以格式化,挂载,保存文件等等。RAMFS 就是用于RamDisk 的文件系统。 系统按照默认方式启动的时候,会挂载一个ramfs的文件系统:/tmp。使用者可以按照些下面的 做法,在其它的挂载点上挂载其它的ramfs文件系统: % mkdir -p /ram1 % mount -t ramfs none /ram1 文件传输命令ftp: 5.配置主机的ftp: 􀁶 1.键入setup,选择system services 选项,启用vsftpd 功能。 图 1.4-16 2.启用vsftpd 功能:/etc/rc.d/init.d/vsftpd restart 􀁶 重启机器。 􀁶 使用ftp 服务:(用命令行方式) 1. 用ftp 命令登陆开发板。(开发板的IP:192.168.0.102) 首先启动开发板的网络服务,启动后输入:inetd 然后宿主机端输入: ftp 192.168.0.102 2.以root 用户登陆,无密码. 3.常用命令: 􀁼 cd : 切换ftp 服务器的目录; 􀁼 bye :结束ftp 传输模式; 􀁼 dir (或ls): 显示目录中的文件及子目录列表; 􀁼 get : 下载单一文件; 􀁼 mget:下载多个文件; 􀁼 put: 上传单一文件; 􀁼 mput:上传多个文件; 􀁼 pwd:显示当前目录; 􀁼 mkdir:添加子目录; 􀁼 rmdir:删除子目录; 􀁼 ! :表示执行本机命令;(例如:!mkdir:表示在本机上建目录) 六、思考题: 第二章 嵌入式linux系统基础 实验2.1:Makefile和Hello world 一、实验目标: 1.学会使用makefile 管理项目 2.熟悉arm-linux-gcc交叉编译的使用 二、预备知识: C 语言的基础知识、程序调试的基础知识和方法,LINUX 的基本操作。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 创建一个新目录,并且编写hello.c,start.c和Makefile等文件。之后将已经编写好的文件下载到开发板上运行。 五、实验步骤: 1. 建立工作目录 mkdir 01_hello cd 01_hello 2. 编写程序源代码 在LINUX 下的文本编辑器有许多,常用的是vim, Xwindow 界面下的gedit 等,我们在开发过程中推荐使用vim,用户需要学习vim 的操作方法,请参考相关书籍中的关于vim 的操作指南。 本实验是在终端上打印出一个菱形.一个三角形(由*号构成)及打印一行字符hello,my friends。 主函数文件为start.c: #include "starfun.h" #include "hello.h" #include int main() { star1(); star2(); showhello(); return 0; } 其中所包含的头文件为:hello.h,starfun.h,stdio.h 在starfun.h 中定义了两个函数star1(),star2()打印两个三角形: #ifndef STARFUN_H #define STARFUN_H #define NUM 4 #define NUMBER 3 int star1() { int i,j,k; for(k=1;k<=NUM;++k) { for(i=1;i<=(NUM-k);++i) printf(" "); for(j=1;j<=(2*k-1);++j) printf("*"); printf("\n"); } return 0; } int star2() { int i,j,k; for(k=NUMBER;k>=0;--k) { for(i=1;i<=(NUMBER-k+1);++i) printf(" "); for(j=1;j<=(2*k-1);++j) printf("*"); printf("\n"); } return 0; } #endif 在hello.h 中定义了一个函数hello(),此函数中又调用了starfun()中的star1()函数用来打印一 个三角形. #ifndef HELLO_H #define HELLO_H void hello() { star1(); printf("hello,my friends\n"); } #endif 在hello.c 中对hello 函数进行了调用. void showhello() { hello(); } 3. 编写makefile 文件 由于交叉引用函数很复杂,因此编写了一个简单的makefile 来组合这些头文件及主程序,将此 makefile 命名为:amake。因为所编写的程序要在pxa270 板上运行,因此指定了交叉编译器。 具体的编写如下: #amake file CC= arm-linux-gcc #指定编译器 EXEC=myprog #定义目标文件名 OBJS=star.o hello.o #为生成目标所使用的.o 文件 $(EXEC):$(OBJS) #目标与.o 文件的依赖关系 $(CC) -o $(EXEC) $(OBJS) #生成可执行文件 star.o:starfun.h star.c #star.o 依赖starfun.h,star.c $(CC) -c star.c #生成star.o hello.o:starfun.h hello.h hello.c #hello.o 依赖starfun.h,hello.h,hello.c $(CC) -c hello.c #生成hello.o clean: #clean 伪目标 rm -f *.o $(EXEC) #执行make -f amake clean 时删除所有的.o 文件 4.编译应用程序 在终端上使用make -f amake 命令即可生成名为star 的可执行文件. 如果进行了修改,重新编译则运行: make clean –f amake make -f amake 注意编译、修改程序都是在开发计算机上进行,不要在MINICOM 的终端方式下进行。 5.下载调试 在宿主PC 计算机上启动NFS 服务,并设置好共享的目录,之后在开发板上运行: mount -o nolock 192.168.0.121:/ up-techpxa270 /mnt/nfs (实际IP 地址要根据实际情况修改,确保宿主机和开发板在同一网段)。挂接宿主机的根目录。成功之后在开发板上进入/mnt 目录,便相应进入宿主机的/up-techpxa270 目录,再进入开发程序目录运行刚刚编译好的hello 程序,查看运行结果。 开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重启,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板的过程,当然当调试好程序后,你也可以下载到开发板运行。 六、思考题: 分析01_hello 目录下的Makefile_rule 文件和上一级目录下的Rules.mak 文件,并查阅相关参考书,学习makefile 文件的编写,并尝试用make –f Makefile_rule 命令编译。查阅相关参考书,分析01_hello 目录下的makefile_03 文件的语法,尝试用make –f makefile_03 命令编译,并运行生成的myprog 应用程序,看是否和上边的运行结果一致,体会makefile 项目管理 工程项目管理制度介绍工程项目管理课程设计政府投资项目管理意见建设工程项目管理合同工程项目管理培训总结 方式的优点。 实验2.2:多线程应用程序设计——生产者-消费者协议 一、实验目标: 1.了解多线程程序设计的基本原理。 2.学习pthread 库函数的使用。 二、预备知识: 1. 有C 语言基础。 2. 掌握在Linux 下常用编辑器的使用。 3. 掌握Makefile 的编写和使用。 4. 掌握Linux 下的程序编译与交叉编译过程 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 读懂pthread.c 的源代码,熟悉几个重要的PTHREAD 库函数的使用。掌握共享锁和信号量的使用方法。 五、实验步骤: 1.进入exp/basic/02_pthread 目录,使用vi 编辑器或其他编辑器阅读理解源代码。 2.运行make 产生pthread 可执行文件。 3.切换到minicom 终端窗口,使用NFS mount 开发主机的/up-techpxa270 到/mnt 目录。 4.进入/mnt/exp/basic/pthread 目录,运行./pthread,观察运行结果的正确性,若显示结果太快,可以用以下命令输出显示结果到pthread.txt 文件./pthread >pthread.txt,然后再用cat pthread.txt 察看文件内容,结合程序分析结果。 5.修改一些参数,再次运行调试,加深对多线程的理解。 6.参考源代码: #include #include #include #include "pthread.h" #define BUFFER_SIZE 16 /* Circular buffer of integers. */ struct prodcons { int buffer[BUFFER_SIZE]; /* the actual data */ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ int readpos, writepos; /* positions for reading and writing */ pthread_cond_t notempty; /* signaled when buffer is not empty */ pthread_cond_t notfull; /* signaled when buffer is not full */ }; /*--------------------------------------------------------*/ /* Initialize a buffer */ void init(struct prodcons * b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0; } /*--------------------------------------------------------*/ /* Store an integer in the buffer */ void put(struct prodcons * b, int data) { pthread_mutex_lock(&b->lock); /* Wait until buffer is not full */ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock); } /* Write the data and advance write pointer */ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /* Signal that the buffer is now not empty */ pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock); } /*--------------------------------------------------------*/ /* Read and remove an integer from the buffer */ int get(struct prodcons * b) { int data; pthread_mutex_lock(&b->lock); /* Wait until buffer is not empty */ while (b->writepos == b->readpos) { printf("wait for not empty\n"); pthread_cond_wait(&b->notempty, &b->lock); } /* Read the data and advance read pointer */ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; /* Signal that the buffer is now not full */ pthread_cond_signal(&b->notfull); pthread_mutex_unlock(&b->lock); return data; } /*--------------------------------------------------------*/ #define OVER (-1) struct prodcons buffer; /*--------------------------------------------------------*/ void * producer(void * data) { int n; for (n = 0; n < 1000; n++) { printf(" put-->%d\n", n); put(&buffer, n); } put(&buffer, OVER); printf("producer stopped!\n"); return NULL; } /*--------------------------------------------------------*/ void * consumer(void * data) { int d; while (1) { d = get(&buffer); if (d == OVER ) break; printf(" %d-->get\n", d); } printf("consumer stopped!\n"); return NULL; } /*--------------------------------------------------------*/ int main(void) { pthread_t th_a, th_b; void * retval; init(&buffer); pthread_create(&th_a, NULL, producer, 0); pthread_create(&th_b, NULL, consumer, 0); /* Wait until producer and consumer finish. */ pthread_join(th_a, &retval); pthread_join(th_b, &retval); return 0; } 六、思考题: 1. 加入一个新的线程用于处理键盘的输入,并在按键为ESC 时终止所有线程。 2. 线程的优先级的控制。 第三章 嵌入式linux内核 实验3.1:引导装载程序(BOOTLOADER)移植实验-BLOB 一、实验目标: 学习将BLOB 移植到以PXA270 为主CPU 的UP-TECHPXA270-S 实验仪上的开发过程,通过这个实验,应该掌握如下技能: 1.在BLOB 中添加自己命令的方法。 2.LD 链接脚本语法及编写。 3.ARM 的初始化及引导过程。 4.Linux 内核与BOOTLOADER 之间如何配合。 二、预备知识: 1.LINUX 下C 语言编程的基础知识、程序调试的基础知识和方法; 2.LINUX 环境的基本操作; 3.ARM 汇编语法及基本指令; 4.Autoconf、automake、Configure 等工具的基本使用方法; 5.ARM 芯片的体系结构; 6.可以看懂PXA270 芯片硬件寄存器的英文配置手册。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 根据现有的blob(BLOB也可以从网站:http://www.lart.tudelft.nl/lartware/blob/ 上下载)进行分析,并BLOB 中添加自己的命令。然后再编译生成,下载BLOB 进行调试 五、实验步骤: 1.建立工作目录并解压缩BLOB 软件 tar jxvf blob-xscale.tar.bz2 cd blob-xscale 2.在configure.in 文件中添加自己硬件相关的定义。 case "$board_name" in mainstone) boardname="Intel Mainstone" AC_DEFINE(MAINSTONE, 1, [Intel Mainstone]) BLOB_PLATFORM_OBJ="mainstone.o" BLOB_FLASH_OBJS="strata.o" DIAG_PLATFORM_OBJ="mainstone.o" MEMSETUP="memsetup-bvd.o" use_lcd="yes" ;; 3.在acconfig.h 文件中添加自己硬件相关的定义。 /* Define for manistone */ #undef manistone 4.在include/blob/arch.h 中添加硬件相关的头文件 5.#elif defined MAINSTONE 6.# include 7.添加与硬件相关的头文件include/blob/arch/ mainstone.h 8.此文件定义与CPU 及外围设备相关的寄存器定义和其他常量的定义。 9.将硬件名称添加到”archs”变量中 此变量在/utils/build/build_all 和/utils/build/build_Makefile 文件中. archs="assabet badge4 brutus creditlart h3600 idr jornada720 lart neponset nesa pleb shannon system3 mainstone" 10.将自己特定硬件相关的源代码文件添加到src/blob/Makefile.am 文件中的 EXTRA_blob_rest_elf32_SOURCES 宏变量中。 EXTRA_blob_rest_elf32_SOURCES = \ chkmem.c \ clock.c \ debug.c \ amd32.c \ intel16.c \ intel32.c \ nullflash.c \ assabet.c \ brutus.c \ badge4.c \ clart.c \ h3600.c \ idr.c \ jornada720.c \ lart.c \ nesa.c \ pleb.c \ shannon.c \ lcd.c \ system3.c 上面是blob 原有的文件清单,如果需要裁减或增加,可以修改这里。 11. 以src/blob/assabet.c 为模板,建立自己的FLASH 和串口初始化文件 #include #include #include /*说明FLASH 的块分布*/ /* flash descriptor for Assabet flash */ /* 2x Intel 28F128J3A strataflash (16MB) */ static flash_descriptor_t assabet_flash_descriptors[] = { { size: 2 * 128 * 1024, num: 64, lockable: 1 }, { /* NULL block */ }, }; /*初始化FLASH 的驱动函数和块结构指针*/ static void init_assabet_flash_driver(void) { flash_descriptors = assabet_flash_descriptors; flash_driver = &intel32_flash_driver; } /*加入初始化列表中*/ __initlist(init_assabet_flash_driver, INIT_LEVEL_DRIVER_SELECTION); 初始化串口 static void assabet_init_hardware(void) { u32 *bcr = (u32 *)0x12000000; /* enable RS232 tranceiver and green LED */ *bcr = RS232_ENABLE | GREEN_LED_ENABLE; /* select serial driver */ serial_driver = &sa11x0_serial_driver; } __initlist(assabet_init_hardware, INIT_LEVEL_DRIVER_SELECTION); 12. 建立内存初始化配置控制文件 新建一个文件命名为memsetup-bvd.S, 该文件的主要内容是通过CPU 的寄存器将数据分别写入内存控制寄存器中,pxa270 芯片的SDRAM 有四块区域,其内存分配图如下: 它的内存地址映像范围从0xA0000000 到0xB0000000 共256M 的空间中,它的控制寄存器地址范围从0x48000000 到0x48000044,在UP-TECHPXA270-S 实验仪器上,核心板的SDRAM 接在了SDRAM BANK0 上,使用了一片64M 的SDRAM,同时在nCS0 连接了一片16M NOR FLASH , 在nCS1 连接了一片64M NAND FLASH。 13.将体系结构编号添加到include/blob/linux.h #if defined ASSABET # define ARCH_NUMBER (25) #elif defined BADGE4 ………… #elif defined MAINSTONE # define ARCH_NUMBER (406) #else #warning "FIXME: Calling the kernel with a generic SA1100 architecture code. YMMV!" #define ARCH_NUMBER (18) #endif 14.修改运行configure 配置板子. configure 脚本的主要作用体现在可以提供对环境的配置和检查,还可以针对特定硬件编写特定的配置参数,在多平台系统中或者象BLOB 这样的支持多个硬件开发板的软件中是非常有意义的。 由于BLOB 是按照LINUX 的通常规则编写, 使用了autoconf 、automake、autohead 等软件,其安装配置方法是: · 运行configure 加配置参数 · 运行make configure 脚本由autoconf 根据configure.am 源代码产生,因此用户需要修改configure.am 文件,再运行autoconf,不要直接修改configure。 15.修改src/blob/Makefile.am src/blob/Makefile.am 文件是最主要的Makefile,它直接控制产生的最终BLOB 文件,在这个文件中定义了第一阶段和第2 阶段的目标代码产生的过程及其依赖关系;以及最终blob 文件的组装过程。我们可以将自己的特定代码加入其中,以达到自己需要的功能。 src/blob/Makefile.am 文件的内容较多,大家可以直接查看源代码,Makefile 的语法规则,可以参考其他相关的书籍。 16. 编写自己的FLASH 驱动程序 以src/blob/sst16.c 程序为模板,针对自己的开发板上的FLASH 完成相应的驱动函数: /* flash driver structure */ flash_driver_t sst16_flash_driver = { erase: flash_erase_sst16, write: flash_write_sst16, lock_block: flash_lock_block_sst16, unlock_block: flash_unlock_block_sst16, query_block_lock: flash_query_block_lock_sst16 }; 可以将src/blob/sst16.c 复制为amd32.c,之后修改添加自己的代码,并将amd16.c 加入src/blob/Makefile.am 中。 17. 编译及下载调试 运行make 产生blob 文件,blob 放在src/blob 目录下,通过JTAG 仿真器下载到FLASH 中,具体操作如下: 首先,把并口线插到PC 机的并口,把并口另一端与并口JTAG 转换线相连,再与开发板的14 针JTAG 口相连;然后,把附带光盘中目录“tools\JFlash_MM”下的整个GIVEIO 文件夹拷贝到C:\WINDOWS 下,并把该目录下的giveio.sys 文件拷贝到C:\WINDOWS\system32\drivers 下;接着,在控制面板里,选添加硬件>下一步>选-是我已经连接了此硬件>下一步>选中-添加新的硬件设备>下一步>选中安装我手动从列表选择的硬件>下一步>选择-显示所有设备>选择-从磁盘安装-浏览,指定驱动为C:\WINDOWS\GIVEIO\giveio.inf 文件,点击确定,安装好驱动。接着,把JFlash_MM 整个目录copy 到D 盘下,并把附带光盘中目录“img”下的blob映象文件拷贝到该目录下,在程序-附件-msdos 下,进入该目录,运行JFlashmm.exe 命令如下: Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\taoyong.ITM-TY>d: D:\>cd JFlash_MM D:\JFlash_MM>JFlashmm.exe Usage: >JFLASHMM [*PLAT][*IMAGE][P,V,E,T,I,N][ADDR][INS, PAR][NOD, DEB][A, D] * = required parameter Optional parameters assume the first item in the list. Where: [PLAT] =The name of the platform data file without the .DAT. [IMAGE] =The name of the image to program in flash. [P,V,E,T,I,N] where: P = Program and verify. This is the default if no command specified. V = Verify only. E = Erase entire flash device. T = Test every block of flash by programming it. Use 'Testfile.bin.' I = Identify processor step and flash type. No programming done. N = Program the flash but skip the verify. Use for stable systems. [ADDR] =Hex byte address to start. No leading 0X, assumes 0 [INS, PAR] =Insight IJC cable, or passive parallel [NOD, DEB] =NODebug (Normal) or DEBug mode [A, D] =(A)sk or (D)on't ask any questions Example 1: JFlashmm DBPXA250 MyImage.bin P 0 INS Example 2: JFlashmm DBPXA250 MyImage.bin Enter platform data file name: bc16 JFLASH Version 5.01.007 COPYRIGHT (C) 2000 - 2003 Intel Corporation PLATFORM SELECTION: Processor= PXA27x Development System= Mainstone Data Version= 1.00.001 Enter binary file name: blob PXA27x revision C0 Found flash type: 28F128J3A Erasing block at address 0 Starting programming Using BUFFER programming mode... Writing flash at hex address b2e0, 97.75% done Programming done Starting Verify Verifying flash at hex address ae7c, 95.35% done Verification successful! 注:bc16.dat 为准对270 板子的定义文件,但在命令行不能加后缀".dat",否则报错! 最后,烧录后关闭电源,拔掉JTAG 与开发板的连线,并用串口线,网线链接PC 和开 发板,重新上电,blob 开始运行。进行运行调试,其界面如下图: 18. 添加自己的命令(显示内存数据md) 在/src/blob/main.c 中添加一个函数命名为mem_display。参考代码如下: static u32 memaddr=0; static int mem_display(int argc, char *argv[]) { int i; if(argc >1)strtou32(argv[1], &memaddr); for( i = 0 ; i<64; i++){ if(i%4 ==0){ if(i>0)SerialOutputString("\n"); SerialOutputHex(memaddr); SerialOutputString(": "); } SerialOutputHex( * ((u32 *)(memaddr))); SerialOutputString(" "); memaddr+=4; } SerialOutputString(" \n"); return 0; } static char mdhelp[] = "md address \n" "show content of the memory address \n"; __commandlist(mem_display, "md", mdhelp); 六、思考题: 实验3.2:Linux 内核移植与编译实验 一、实验目标: 1.了解linux内核的结构。 2.具有编译linux内核的能力。 3.了解一个操作系统的构造。 二、预备知识: 1.C语言基础知识。 2.掌握linux环境下vi编译器的使用。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 重新编译一个ARM系统内核,然后烧写到开发板进行启动。 五、实验步骤: Linux 内核的裁剪与编译看上去是个挺简单的过程.只是对配置菜单的简单选择.但是内核配置菜单本身结构庞大,内容复杂.具体如何选择却难住了不少人.因此熟悉与了解该菜单的各项具体含义就显得比较重要.我们现在就对其作一些必要介绍: Linux 内核的编译菜单有好几个版本,你运行: 1)make config:进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍. 2)make menuconfig:进入我们熟悉的menuconfig 菜单,相信很多人对此都不陌生. 3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。 所有内核配置菜单都是通过Config.in 经由不同脚本解释器产生.config.而目前刚刚推出的2.6.X 内核用QT 图形库.由KConfig 经由脚本解释器产生.这两版本差别还挺大.从我个人角度就是爱用新东西.2.6.X 的xconfig 菜单结构清晰,使用也更方便。2.4.X 版本xconfig 配置菜单,2.4.X 版本menuconfig 配置菜单,2.6.X 版本 xconfig 配置菜单分别如下图4.2-4,4.2-5,4.2-6 所示: 图4.2-4 2.4.X 版本xconfig 配置菜单 图4.2-5 2.4.X 版本menuconfig 配置菜单 图4.2-6 2.6.X 版本 xconfig 配置菜单 在选择相应的配置时,有三种选择方式,它们分别代表的含义如下: Y--将该功能编译进内核 N--不将该功能编译进内核 M--将该功能编译成可以在需要时动态插入到内核中的模块 如果你是使用的是make xconfig,那使用鼠标就可以选择对应的选项。若使用的是make menuconfig,所以需要使用空格键进行选取。在每一个选项前都有一个括号, 有的是中括号有的是尖括号,还有圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。(注:其中有不少选项是目标板开发人员加的,对于陌生选项,自己不知道该选什么时建议使用默认值)编译内核: 进入本次实验目录 tar jxvf up-linux-2.6.9-release.tar.bz2 ln –s linux-2.6.9 linux cd linux make clean make dep make bzImage 生成的二进制文件为zImage 存储在./arch/arm/boot/zImage。 把生成的zImage 文件拷贝到PC 机的tftp 服务目录/tftpboot/下,在进行以下操作前请确保你已按照第一章的内容配置好你的PC 机TFTP 服务器(关闭防火墙及打开FTP服务)。 烧录内核: 1.启动pxa270 开发板,按ctl+c 组合键进入blob 2.配置tftp 服务: 打开PC 机的tftp 服务,关闭防火墙; 在blob 下使用ifconfig server 192.168.0.43 (192.168.0.43 为你的tftp 服务器ip)配置服务器IP,你需要根据自己实际的IP地址进行修改。 注意只能一次配置有效,若重启开发板需要再次配置。 3.可以输入help 查看blob 下的命令,输入help command 查看命令参数。 4.按照以下命令烧写zImage 到Ram: tdownload kernel 5.按照以下命令烧写zImage 到flash: Flash kernel 六、思考题: 1.烧写一下你编译出来的内核看看运行是什么情况。 2.你可以在“内核裁减与配置”一步中做一些改动,如增加一个你熟悉的模块,编译内核然后烧写并运行它看该模块工作是否正常,这就为下一步驱动程序开发做准备。 实验3.3:文件系统实验 一、实验目标: 1.了解UP-TECHPXA270-S 板的文件系统结构 2.了解文件系统的生成过程 3.完成一个简单的文件系统生成步骤 4.了解busybox、mkfs.jffs2 工具 二、预备知识: 1.熟悉linux 下文件目录结构 2.熟悉linux 下常用命令的使用 3.掌握Makefile 的编写和使用。 4.掌握Linux 下的程序编译与交叉编译过程 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 使用busybox 生成文件系统中的命令部分,使用mkfs.jffs2 工具制作文件系统,并完成将文件系统放置到开发板的烧写工作。 五、实验步骤: 1. UP-TECHPXA270-S Linux 文件系统构建方案: 1.1 根文件系统: 根文件系统是系统启动时挂载的第一个文件系统,其他的文件系统需要在跟文件系统目录中建立节点后再挂载。UP-TECHPXA270-S 有一个16M 大小的NORFLASH,根文件系统是建立在该flash 的后大半部分。该flash 的前小半部分用来存放bootloader 和kernel 映像。出于安全和稳定性考虑,UP-TECHPXA270-S 根文件系统选用了JFFS2 文件系统格式。 1.2.用户YAFFS 文件系统: 为了得到比JFFS2 文件系统格式更快的读写速度,用户文件系统采用YAFFS 格式。用户文件系统挂载于根文件系统下的/mnt/yaffs 目录。UP-TECHPXA270-S 有一个64M 大小的NANDFLASH,用户YAFFS 文件系统建立在该flash 上。 1.3 临时文件系统: 为了避免频繁的读写操作对Flash 造成的伤害,系统对频繁的读写操作的文件夹采用了Ramfs文件系统。根目录下的/var,/tmp 目录为Ramfs 临时文件系统的挂载点。综上所述,这几类文件系统在系统中的关系如下图所示: 2 文件系统构建流程 在嵌人式Linux 系统中混合使用JFFS2、YAFFS 和Ramfs 三种文件系统的实现思路如下: 配置内核:将内核对MTD,JFFS2,YAFFS 以及Ramfs 文件系统的支持功能编译进内核。划分Flash分区:对Flash 物理空间进行分区,以便在不同的分区上存放不同的数据,采用不同的文件系统格式;必要时编写MAPS 文件。今修改系统脚本:在系统启动后利用脚本挂载文件系统。今创建文件系统镜像文件:利用工具生成文件系统镜像文件,并通过Flash 烧写工具将镜像文件烧写到Flash 物理空间。这几个步骤的详细过程如下。 2.1 内核配置(运行make menuconfig) (1) 配置MTD·要使用JFFS2 和YAFFS 文件系统,首先需要配置MTD.在Memory Technology Devices (MTD) --->选项中选中如下选项: <*> Memory Technology Device (MTD) support MTD 支持 [*] MTD partitioning support MTD 分区支持 <*> Direct char device access to MTD devices 字符设备的支持 <*> Caching block device access to MTD devices 块设备支持 RAM/ROM/Flash chip drivers ---> 对RAM/ROM/Flash 芯片驱动支持 <*> Detect flash chips by Common Flash Interface (CFI) probe CFI 接口检测 [*] Flash chip driver advanced configuration options [*] Specific CFI Flash geometry selection [*] Support 16-bit buswidth [*] Support 1-chip flash interleave <*> Support for RAM chips in bus mapping <*> Support for Intel/Sharp flash chips Intel 芯片支持 Mapping drivers for chip access ---> <*> CFI Flash device mapped on UP-TECHPXA270 XScale eval board UP-TECHPXA270 分区映射 NAND Flash Device Drivers ---> UP-TECHPXA270 的NAND Flash 支持 <*> NAND Device Support <*> Nand flash on PXA27x board Detect flash chips by Common Flash Interface (CFI)probe:。 Support 32-bit buswidth:32 位总线 Support 2-chip flash interleave:2 片Flash Support for Intel/Sharp flash chips : Intel 芯片支持 CFI Flash device mapped on xxx board: Flash。 (2) 配置文件系统。 File systems ---> 在内核配置的文件系统配置选单里选择如下几项: <*> Ext3 journalling file system support 对Ext3 文件系统的支持 [*] Ext3 extended attributes <*> Kernel automounter version 4 support (also supports v3) 文件系统自动挂载支持 DOS/FAT/NT Filesystems ---> 对DOS/FAT 文件系统的支持 <*> MSDOS fs support <*> VFAT (Windows-95) fs support Pseudo filesystems ---> 对/proc 和/dev 设备文件系统的支持 [*] /proc file system support [*] sysfs file system support [*] /dev file system support (OBSOLETE) [*] Automatically mount at boot Miscellaneous filesystems ---> <*> Journalling Flash File System v2 (JFFS2) support 对JFFS2 文件系统的支持 [*] JFFS2 write-buffering support [*] Advanced compression options for JFFS2 [*] JFFS2 ZLIB compression support [*] JFFS2 RTIME compression support [*] JFFS2 RUBIN compression support <*> YAFFS default mode (Yet Another Flash File System (YAFFS) support 对YAFFS文件系统的支持 Network File Systems ---> 对NFS 网络文件系统的支持 <*> NFS file system support [*] Provide NFSv3 client support Journalling Flash File System v2 (JFFS2) support; Compressed ROM file system support; Virtual memory file system support (Tmpfs)。 2.2 根文件系统(Nor Flash)的实现 (1) 内核对根文件系统的支持 利用CFI Flash device mapped on UP-TECHPXA270 XScale eval board 选项定义的配置宏可以在drivers/mtd/maps/目录下找到相应的maps 文件,如果没有可以参照已有的maps 文件写一个。在这个文件里,需要将Flash 芯片的物理地址转换成虚拟地址,并将虚拟首地址、Flash 空间大小、总线宽度等填人到一个static struct map_ info 类型的结构中,同时要将Flash 的字节、半字、字的读写操作和块拷贝操作等注册到这个结构中,这个结构是供CFI 接口检测用的。接下来,就是划分Flash 分区,向MTD 添加自己的Flash 分区表: static struct mtd_partition pxa27x_partitions[] = { { #if 0 .name = "Bootloader", .size = 0x00040000, .offset = 0, .mask_flags = MTD_WRITEABLE /* force read-only */ },{ .name = "Kernel", .size = 0x00200000, .offset = 0x00100000, },{ #endif .name = "Filesystem", /*分区名*/ .size = MTDPART_SIZ_FULL, /*分区大小./ .offset = 0x00300000 // 3 MB /*分区物理起始地址*/ } }; 这个数组的每一项对应一个MTD block 设备比如第0 项即mtdblock/O,第1 项即mtdblock/l, 以此类推。需要注意的是,必须把用做根目录的设备作为启动参数传递给内核。比如如果使用第0 项,即JFFS2 分区作为根文件系统,则需要通过bootloader 将这个参数传递给内核。当然,也可以在内核配置的时候设置默认的内核启动参数,比如:Default Kernel command line: “root=/dev/mtdblock/0 console=ttyS0,115200 mem=64M noinitrd rootfstype=jffs2 init=/linuxrc”。 在内核启动过程中,内核会在/dev/mtdblock/0 分区挂在根文件系统,这就要求我们把JFFS2格式根文件系统烧写到/dev/mtdblock/0 分区,也就是Nor Flash 起始地址为3M 的地方。 (2)制作JFFS2 格式的根文件系统 一个使用linux 内核的嵌入式系统中的root 文件系统必须包括支持完整linux 系统的全部东西,因此,它至少应包括:基本文件系统结构;至少含有目录/dev、/proc、/bin、/etc、/lib、/usr;最基本的应用程序,如sh、ls、cp、mv 等;最低限度的配置文件,如inittab、fstab 等;设备:/dev/null、/dev/console、/dev/ tty*、/dev/ttyS*、对应flash 分区的设备节点等;基本程序运行所需的函数库。但由于嵌入式系统资源相对紧缺,在构建的时候要根据系统进行定制。 由于条件及时间有限,实验中仅介绍了其中的一部分,有兴趣的同学可以自己尝试进行其他的工作。 小型嵌入式 Linux 系统安排 root 文件系统时有一个常用的利器:BusyBox。Busybox 是Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发,使用在 Debian 的安装程序中。后来又有许多 Debian developers 贡献力量,这其中尤推 busybox 目前的维护者 Erik Andersen,他患有癌症,可是却是一名优秀的自由软件开发者。 Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的 vi 编辑器,以及其他诸如 sed, ifconfig, mkdir, mount, ln, ls, echo, cat ... 等等这些都是一个正常的系统上必不可少的,但是如果我们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消。可是 busybox 有全部的这么多功能,大小也不过 100K 左右。而且,用户还可以根据自己的需要,决定到底要在 busybox中编译进哪几个应用程序的功能。这样的话,busybox 的体积就可以进一步缩小了。 将文件系统放置到开发板之前需要用mkfs.jffs2 工具打包,我们所使用的物理文件系统是jffs2(基于flash 的日志文件系统),这个工具可以将制作好的文件系统按照jffs2 支持的格式进行压缩。mkfs.jffs2 的具体使用参数可以通过运行mkfs.jffs2 --help 来获得。 a)解压根文件系统,生成root 目录 tar jxf up-techpxa270-root-2006-10-10.tar.bz2 b) 解压busybox cd up-techpxa270/exp/root/ tar zxf busybox-1.00-pre9.tar.gz cd busybox-1.00-pre9 c) 配置,安装busybox make menuconfig 配置界面如图所示: 进行到这一步时注意: General Configuration ---> [*] Use the devpts filesystem for Unix98 PTYs Build Options ---> [*] Build BusyBox as a static binary (no shared libs) [*] Do you want to build BusyBox with a Cross Compiler? 选择交叉编译(/usr/local/arm-linux/bin/arm-linux-) Cross Compiler prefix 回车将路径改为/opt/crosstool/arm-linux/bin/arm-linux Installation Options ---> [ ] Don't use /usr Init Utilities ---> 全都不要 busybox 配置界面 Login/Password Management Utilities ---> 全都不要 Networking Utilities ---> 此选项中[ ] route 不可选否则编译出错 * make * make dep * make PREFIX=./root install d) 生成JFFS2 文件系统 ./mkfs.jffs2 -r root -o rootfs.img -e 0x20000 --pad=0xd00000 选项说明: -r: --root=DIR,由目录生成镜像文件 -e:Flash 擦除扇区大小,默认为64KB,此处指定为128KB --pad:指定创建的根文件系统的大小 e) 配置tftp 服务 打开PC 机的tftp 服务,关闭防火墙; 在blob 下使用ifconfig server 192.168.0.43(192.168.0.43 为你的tftp 服务器ip)配置服务器IP,注意:只能一次配置有效,若重启开发板需要再次配置。 f) 按照以下命令烧写rootfs.img 到Ram: tdownload ramdisk g) 按照以下命令烧写rootfs.img 到flash: Flash ramdisk h) 在blob下启动Linux: boot 2.3 YAFFS 用户文件系统(64M Nand Flash)的实现 用户文件系统64M Nand Flash 作为一个区,其信息在内核/driver/mtd/nand/nand_ids.c nand_flash_dev 结构中定义。 struct nand_flash_dev nand_flash_ids[] = { {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0}, …………………………………………………………………… {"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, 0}, {"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, 0}, {"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16}, {"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16}, {"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, 0}, …………………………………………………………………… } Linux 内核在启动中会自动检测主板上的Nand flash。 内核driver/mtd/nand/ pxa27x_nand.c 文件为UP-TECHPXA270 64M Nand flash 的设备驱动,在其中的pxa27x_init(void)函数中,用add_mtd_device(pxa27x_mtd)向内核添加了另一个mtd 设备,该设备为/dev/mtdblock/1。 在UP-TECHPXA270 开发板的内核和根文件系统启动后,在/etc/fstab 中对YAFFS 文件系统进行了挂载。 /dev/mtdblock/1 /mnt/yaffs yaffs defaults 1 1 挂载后就可以往/mnt/yaffs 目录下读写文件了。至此,根文件系统和YAFFS 文件系统可以在UP-TECHPXA270 开发板上使用了,可以通过以下命 令查看系统文件系统信息: [root@Linux etc]#df Filesystem 1k-blocks Used Available Use% Mounted on /dev/root 13312 9232 4080 69% / /dev/mtdblock/1 65520 27748 37772 42% /mnt/yaffs [root@Linux etc]#cat /proc/mtd dev: size erasesize name mtd0: 00d00000 00020000 "Filesystem" mtd1: 04000000 00004000 "NAND 64MiB 3,3V 8-bit" [root@Linux etc]# 2.4 Ramfs 文件系统的实现 在linux2.6 内核下,Ramfs 文件系统的实现很简单。因为我们前边编译内核选项时已经把对Ramfs 文件系统的支持选中并编译到内核,所以我们这里直接挂载即可。 在UP-TECHPXA270 开发板中,/etc 下的rc.sysinit 文件中对Ramfs 文件系统进行了挂载: rc.sysinit:mount -t ramfs ramfs /var rc.sysinit:mount -t ramfs ramfs /tmp 2.5 Mkdosfs/ext3 文件系统的实现 Mkdosfs 和ext3 文件系统的实现很类似,这里只说明ext3 文件系统的实现。假设我们要把开发板上CF 卡格式化为ext3 文件系统。插好CF 卡,并上电,在开发板终端输入: ./mkfs.ext3 /dev/hdbp1 // 用这个格式化cf 卡 格式化完后用 mount -t ext3 /dev/hdbp1 /mnt/hdbp1/ 把CF 卡设备挂载到/mnt/hdbp1下,然后就可以向格式为ext3 的/mnt/hdbp1 目录下写内容了。 六、思考题: 第四章 嵌入式linux接口设计与驱动程序 实验4.1:虚拟驱动模块实验 一、实验目标: 1.学习在LINUX 下进行驱动设计的原理。 2.掌握使用模块方式进行驱动开发调试的过程。 二、预备知识: 1. 有C 语言基础。 2. 掌握在LINUX 下常用编辑器的使用。 3. 掌握Makefile 的编写和使用。 4. 掌握Linux 下的程序编译与交叉编译过程。 5. 有驱动开发的基本知识。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 在PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。 五、实验步骤: 1、 阅读相关书籍,理解驱动的体系结构和接口实现过程。 2、 编写驱动源代码和Makefile。 参考驱动代码demo.c 如下,其中的mydemo_read,mydemo_write 函数完成驱动的读写接口功能,do_write 函数实现将用户写入的数据逆序排列,通过读取函数读取转换后的数据。这里只是演示接口的实现过程和内核驱动对用户的数据的处理。Mydemo_ioctl 函数演示ioctl 调用接口的实现过程。 #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include #include #include #include #include /* printk() */ #include /* kmalloc() */ #include /* everything... */ #include /* error codes */ #include /* size_t */ #include #include /* O_ACCMODE */ #include /* COPY_TO_USER */ #include /* cli(), *_flags */ #define DEVICE_NAME "mydemo" #define mydemo_MAJOR 254 #define mydemo_MINOR 0 static int MAX_BUF_LEN=1024; static char drv_buf[1024]; static int WRI_LENGTH=0; /*********************************************************************/ /*逆序排列缓冲区数据*/ static void do_write() { int i; int len = WRI_LENGTH; char tmp; for(i = 0; i < (len>>1); i++,len--){ tmp = drv_buf[len-1]; drv_buf[len-1] = drv_buf[i]; drv_buf[i] = tmp; } } /*********************************************************************/ static ssize_t mydemo_write(struct file *filp,const char *buffer, size_t count) { if(count > MAX_BUF_LEN)count = MAX_BUF_LEN; copy_from_user(drv_buf , buffer, count); WRI_LENGTH = count; printk("user write data to driver\n"); do_write(); return count; } /*********************************************************************/ static ssize_t mydemo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) { if(count > MAX_BUF_LEN) count=MAX_BUF_LEN; copy_to_user(buffer, drv_buf,count); printk("user read data from driver\n"); return count; } /*********************************************************************/ static int mydemo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd){ case 1:printk("runing command 1 \n");break; case 2:printk("runing command 2 \n");break; default: printk("error cmd number\n");break; } return 0; } /*********************************************************************/ static int mydemo_open(struct inode *inode, struct file *file) { sprintf(drv_buf,"device open sucess!\n"); printk("device open sucess!\n"); return 0; } /*********************************************************************/ static int mydemo_release(struct inode *inode, struct file *filp) { MOD_DEC_USE_COUNT; printk("device release\n"); return 0; } /*********************************************************************/ static struct file_operations mydemo_fops = { owner: THIS_MODULE, write: mydemo_write, read: mydemo_read, ioctl: mydemo_ioctl, open: mydemo_open, release: mydemo_release, }; /*********************************************************************/ #ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_demo_dir, devfs_demoraw; #endif /*********************************************************************/ static int __init mydemo_init(void) { #ifdef CONFIG_DEVFS_FS devfs_demo_dir = devfs_mk_dir(NULL, "mydemo", NULL); devfs_demoraw = devfs_register(devfs_demo_dir, "0", DEVFS_FL_DEFAULT, mydemo_MAJOR, mydemo_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&mydemo_fops, NULL); #else int result; SET_MODULE_OWNER(&mydemo_fops); result = register_chrdev(mydemo_MAJOR, "scullc", &mydemo_fops); if (result < 0) return result; // if (mydemo_MAJOR == 0) mydemo_MAJOR = result; /* dynamic */ #endif printk(DEVICE_NAME " initialized\n"); return 0; } /*********************************************************************/ static void __exit mydemo_exit(void) { unregister_chrdev(mydemo_MAJOR, "mydemo"); //kfree(demo_devices); printk(DEVICE_NAME " unloaded\n"); } /*********************************************************************/ module_init(mydemo_init); module_exit(mydemo_exit); 参考Makefile 如下: KERNELDIR = /usr/src/linux #KERNELDIR = /up-techpxa270/exp/kernel/01_kernle/linux INCLUDEDIR = $(KERNELDIR)/include #CROSS_COMPILE=arm-linux- AS =$(CROSS_COMPILE)as LD =$(CROSS_COMPILE)ld CC =$(CROSS_COMPILE)gcc CPP =$(CC) -E AR =$(CROSS_COMPILE)ar NM =$(CROSS_COMPILE)nm STRIP =$(CROSS_COMPILE)strip OBJCOPY =$(CROSS_COMPILE)objcopy OBJDUMP =$(CROSS_COMPILE)objdump CFLAGS += -I.. CFLAGS += -Wall -O -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) TARGET = demo_pxa.o hello.o test_demo all: $(TARGET) demo_pxa.o: demo.c $(CC) -c $(CFLAGS) $^ -o $@ hello.o: hello.c $(CC) -c $(CFLAGS) $^ -o $@ test_demo: test_demo.o $(CC) $^ -o $@ install: install -d $(INSTALLDIR) install -c $(TARGET).o $(INSTALLDIR) clean: rm -f *.o *~ core .depend 其中的: #KERNELDIR = /up-techpxa270/exp/kernel/01_kernle/linux #CROSS_COMPILE=arm-linux- 两行宏变量定义用于使用arm -linux-gcc 编译器编译驱动,适用于UP-TECHPXA270-S 平台。默 认使用gcc 编译器,使用X86 PC 平台。 3、编写用户级测试程序 参考代码test.c 如下,使用命令: gcc test.c –o test 直接编译即可。 #include #include #include void showbuf(char *buf); int MAX_LEN=32; int main() { int fd; int i,j,k; char buf[255]; for(i=0; ievbit); /* * If delay and period are pre-set by the driver, then autorepeating * is handled by the driver itself and we don't do it in input.c. */ init_timer(&dev->timer); if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) { dev->timer.data = (long) dev; dev->timer.function = input_repeat_key; dev->rep[REP_DELAY] = 250; dev->rep[REP_PERIOD] = 33; } INIT_LIST_HEAD(&dev->h_list); list_add_tail(&dev->node, &input_dev_list); list_for_each_entry(handler, &input_handler_list, node) if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) if ((id = input_match_device(handler->id_table, dev))) if ((handle = handler->connect(handler, dev, id))) input_link_handle(handle); #ifdef CONFIG_HOTPLUG input_call_hotplug("add", dev); #endif #ifdef CONFIG_PROC_FS input_devices_state++; wake_up(&input_devices_poll_wait); #endif } 此函数的作用是把我们定义的输入设备通过添加到输入设备链表中。最大输入设备个数是个。任何input 类型的输入设备都要通过该函数向内核注册,在Pxa270 开发平台启动后,我们可以通过Ls 命令查看输入设备: [root@Pxa270 root]$ls /dev/input event0 event1 event2 event3 mice 在生成一个新设备时,它一定要包含头文件,代表本驱动作为输入设备驱动的一个子设备,ucb1400 也不例外。 在ucb1x00.h 文件中对UCB1400 的寄存器地址进行了映射。如下代码所示: #ifdef CONFIG_ARCH_PXA /* ucb1400 aclink register mappings: */ #define UCB_IO_DATA 0x5a #define UCB_IO_DIR 0x5c #define UCB_IE_RIS 0x5e #define UCB_IE_FAL 0x60 #define UCB_IE_STATUS 0x62 #define UCB_IE_CLEAR 0x62 #define UCB_TS_CR 0x64 #define UCB_ADC_CR 0x66 #define UCB_ADC_DATA 0x68 #define UCB_ID 0x7e /* 7c is mfr id, 7e part id (from aclink spec) */ #define UCB_ADC_DAT(x) ((x) & 0x3ff) ………………………………………………………….. 在ucb1x00_ts.c 文件中,主要完成对UCB1400 的初始化与注册工作。在static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts)函数里对UCB1400 的寄存器进行初始化: static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts) { if (ts->ucb->id == UCB_ID_1400_BUGGY) ucb1x00_reg_write(ts->ucb, UCB_TS_CR, UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | UCB_TS_CR_MODE_INT); else ucb1x00_reg_write(ts->ucb, UCB_TS_CR, UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | UCB_TS_CR_MODE_INT); } 并在static inline int ucb1x00_ts_register(struct ucb1x00_ts *ts)函数中调用input_register_device(&ts->idev)函数对触摸屏设备进行了注册,这将向输入设备驱动链表增加ts->idev 设备结构,并且调用设备句柄模式input_link_handle(handle)函数通知所有输入设备一个新的输入设备产生了。 static inline int ucb1x00_ts_register(struct ucb1x00_ts *ts) { ts->idev.name = "Touchscreen panel"; ts->idev.open = ucb1x00_ts_open; ts->idev.close = ucb1x00_ts_close; __set_bit(EV_ABS, ts->idev.evbit); __set_bit(ABS_X, ts->idev.absbit); __set_bit(ABS_Y, ts->idev.absbit); __set_bit(ABS_PRESSURE, ts->idev.absbit); input_register_device(&ts->idev); return 0; } 触摸屏的基本事件类型为EV_ABS 事件,本事件通过input_report_abs (struct input_dev *dev, int code, int value),向输入设备注册事件。在注册EV_ABS 事件时,需要注意的地方是在调用input_register_devices 之前,你需要针对你的设备的绝对坐标,在ts->idev 结构中填好额外的字段 __set_bit(EV_ABS, ts->idev.evbit); __set_bit(ABS_X, ts->idev.absbit); __set_bit(ABS_Y, ts->idev.absbit); __set_bit(ABS_PRESSURE, ts->idev.absbit); 4. 用户空间触摸屏应用程序分析: 主函数源代码: int main() { char * tsconf_name; Point Screen_Point[CAL_POINT_NUM]; unsigned short x_max, y_max; unsigned short i; FILE * fp; i = 0; touchscreen_fd = open(TOUCHSCREEN_DEV, O_RDONLY); if (touchscreen_fd < 0) { fprintf (stderr, "Cannot open touch screen device [%s].\n", TOUCHSCREEN_DEV); return -1; } else { fprintf (stderr, "the touch screen device [%s]is opened.\n", TOUCHSCREEN_DEV); fprintf (stderr, "please touch the screen to test the driver is working \n"); } while (1) { Cal_DataAvg(touchscreen_fd, &ts_CalPoints[i], 10); printf("ts_CalPoints[%d].x = %d\n", i, ts_CalPoints[i].x); printf("ts_CalPoints[%d].y = %d\n", i, ts_CalPoints[i].y); i++; if(i==10) i=0; } close(touchscreen_fd); return 0; } 在用户空间,用open(TOUCHSCREEN_DEV, O_RDONLY)函数打开ucb1x00-ts 设备,touchscreen_fd为open 函数的返回值设备的句柄。Cal_DataAvg(touchscreen_fd, &ts_CalPoints[i], 10);函数计算触摸点座标, 并10 次取样, 求出触摸点的平均值。主函数最后调用close(touchscreen_fd)关闭触摸屏。 4.由于驱动程序的复杂性,不容易上手且又容易出问题,所以建议你先只对其中的调试信息做一些改动,在运行该驱动程序时看看其在屏幕上的打印信息。在你对整个过程及相关硬件有较多的一些了解之后再动手做一些功能上的调整。 结合ARMLinux 的移植实验中的相关内容,把改动的驱动程序编译进内核,并下载内核验证结果。你只要把该驱动在必要地方修改后(注意修改前的代码一定要做备份)保存代码,回到内核目录,make bzImage 编译内核,然后下载编译好的内核。 六、思考题: 1.尝试把ADS7846 触摸屏驱动改为非输入设备的模块化的驱动。 2.体会文件系统在内核驱动与用户程序间的作。 实验4.4:IDE_CF卡模块读写实验 一、实验目标: 1.了解在UP-TECHPXA270-S 平台上实现IDE_CF 卡Linux 驱动程序的基本原理。 2.了解Linux 驱动开发的基本过程。 二、预备知识: 1.掌握在Linux 集成开发环境中编写和调试程序的基本过程。 2.了解ARM 芯片(本实验是针对PXA270 系列)的基本结构。 3.了解Linux 内核中关于设备控制的基本原理。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 以一个简单块设备驱动程序为原型,剖析其基本结构。进行部分改写之后并编译实现其相应功能。 五、实验步骤: 1.程序分析 剖析UP-TECHPXA270-S 平台上运行的IDE CF 卡驱动程序中的主要函数,详细内容请参阅../linux/include/linux/ide.h #define IDE_DATA_OFFSET (0) //数据寄存器 #define IDE_ERROR_OFFSET (1) //特征寄存器 #define IDE_NSECTOR_OFFSET (2) //扇区数寄存器 #define IDE_SECTOR_OFFSET (3) //扇区号寄存器 #define IDE_LCYL_OFFSET (4) //低柱面寄存器 #define IDE_HCYL_OFFSET (5) //高柱面寄存器 #define IDE_SELECT_OFFSET (6) //选择卡/磁头寄存器 #define IDE_STATUS_OFFSET (7) //状态寄存器 #define IDE_CONTROL_OFFSET (8) //设备控制寄存器 ../linux /drivers/ide/ide.c int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp) { int index, retry = 1; ide_hwif_t *hwif; do { for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; if (hwif->hw.io_ports[IDE_DATA_OFFSET] == hw->io_ports[IDE_DATA_OFFSET]) goto found; } for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; if (hwif->hold) continue; if ((!hwif->present && !hwif->mate && !initializing) || (!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing)) goto found; } for (index = 0; index < MAX_HWIFS; index++) ide_unregister(index); } while (retry--); return -1; found: if (hwif->present) ide_unregister(index); else if (!hwif->hold) { init_hwif_data(hwif, index); init_hwif_default(hwif, index); } if (hwif->present) return -1; memcpy(&hwif->hw, hw, sizeof(*hw)); memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->hw.io_ports)); hwif->irq = hw->irq; hwif->noprobe = 0; hwif->chipset = hw->chipset; if (!initializing) { probe_hwif_init(hwif); create_proc_ide_interfaces(); } if (hwifp) *hwifp = hwif; return (initializing || hwif->present) ? index : -1; } ../linux/drivers/ide/arm/pxa-ide.c #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_UP_TECHPXA270 #define PXAIDE_BASE_PHYS (PXA_CS2_PHYS+0x800000) //A25-A23 = 001b #define PXAIDE_CTRL_OFFSET 0x20 #define PXAIDE_DATA_OFFSET 0x40 #define PXAIDE_SPACE_SIZE SZ_4K #endif /* list of registered interfaces */ static ide_hwif_t *ifs[1]; static int __init pxaide_register(unsigned int data_port, unsigned int ctrl_port, int irq, ide_hwif_t **hwif) { hw_regs_t hw; int i; memset(&hw, 0, sizeof(hw)); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { hw.io_ports[i] = (unsigned long)data_port; data_port += 4; } hw.io_ports[IDE_CONTROL_OFFSET] = ctrl_port; hw.irq = irq; hw.dma = NO_DMA; ide_register_hw(&hw, hwif); return 0; } static int __init pxaide_init(void) { unsigned long idebase; #ifndef PXAIDE_BASE_PHYS return 0; #endif idebase = (unsigned long)ioremap(PXAIDE_BASE_PHYS, PXAIDE_SPACE_SIZE); printk("PXA: IDE driver, (c) 2005-2008 UP-TECH\n"); pxaide_register(idebase+PXAIDE_DATA_OFFSET, idebase+PXAIDE_CTRL_OFFSET, IDE_IRQ, &ifs[0]); return 0; } module_init(pxaide_init); MODULE_AUTHOR("threewater "); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Pxa IDE driver"); 2.挂载CF卡 由于我们已经将CF 卡的驱动编入内核当中,所以在使用CF 卡时,只需要将其插入开发板中插槽,并将其挂载即可。 将CF 卡插入后,使用mount 命令来挂载CF 卡 [root@Linux /]#ls /mnt/hdbp1/ [root@Linux /]# mount -t vfat /dev/mmcblk0p1 /mnt/hdbp1/ [root@Linux /]#ls /mnt/hdbp1/ fbtest hz16 mkfs.ext3 qtopia.sh wavrec gps lcd_demo mount_ext3.sh v4lcap [root@Linux /]#df Filesystem 1k-blocks Used Available Use% Mounted on /dev/root 13312 9844 3468 74% / /dev/mtdblock/1 65520 29140 36380 44% /mnt/yaffs /dev/mmcblk0p1 121456 1090 120366 1% /mnt/hdbp1 [root@Linux /]# 3.测试CF卡 挂载成功后我们可以使用cp、mkdir、rm 等命令对SD 卡上的文件进行操作。 六、思考题: 实验4.5:U盘接口实验 一、实验目标: 1.了解USB 接口的工作原理 2.理解Linux 下USB 接口的配置和使用 3.理解Linux 下面对usb 设备自动检测 (hotplug)过程的基本原理 二、预备知识: 1. C 语言的基础知识、程序调试的基础知识和方法,Linux 的基本操作。 2. Linux 内核编译的知识。 3. Shell 编程的基本知识。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 学习USB 通信原理,了解USB 通信协议的结构框架。阅读实验文档,学习在Linux 内核中对usb mass storage 设备的配置方法。通过分析系统中使用hotplug 脚本,熟悉Linux 系统下对usb 设备自动检测的过程。 五、实验原理: USB 全称是"Universal Serial Bus",意为"通用串行总线",由Compaq、DEC、IBM、Intel、NEC、微软以及Northern Telecom 等公司于1994 年11 月共同提出的,主要目的就是为了解决接口标准太多的弊端。USB 使用一个4 针插头作为标准插头,采用菊花瓣形式把所有外设连接起来,最多可连接127 个外设。它采用串行方式传输数据,目前最大数据传输率为12Mbps, 支持多数据流和多个设备并行操作,允许外设热插拔。 USB 有两个规范,USB1.1 和USB2.0。USB1.1 是目前较为普遍的USB 规范,其高速方式的传输速率为12Mbps,低速方式的传输速率为1.5Mbps。 注意:这里的b 是Bit 的意思,1MB/s(兆字节/秒)=8MBPS(兆位/秒),12Mbps=1.5MB/s。 USB2.0 规范是由USB1.1 规范演变而来的。它的传输速率达到了480Mbps,折算为MB 为60MB/s,足以满足大多数外设的速率要求。USB 2.0 中的“增强主机控制器接口”(EHCI)定义了一个与USB1.1 相兼容的架构。它可以用USB 2.0 的驱动程序驱动USB 1.1 设备。 SCSI 设备 SCSI 是有别于IDE 的一个计算机标准接口。现在大部分平板式扫描仪、CD-R 刻录机、MO 光磁盘机等渐渐趋向使用SCSI 接口,加之SCSI 又能提供一个高速传送通道,所以,接触到SCSI 设备的用户会越来越多。Linux 支持很多种的SCSI 设备,例如:SCSI 硬盘、SCSI 光驱、SCSI 磁带机。更重要的是,Linux 提供了IDE 设备对SCSI 的模拟(ide-scsi.o 模块),我们通常会就把IDE 光驱模拟为SCSI 光驱进行访问。因为在Linux 中很多软件都只能操作SCSI 光驱。例如大多数刻录软件、一些媒体播放软件。通常我们的USB 存储设备,也模拟为SCSI 硬盘而进行访问。 六、实验步骤: 1.添加系统对USB 设备的支持,见下文所述“内核中配置USB 设备支持” 在Linux2.6 的内核中启用对USB 的支持,首先进入"USB support"节并启用"Support for USB"选项。 在配置系统中的USB 主控制器驱动程序的时候,会看到三个并列的选项。分别是"EHCI"、"UHCI"和"OHCI"。这也是许多人对 Linux 的 USB 开始感到困惑的地方。 要理解"EHCI"及其同类是什么,首先要知道每块支持插入 USB 设备的主板或 PCI 卡都需要有USB 主控制器芯片组。这个特别的芯片组与插入系统的 USB 设备进行相互操作,并负责处理允许USB 设备与系统其它部分通信所必需的所有低层次细节。 Linux USB 驱动程序有三种不同的 USB 主控制器选项是因为在主板和 PCI 卡上有三种不同类型的 USB 芯片。"EHCI"驱动程序设计成为实现新的高速 USB 2.0 协议的芯片提供支持。"OHCI"驱动程序用来为非 PC 系统上的(以及带有 SiS 和 ALi 芯片组的 PC 主板上的)USB 芯片提供支持。"UHCI"驱动程序用来为大多数其它 PC 主板(包括 Intel 和 Via)上的 USB 实现提供支持。只需选择与希望启用的 USB 支持的类型对应的"?HCI"驱动程序即可。如有疑惑,为保险起见,可以启用"EHCI"、"UHCI" (两者中任选一种,它们之间没有明显的区别)和"OHCI"。 图5.8-1 启用"USB support",选择OHCI 驱动方式 在这里我们使用OHCI 方式(Open Host Controller Interface),OHCI 支持USB1.1 标准,OHCI比UHCI 支持更全面,在一个非x86 系统上,更适合使用OHCI 驱动。 启用" USB device filesystem",在系统中会创建/proc/bus/usb/devices 文件,显示每个插入的USB 设备的设备信息。若/proc/bus/usb 下没有相应USB 设备信息,应输入以下命令将 USB 设备文件系统手动挂装到 /proc/bus/usb: # mount -t usbdevfs none /proc/bus/usb 2.添加系统对hotplug 的支持:进入"General setup"节,在内核配置选项中选择"Support for hot-pluggable devices" 3.编译内核,下载 4.启动系统,查看其中的/etc/fstab 脚本。 5.插入U 盘,系统显示如下提示: [root@Intel /]#usb 1-1.3: new full speed USB device using address 4 scsi0 : SCSI emulation for USB Mass Storage devices Vendor: IHT680 Model: PMP Rev: 001 Type: Direct-Access ANSI SCSI revision: 02 SCSI device sda: 240640 512-byte hdwr sectors (123 MB) sda: assuming Write Enabled sda: assuming drive cache: write through sda:<7>usb-storage: queuecommand called sda1 ………………………………………………………. 6.mount /mnt/udisk/;ls /mnt/udisk [root@Intel /]#mount /mnt/udisk/ [root@Intel /]#ls /mnt/udisk/ 2006619847533.exe qian_sdk2.20_linux6.8 第五章 嵌入式linux开源软件移植与应用 实验5.1:嵌入式web服务器goahead实验 一、实验目标: 1.了解GoAhead WebServer的移植方法。 2.学习如何使用GoAhead Web服务器。 二、预备知识: 1.C语言基础。 2.掌握Linux下vi编译器的使用。 3.掌握Makefile的编写和使用方法。 4.了解Linux下程序编译与交叉编译过程 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 下载webs218.tar.gz压缩包并解压,对linux目录下的main.c程序和makefile进行改造后编译。将生成的web程序在开发板上执行。 五、实验步骤: 1.下载并解压webs218.tar.gz 从网站www.goahead.com下载压缩包webs218.tar.gz,并解压。 tar –xjf my –goahead.tar.bz2 解压后文件夹是ws031202,进入该文件夹下的LINUX. cd ws031202/LINUX 2.修改LINUX目录下的Makefile文件 六、思考题: 实验5.2: SQLite移植实验 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 实验5.3: Mplayer到ARM平台上的移植 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 实验5.4: Web服务gSOAP实验 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 实验5.5: Web浏览器Konqueror移植 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 第六章 嵌入式linux下的通信应用 实验6.1:串行端口程序设计 一、实验目标: 1.了解在Linux 环境下串行程序设计的基本方法。 2.掌握终端的主要属性及设置方法,熟悉终端IO 函数的使用。 3.完成串口的收发处理。 二、预备知识: 1.有C 语言基础。 2.掌握在LINUX 下常用编辑器的使用。 3.掌握Makefile 的编写和使用。 4.掌握Linux 下的程序编译与交叉编译过程 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 读懂程序源代码, 学习终端IO 函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。 五、实验步骤: 1.进入exp\basic\03_tty 目录,使用vi 编辑器或其他编辑器阅读理解host 和target 下的源代码。 2.分别编译host 和target 下的源文件,生成host_serial 和target_serial 可执行文件。 3.将PC 端主机的com1 端口与pxa270 开发板的ttyS0 连接,在PC 机终端运行 telnet -8 –l root 192.168.0.102(IP 为开发板地址,具体设置根据你自己的开发板而定),通过telnet 登录开发板。 4.在开发板上通过mount –t nfs -o nolock 192.168.0.121:/up-techpxa270 /mnt/nfs 挂载PC 机的/up-techpxa270 实验目录。并把该实验下的target_serial 可执行文件拷贝到开发板的/mnt/yaffs/目录下。 5.PC 端主机运行host_serial,读com1。 6.在开发板上运行target_serial 程序,并向串口0 输入字符,输入的字符将在PC 端运行host_serial 的主机窗口显示。Ctrl+c 结束程序。 注意:用telnet 登录开发板时,若长时间没有操作,开发板telnet 服务会关闭。 六、思考题: 1.232 串行通讯的数据格式是什么? 2.串行通讯最少需要几根线,分别如何连接? 实验6.2:网络传输实验 一、实验目标: 1. 了解Linux 下的网络编程。 2. 了解UP-TECHPXA270-S 的网络特性。 二、预备知识: 1. 有C 语言基础。 2. 会使用LINUX 下常用的编辑器。 3.掌握Makefile 的编写和使用。 4. 了解Linux 下的编译程序与交叉编译的过程。 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 通过网络进行文件传输、语音双向通信、短消息的收发。 五、实验步骤: 进入本实验目录下,解压server.tar.gz文件 tar jxf workspace.tar.bz2 ,然后进入解压后的目录 cd workspace, 进行编译 make。 1.进入GWAudiolib目录编译PC端语音库 2.进入GWSocket目录编译PC端网络库 3.进入File transfers目录,分别修改fileclient.cpp和fileserver.cpp 文件中的IP和端口号为你PC 端的IP 。 比如你的主机IP 号为192.168.0.43, 则Fileserver("192.168.0.43:9097"),然后编译文件传输客户端和服务器。 4.在workspace新建一目录,将生成的可执行文件fileserver,fileclient拷贝到该目录下。 PXA270开发板端编译命令: make CXX=arm-linux-g++ 5.重复1、2、3步编译pxa270平台的可执行文件,并将可执行文件通过nfs传输至开 发板。 6. PC端运行服务器 ./fileserver 7. pxa270平台上运行客户端 ./fileclient 根据提示输入要传输的文件名。注意:应确保所输入文件名在主机端服务器所运行目录下存在。 8. 查结果。分别在主机端和pxa270平台输入 ls –al 检查文件大小。若为文本文件可以用vi打开文件进行对比。两端大小,内容应一致。如果你有兴趣可以在pxa270平台上运行服务器,在PC上运行客户端,看看能否取得相同的效果。 注意事项:编译库时请务必按照实验步骤。试验完后请阅读源码,领会网络编程的流程、编码的良好习惯以及软件设计的层次结构。 六、思考题: 1.什么是socket?它包括哪些内容?在什么情况下使用? 2.Tcp和UDP的区别是什么? 实验6.3:蓝牙无线通讯实验 一、实验目标: 1. 掌握蓝牙设备通讯原理。 2. 掌握Linux 嵌入式开发平台上蓝牙设备的使用。 二、预备知识: 1. 熟悉内核模块驱动的编译 2.了解根文件系统的结构 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 学习蓝牙设备通讯原理,了解蓝牙通讯的结构。在PC 机与开发板之间实现蓝牙无线通讯。 五、实验步骤: 1.配置编译内核蓝牙驱动模块 在PC 机上运行以下命令 cd /up-techpxa270/exp/kernel tar –xjvf up-linux-2.6.9-release.tar.bz2 –C ./ /*解压缩到当前目录*/ cd linux-2.6.9-release /*进入开发板内核目录*/ make menuconfig /*配置开发板内核*/ 2. 选择Networking support 选项,如图6.5.3 所示: 图6.5.5 Bluetooth device drivers 子选项 5.按图6.5.6 所示选择: 图 6.5.6 Bluetooth device drivers 子菜单 6.选择好选项后,保存并退出make menuconfig。执行以下命令: make clean /*删除上次编译产生的文件*/ make /*编译内核*/ 7.复制新生成的文件到开发板: 在MINICOM 下: cd /mnt/yaffs mkdir bluetooth cd /mnt mount –t nfs 192.168.0.121:/up-techpxa270 /mnt/nfs cd /mnt/nfs/exp/kernel/linux-2.6.9-release cp net/bluetooth/bnep/bnep.ko /mnt/yaffs/bluetooth cp net/bluetooth/rfcomm/rfcomm.ko /mnt/yaffs/bluetooth cp net/bluetooth/l2cap.ko /mnt/yaffs/bluetooth cp drivers/bluetooth/hci_usb.ko /mnt/yaffs/bluetooth 在/mnt/yaffs/bluetooth 目录下,编写插入模块的bluetooth.sh 脚本,其内容如下: #!/bin/sh init() { insmod l2cap.ko insmod rfcomm.ko insmod bnep.ko insmod hci_usb.ko /etc/init.d/bluetooth start pand --listen --role NAP hciconfig hci0 up hciconfig -a } case "$1" in net) ifconfig bnep0 10.0.0.1 ;; *) echo "init bluetooth" init exit 1 esac exit 0 8. 把蓝牙插在开发板USB 口上,在开发板上运行蓝牙服务 cd /mnt/yaffs/bluetooth chmod 777 bluetooth.sh ./bluetooth.sh 9. 在一台window 系统的PC 机上安装本次实验光盘目录下的蓝牙驱动软件或购买蓝牙时自带的 光盘软件,安装好后界面如图6.5.7 所示: 图6.5.7 安装后界面 10.把类似usb 盘的蓝牙模块插入windowsPC 机的usb 口,点击上图中的红太阳搜索 蓝牙设备,会搜索到 名为BlueZ(0)的蓝牙设备。 图6.5.7 搜索到linux 蓝牙设备 在BlueZ(0)设备上点击右键,选择“刷新服务”,完成后如图6.5.8 所示,选择 连接->蓝牙个人局域网服务,在弹出的对话框中选择“是”。 图6.5.8 蓝牙个人局域网服务 图6.5.9 网络提示 在显示屏的右下角会显示windows 下蓝牙设备分配的IP 地址。 图6.5.10 显示IP 地址 11.在开发板上运行带参数的bluetooth.sh 文件。如下所示: cd /mnt/yaffs/Bluetooth ./bluetooth.sh net inetd //开启FTP 服务 然后用ifconfig |more 命令来查看网卡,会发现比以前多了一个bnep0 网卡。 图 6.5.10 IP 显示界面 图 6.5.10 IP 显示界面 用ifconfig bnep0 169.254.145.112 重新为bnep0 设备分配IP,并且ping PC 机的IP: 169.254.145.113,看是否ping 得通。 12.若一切顺利,下边就可以把bnep0 做为网卡来连接网络了。可以尝试一下开发板提供的ftp服务,如图6.5.11 所示,在浏览器中输入ftp://169.254.145.112,关闭弹出的用户名错误警告,在浏览器空白处点击右键,在弹出的快捷菜单中选择登陆。填入用户名root,密码无,然后登陆,结果如图6.5.11 所示。也可以使用光盘中提供的FLASHFXP 软件登录。 图 6.5.11 FTP 图 6.5.11 FTP 六、思考题: 实验6.4:CAN总线实验 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 第七章 嵌入式图形界面用户编程——QT 实验7.1:安装与建立Qt桌面运行环境 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 编译QTE源码 QTE 是系统的图形库,系统中的应用程序以及环境都是基于QTE 来开发的,为用户提供了良好、美观、快速相应的GUI,易操作、易配置。以下为编译QTE步骤: 1. 安装博创自带的光碟;进入光碟的linux目录后直接安装:./install 2. 解压QTE源码包: tar –vxzf qt-embedded-linux-opensource-src-4.4.0-rc1.tar.gz 得到QTE源码 3. 进入QTE源码目录:例如:cd /qt-embedded-linux-opensource-src-4.4.0 4. 配置我们要得到的QTE:./configure -embedded arm -qt-kbd-usb -no-phonon -prefix /qt1005 -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -qt-mouse-tslib -qt-mouse-linuxtp 其中部分主要参数说明: -embedded arm 指定编译后的运行的体系结构; -qt-kbd-usb 指定所使用的键盘为USB键盘; -qt-mouse-linuxtp 支持LinuxTp的鼠标协议; -prefix /qt1005 指定编译后的QTE目录 -fast 快速编译QTE; -pch -no-qt3support 不支持QTE3 代码; -qt-libjpeg 添加jpeg库的支持; -qt-libpng 添加png库的支持; -nomake examples -nomake demos 不编译examples 和demos -qt-mouse-tslib 添加Tslib触摸屏协议支持; (更多选项可用./configure --help查看) 5. 编译QTE: make 6. 等待编译。(此过程时间较长) 7. 编译完成后install目录: make install 8. 得到我们编译后的QTE,如新的QTE目录/qt1005 5.3交叉编译与环境配置 指定QTE的编译库,头文件,PATH等 配置以下内容,可在linux命令下输入: export QTDIR=/qt1005 export QTINC=/qt1005/include export QTLIB=/qt1005/lib export PATH=/qt1005/bin/:$PATH export LD_LIBRARY_PATH=/qt1005/lib 六、思考题: 实验7.2:Qt/Embedded的安装、交叉编译及运行 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 配置7.1环境后,以下为编译应用程序过程: 1.进入应用程序目录,例如:cd /lian/test081005_01/ 2.生成工程文件:qmake –project 3.在生成的.pro文件内容中加入支持WebKit引擎: QT+=webkit QT+=network 4.生成Makefile文件:qmake 5.编译程序:make 5.得到开发板上的可执行文件test081005_01 5.4移植运行库和字体库 将libqjpeg.so插件库移植到开发板中,移植的方法很多如:usb,tftp,nfs等,此处我们使用USB挂载进入: 在挂载前我们先在开发建立目录,输入命令: rtrw //将开发板转为可读可写 mkdir /qt1005/ //创建目录 mkdir /qt1005/plugins mkdir /qt1005/plugins/imageformats/ mkdir /qt1005/lib mkdir /qt1005/lib/fonts 挂载,移植libqjpeg.so、libqgif.so和字体库: mount /mnt/udisk; //挂载U盘 cp /mnt/udisk/libqjpeg.so /qt1005/plugins/imageformats/ cp /mnt/udisk/libqgif.so /qt1005/plugins/imageformats/ cp /mnt/udisk/fonts/unifont_160_50.qpf /qt1005/lib/fonts/  在开发板中建立我们的应用程序目录(以下包括复制所需要的运行库): mkdir /mnt/yaffs/test081005/ mkdir /mnt/yaffs/test081005/lib/ cp /mnt/udisk/libQtGui.so.4 /mnt/yaffs/test081005/lib/ cp /mnt/udisk/libQtCore.so.4 /mnt/yaffs/test081005/lib/ cp /mnt/udisk/libQtNetwork.so.4 /mnt/yaffs/test081005/lib/ cp /mnt/udisk/libQtWebKit.so.4 /mnt/yaffs/test081005/lib/ 5.5设置开发板连接以太网 1) 修改网关: vi /etc/sysconfig/network 添加 GATEWAY=10.0.125.254 2) 修改DNS vi /etc/resolv.conf 添加 nameserver 10.0.10.10 nameserver 10.0.15.11 3) 设置IP地址和添加路由 ifconfig eth0 10.0.125.99 netmask 255.255.255.0 route add default gw 10.0.125.254 /etc/rc.d/init.d/network restart 4) 测试以太网连接状态 ping www.hao123.com 5.6运行程序 1.设置环境变量 export LD_LIBRARY_PATH=/mnt/yaffs/test081005/lib/ 2.把可执行程序移植到开发板: cp /mnt/udisk/test081005_01 /mnt/yaffs/test081005/ 3.运行程序: cd /mnt/udisk/test081005 ./test081005 -qws 六、思考题: 实验7.3: 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 第八章 综合项目实例 实验8.1: 一、实验目标: 二、预备知识: 三、实验环境: 1.硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。 2.软件:PC 机操作系统REDHAT LINUX federal 8.0(或 REDHAT LINUX 9.0) +MINICOM + ARM-LINUX 开发环境 四、情景描述: 五、实验步骤: 六、思考题: 实验8.2: 实验目标: 预备知识: 实验环境: 情景描述: 实验步骤: 思考题: 实验8.3: 实验目标: 预备知识: 实验环境: 情景描述: 实验步骤: 思考题: 袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 PAGE
本文档为【嵌入式linux系统设计与开发实验指导书V1.5.5】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
北溟愚鱼
暂无简介~
格式:doc
大小:3MB
软件:Word
页数:94
分类:工学
上传时间:2018-09-23
浏览量:28