1.驱动开发概述
本文主要针对友善之臂mini2440开发板而编写的学习资料。虽然市面上介绍Linux系统驱动原理和内核源码的书很多,但是直接上手比较困难,特买了一个Arm9开发板,希望从裸机程序开始学习,逐步掌握Linux系统驱动开发方法。编写本文的目的为记录学习过程,用于后期回顾。文章主要分为两部分。第一部分,从友善之臂提供的裸机程序开始介绍各各外设驱动开发过程。第二部分,linux驱动开发流程及实践。
1.1 S3C2440A介绍
三星S3C2440是为手持式设备而开发的16/32位精简指令集微处理器。以很小的尺寸提供了低功耗、高性能的解决方案。处理器提供了如下组件:
S3C2440使用ARM920T核心,使用0.13um CMOS标准单元和内存编译器开发。低功率,简单,精巧且全静态的设计特别适合对成本和功率敏感的应用。它采用一种称为高级微控制器总线体系结构(AMBA)的新总线体系结构。
S3C2440A的CPU内核,是由Advanced RISC Machines 公司的Stanley设计的16/32位ARM920T RISC处理器。具有出色的功能, ARM920T通过以下方式实现MMU,AMBA BUS和哈佛缓存体系结构:单独的16KB指令和16KB数据高速缓存,每个高速缓存具有8个字长。
通过提供一套完整的通用系统外围设备,S3C2440A最大限度地降低了总体系统成本,并且无需配置其他组件。集成芯片上的功能包括:
•内部约1.2V,1.8V / 2.5V / 3.3V内存,3.3V外部I / O微处理器,具有16KB I-Cache / 16KB D-缓存/ MMU
•外部存储器控制器(SDRAM控制和芯片选择逻辑)
•带有LCD专用DMA的LCD控制器(最多4K色STN和256K色TFT)
•带外部请求引脚的4通道DMA控制器
•3通道UART(IrDA1.0、64字节Tx FIFO和64字节Rx FIFO)
•2通道SPls
•IIC总线接口(多主机支持)
•IIS音频编解码器接口
•AC’97 CODEC接口
•兼容SD主机接口版本1.0和MMC协议版本2.11
•2通道USB主机控制器/ 1通道USB设备控制器(1.1版)
•4通道PWM计时器/ 1通道内部计时器/看门狗计时器
•8通道10位ADC和触摸屏接口
•具有日历功能的RTC
•摄像头接口(最大支持4096 x 4096像素输入支持。最大2048 x 2048像素输入支持缩放)
•130个通用I / O端口和 24通道外部中断源
•电源控制:正常,低速,空闲和睡眠模式
•带PLL的片上时钟发生器
1.2 mini2440介绍
Mini2440 是一款低价实用的 ARM9 开发板,是目前国内性价比较高的一款学习板;它采用 Samsung S3C2440 为微处理器,并采用专业稳定的 CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。mini2440 的 PCB 采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性,生产采用机器贴片,批量生产;出厂时都经过严格的质量控制。开发板提供了 Linux 和 WindowsCE6 系统,它们各自的 bootloader 以及 BSP 均是 100%开放的,可以在网站自由下载,网址:http://www.arm9.net
Mini2440 的众多先进特性,可以概括为:
(1)第一款被 Linux 社区广泛支持的国产 2440 开发板(自从 Linux-2.6.31 开始,Mini2440被正式加入 Linux 官方内核)
(2)第一款在 Linux 下支持万能 USB 摄像头的 2440 开发板
(3)第一款统一采用支持 EABI 标准交叉编译器的开发板(同类产品仍在使用拼凑的各个版本的编译器,导致开发效率低下,并且不利于初学者入门掌握)
(4)第一款提供齐全 BSP(基于 Linux-2.6.29(当前为 Linux-2.6.32.2)和 WindowsCE 6.0)的开发板,并全面配有图形界面实用应用程序
(5)第一款支持.NET 3.5 和腾讯 QQ 的 2440 开发板(2009 年 10 月,WindowsCE 6.0 补
丁 Release 3 发布)
(6)第一款可以让用户无需编程,即可自由简单定制 WindowsCE 开机画面的开发板,并且可在 10 秒内极速启动系统
(7)第一款完美支持 USB 烧写更新 Linux(support yaffs2)和 WindowsCE 5.0/6.0 的开发板,并且支持整片 Nand Flash 备份到 PC,真正适合批量生产
(8)第一款实现 WinCE/Linux 图形界面均可使用 CMOS 摄像头预览并拍照的开发板(同类产品尚无此功能)
(9)第一款公开所有 BSP 源代码(含 Linux 和 WindowsCE)的开发板(齐全的 BSP 让初学者可以了解更多的底层,让真正做开发的人只需关注上层应用)
(10)第一款内核(含 WinCE 和 Linux)同时支持大页和小页 Nand Flash 的开发板,这样新老用户均可享用最新的软件,并且使用方式相同
(11)第一款在 WindowsCE 和 Linux 下通过简单直观的图形界面,就可设置各种程序开机自动运行的开发板(同类产品尚无此功能)
(12)Mini2440 目前是国内零售销量最多的 2440 开发板,靠口碑相传及朋友间互相介绍,Mini2440 已经被众多用户称赞和认同
1.3 2440test程序介绍
这是由三星原厂的 2440test 改进而来的一个裸机测试程序,使用 ADS 编译。测试项目包括:中断方式按键测试,RTC 实时时钟测试,ADC 数模转换测试,IIS 音频播放 wav 测试,IIS 音频录音测试,触摸屏测试,I2C 总线读写 AT24C08 测试,三星3.5’LCD、640x480 真彩液晶测试,LCD2VGA 输出测试等。
2.裸机编译环境搭建
2.1 ADS1.2安装
下载地址:链接:https://pan.baidu.com/s/1EpzzC90G87pvd-3pK5Pe4w
提取码:bzg4
解压后双击安装文件进行安装。
因软件比较老,安装路径尽量使用英文字符,且不可位于Program Files (x86)目录下,否则会出现编译出错情况。
2.2 编译2440test代码
(1)双击2440test.mcp文件,打开ADS1.2 IDE

(2)配置生成目标。点 Edit 菜单,选择“DebugRel_bin Setting…”
在左侧树形菜单中选择“Target Settings”,进行如下设置:
Linker:选择默认的ARM Linker
Pre_Linker:选择None
Post-Linker:选择在链接完成后,还要对输出文件进行操作。因为在本例中,希望生成一个可以烧写到 Flash 中去的二进制代码,所以在此选择 ARM fromELF,表示在链接生成映象文件后,再调用 fromELF 命令将含有调试信息的 ELF 格式的映象文件转换为其他格式的文件。

(3)在左侧树形菜单中选择“Arm Assembler”。因为在本例中包含汇编代码,所有要用到汇编器,点接选择 ARM Assembler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armasm,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:

本例中还包含了 C 语言代码,因此还需要设置 ARM C Compiler 选项,点接选择 ARM C Compiler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armcc,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:

(4)点接选择 ARM Linker,在右侧出现相应的设置选项,我们在此详细介绍这些设置框,因为这些选项对最终生成的文件有着直接的影响。
在标签 Output 中,Linktype 中提供了三种链接方式。Partial 方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格式的目标文件,使用的是链接器中指定的地址映象方式。Scattered 方式使得链接器要根据 scatter 格式文件指定的地址映象,生成复杂的 ELF 格式的映象文件,这个选项一般很少用到。



在本例中,我们选择使用 Simple 方式,这里有一些设置:
RO Base:这个文本框设置包含 RO 段的加载域和运行域为同一个地址,默认是 0x8000。
这里用户要根据自己的硬件实际 SDRAM 地址空间来修改这个地址,保证这里填写的地址,是程序运行时,SDRAM 地址空间所能到达的范围,针对本目标板,SDRAM 的空间范围是0x3000000-0x34000000,因此这里设置为 0x30000000。
RW Base:这个文本框设置了包含 RW 和 ZI 输出段的运行域地址。如果选中 split 选项,链接器生成的映象文件将包含两个加载域和两个运行域,此时在 RW Base 中所输入的地址为包含 RW 和 ZI 输出段的域设置了加载域和运行域地址。
Ropi:选中这个设置将告诉链接器使包含有 RO 输出段的运行域位置无关。使用这个选项,链接器将保证下面的操作:检查各段时间的重寻址是否有效;确保任何由 armlink 自身生成的代码是只读位置无关的。
Rwpi:选中该选项将会告诉链接器使包含 RW 和 ZI 输出段的运行域无关。如果这个选项没有被选中,域就标识为绝对。每一个可写的输入段必须是和读写位置无关的。如果这个选项被选中,链接器将进行下面的操作:
检查可读/写属性的运行域的输入段是否设置了位置无关属性;
检查在各段之间的重地址是否有效;
在 Region Table 和 ZISection Table 中添加基于静态存储器 sb 的选项。
该选项要求 RW Base 有值,如果没有给他指定数值的话,默认为 0。
Split Image:选择这个选项把包含 RO 和 RW 的输出段的加载域分成 2 各加载域,一个是包含 RO 输出段的域,一个是包含 RW 输出段的域。
这个选项要求 RW Base 有值,如果没有给 RW Base 选项的值,则默认是 0。
Relocatable:选择这个选项保留了映像文件的重寻址偏移量。这些偏移量为程序加载器提供了有用信息。在 Options 选项中,需要读者引起主义的是 Image entry point 文本框。它指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址处执行。如果需要,用户可以在这个文本框中输入下面格式的入口点:
入口点地址:这是一个数值,例如 -entry 0x0
符号:该选项指定映像文件的入口点为该符号所代表的地址处,比如:-entry int_handler ,如果该符号有多处定义存在,armlink 将产生出错信息。
offset+object(section):该选项指定在某个目标文件的段的内部的某个偏移量处为映像
文件的入口地址,例如:-entry8+startup(startuoseg)在此处指定的入口点用于设置 ELF 映像文件的入口地址。需要引起注意的是,这里不可以用符号 main 作为入口点地址符号,否则将会出现类似“Image dose not have an entry point(Not specified or not set due to multiple choice)”的错误信息。在 Layout 选项中,需要设置 asm.o 目标文件中的 Init 为整个文件的入口点。关于ARM Linker 的设置还很多,对于想进一步深入了解的读者,可以查看帮助文件,都有很详细的介绍。
在 Linker 下还有一个 ARM fromELF:
fromELF 是一个实用工具,它实现将链接器,编译器和汇编器的输出代码进行格式转
换的功能。例如,将 ELF 格式的可执行映像文件转换成可以烧写到 ROM 的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小,符号和字符串表以及重寻址等信息。只有在 Target 设置中选择了 Post-linker,才金可以使用该选项。
在 Output format 下拉框中,为用户提供了多种可以转换的目标格式,本例选择 Plain binary,这是一个二进制格式的可执行文件,可以被烧写到目标板的 Flash 中。
在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击 Choose...按钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行 make 的时候,CodeWarrior IDE 就会在链接完成后调用 fromELF 来处理生成的映像文件。
对于本例的工程而言,到此,就完成了 make 之前的设置工作了。

点击 CodeWarrior IDE 的菜单 Project 下的 make 菜单,就可以对工程进行编译和链接了。编译链接结果如图:

2.3烧录到开发板内存运行
使用 USB下载运行2440test 程序不需要并口和JTAG板,借助 MiniTools 的“Download & Run”功能就可以了,下面是详细的操作步骤:
1) 将开发板的 S2 开关设置为 Nor Flash 方式,然后开启电源
2) 在电脑上运行 MiniTools 工具,用 USB 线连接开发板与电脑,MiniTools 应该会提示已连接开发板
3) 接下来在 MiniTools 的界面上,在左侧的菜单中选择裸机程序(No OS),然后在右侧的主面板中,点“…”选择要下载运行的 2440test 程序,点“下载运行”即可,如下图所示:

2.4烧录到开发板Nand Flash运行
烧写 2440test 到 Nand Flash 的步骤如下:
1) 将开发板的 S2 开关设置为 Nor Flash 方式,然后开启电源;
2) 在电脑上运行 MiniTools 工具,用 USB 线连接开发板与电脑,MiniTools 应该会提示已连接开发板;
3) 接下来在 MiniTools 的界面上,在左侧的菜单中选择裸机程序(No OS),然后在右侧的主面板中,选择“Install to NAND Flash”,点“…”选择要烧写的 2440test程序,如果NandFlash 中没有 Superboot,还需要选择 Superboot,一切就绪后,点“开始烧写”即可,界面的设置如下图所示:

烧写完成后,将开发板的 S2 开关切换到 Nand Flash 启动,重新开机即可,也可以直接点 MiniTools上的“快速启动”按钮临时启动程序。
2.5运行结果
串口信息如下图

开发板实际显示效果如下图

本文详细介绍了S3C2440驱动开发,包括S3C2440A处理器特点、Mini2440开发板简介,以及2440test程序的使用。通过裸机编译环境搭建,使用ADS1.2进行编译,并通过MiniTools烧录到开发板运行,展示了从裸机程序到Linux驱动开发的学习路径。

6751

被折叠的 条评论
为什么被折叠?



