ARM 笔记
板子基本元件清单说一下吧,方便其他人参考
CPU:44B0
RAM:HY57V641620
ROM:AM29LV160
NET:8019
USB:D12
KEY:ZLG7290
LCD:SHARP LM7M632
目前为止本人做的工作
1 板子的硬件调试是跟着软件来的
2 ADS AXD 调试环境搭建
3 FLSH 烧写笔记
4 UBOOT 移植笔记
5 UCLINUX 编译下载简单笔记
6 字符设备驱动开发
C 工程模板使用说明
本模板用于使 44B0 运行 C 程序
一般说来汇编用来初始化 之后跳到 C 入口 MAIN 函数处
一、关于工程文件
1、本目录下建工程文件(.MCP)
2、工程文件至少包含 3 个文件 *.c(自己的 c 文件)
3、 中开头部分 INCLUDE 两个文件 用于基本设
置
注意这两个文件的存放目录,即让 INCLUDE 找到它们
4、以上文件除自己的 c 文件之外均为三星公版,不需修改
二、关于 CodeWarrior 设置
1、DebugRel Setting 里一般设置几项
1)Target Setting->Linker 里选 ARMLinker
用于设置连接
2)Target Setting->Post-Linker 选 ARM fromELF
用于生成 FLASH 烧录代码(只在 RAM 里运行 而不烧录则不用)
3)ARM Linker->RO BASE 里添地址
根据板子来,这板子上 RAM 接的 NSCS6,地址 0XC000000-0XC7FFFFF;
FLASH 接的 NSCS0,地址 0X00000-0XFFFFF
地址分配原理见 44B0 数据手册内存管理那章的内存分配图
想在 RAM 里调试就添 0XC000000(比如 0XC008000)的地址
但是注意的是地址不要添过界,比如想在 RAM 里调试却添 0X00000000 程序
可以 进入 C 代码 但没法运行
再有
想生成用于烧写得 FLASH 代码 RO 地址就需要设置为 0X0000000 开始的 而
且 LAYOUT 中也必须设置 为初始加载文件
以上 FLASH 测试结论经 FLASHPGM 测试
而且 FLASHPGM 不支持 BIN 文件 只支持 INTEL 得 HEX 文件
4)RW 可以添 可以不添 一般 RO 解释为数据段,RW 解释为数据段
有时高兴了就添上 0XC100000(RAM 调试时)
5)ARM Linker->OPTION->Image entry point 选择 0xc000000(RAM 调试时)
6)ARM Linker->Layout->Object/Symbol 里可以添工程起始程序 注意
是.O 不是.S 和.0(零)
也可以不添
三、AXD 设置
1)按照 BANYANGT 或者 ARM7 正确设置调试代理
BANYANGT、ARM7、H-JTAG 都是代理,装哪个无所谓,一般认为 BANYANGT
好,但无论哪个调试之前必须运行代理
2)在 option->configure interface 里 在 session file 选择 这个文件是初始
化 44b0 寄存器的,必须运行
3)Options->Configue Target 里本来有两项,上面上是硬件调试,下面是软件仿
真(在电脑上仿真)
用 ARM7 就 改 第 一 项 ( 按 照 ARM7 说 明 改 ), 用 BANYANGT 就 按 照
BANYANGT 说明在下面再加个 BANYANGT 的驱动
4)在 general 标签页选择 attach,然后确定,最后在 file->save session,关闭 AXD
(在 CodeWarrior 里一 DEBUG 就自动打开)
四、关于 JTAG
1)JTAG 一般有几种 SDT 和 WIGGLER 我的是 WIGGLER 的,两者区别主要
在并口 25 针定义不一样(不算复位脚),与板子上 JTAG 相连的脚不是区分 JTAG
类型的标志
只要和 44B0 对上就行
2)JTAG 小板上与 44B0 大板上 JTAH 跳线 RAM 调试时都不用接 烧 FLASH 才
用到
3)网上流传的 JTAG 小板上也有不用 RST 信号的版本,无所谓,RST 信号不是
标准的
五、另外
开始的时候犯了低级错误,没设置 OM1 2 3 跳线 导致晶体不阵~~~
其他的看万龙的 ARM 开发板使用手册,写的还不错
模板:user94/mamajinco/upload/
这部分可能过于简单,很少有人写,但是对于不了解 ARM 开发过程的人真的简
单吗?我是菜鸟,在这卡了 3 天:)
一般说来有几种方法,
1)板子原来的 BOOTLOADER 程序或者为烧写而编写的专用 ADS 程序
比较高级而快速的方法,很多现成的开发板都用这种方法(相对来说有实力的公
司),此状态下 CPU 是运行的,所以速度快。
比如 ZLG 的,但是对于初学或者不准备细研究硬件的人来说就比较麻烦,因为
要编写(改写)ADS 烧写程序。愿意的人可以看看。
2)FLUTED
和 FLASHPGM 一样,使用的好象叫边界扫描法,CPU 此时并不运行,因此烧写
的比较慢。
在这里也不推荐 FLUTED 这个软件,原因比较简单,麻烦+速度慢。
因为需要编写(改写)两个配置文件,而且是字符界面。倒是有人说这个软件只
能在 WIN98 下用的说法好象不对(现在有可以让 2000 和 XP 下用的方法)
喜欢的朋友可以用用
3)FLASHPGM(推荐)
很简单的程序,GUI 界面,速度尚好。
设置很简单,在 CPU 里选对型号,当然是 3 星的 44B0。在 FLASH 里也一样,
39LV160,29LV160 都有。
确定好地址,RAM 地址我的是 0XC000000(BANK7 上) FLASH 地址 0X0
(BANK0 上)
选完了以后读一下 FLASH 的 ID(左下脚的按钮吧)能读出厂家的 ID 就行。
然后是烧写了,PROGRAME 按钮,注意的是 FLASHPGM 不支持 BIN 格式,按
照下面方法处理。
再有就是尽量在写之前擦一下,PROGRAME 菜单里有个选项,打个钩就 OK。
具体烧写方法可以看我总结的另一篇文档,在这里只说说 UBOOT 相关的。
前面说过 UBOOT 编译以后产生 3 个文件
u-boot——ELF 格式的文件,可以被大多数 Debug 程序识别;
——二进制 bin 文件,纯粹的 U-BOOT 二进制执行代码,不保存 ELF
格式和调试信息。这个文件一般用于烧录到用户开发板中;
——Motorola S-Record 格式,可以通过串行口下载到开发板中。
FLASHPGM 不支持 BIN 格式的,可以烧写 u-boot——ELF 格式的文件,别看它
没扩展名,一样烧写。
还有,如果你懒(和我一样),拿别人现成的 BIN 文件来烧,FLASHPGM 还提
供了一个 BINTOS19 的程序,就在它的安装目录下。具体用法运行它,它自己
就告诉你了。
注意:有时(尤其是 FLASH 里已经有程序的时候)0XC000000 会莫名奇妙的提
示内存不可以写,有几个方法可以试试:把地址改成 0x10000000(好象是缓存
地址),之后点 EREASE 擦除芯片,擦除一般说来是不成功的,最后无论如何都
下不去,没关系,这时候关闭擦除对话框,然后 0x10000000 地址不变,烧
FLASH,我一般是烧写一个我自己写的 LED 测试小程序把内存占上:)。回来
这时候再把 0X1000000 换成 0XC000000 再按照正常操作,一般可以正常。
这现象的原因就是过去下的程序(多数是不正确的程序)正在运行 占用了 RAM
与 ROM,下个 LED 测试小程序就是把这几个部分清除掉。
如果以上方法还不正常,可以用另一个程序叫 FLASHP 就差 2 个字母:)很好!
在这里对这个程序的作者致敬!!
用这个软件擦 FLASH,然后再用 FLASHPGM 烧,原因是 FLASHP 擦厉害,但
写好象有些问题~~
UBOOT 移植操作(1)
[0]目录结构
◆ board:和一些已有开发板有关的文件,比如 Makefile 和 等都和具
体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的 C 文件。
◆ cpu:CPU 相关文件,其中的子目录都是以 U-BOOT 所支持的 CPU 为名,比
如有子目录 arm926ejs、mips、mpc8260 和 nios 等,每个特定的子目录中都包括
和 ,。其中 初始化 CPU、设置指令 Cache 和数据 Cache
等; 设置系统的各种中断和异常,比如快速中断、开关中断、时钟中
断、软件中断、预取中止和未定义指令等; 是 U-BOOT 启动时执行的第一
个文件,它主要是设置系统堆栈和工作方式,为进入 C 程序奠定基础。
◆ disk:disk 驱动的分区处理代码。
◆ doc:文档。
◆ drivers:通用设备驱动程序,比如各种网卡、支持 CFI 的 Flash、串口和 USB
总线等。
◆ fs:支持文件系统的文件,U-BOOT 现在支持 cramfs、 fat、 fdos、 jffs2 和
registerfs。
◆ include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和
对文件系统支持的文件。
◆ net:与网络有关的代码,BOOTP 协议、TFTP 协议、RARP 协议和 NFS 文件
系统的实现。
◆ lib_arm:与 ARM 体系结构相关的代码。
◆ tools:创建 S-Record 格式文件 和 U-BOOT images 的工具。
=============================================================
=============================
[1] 目录下有 Makefile
1)设置编译器
可以看到这一项:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
也就是说这里所用的交叉编译器是 arm-linux-gcc,u-boot 默认是用这个的,也有
用 arm-elf-gcc 的,,用它来编译,没有问题。如果最后
MAKE 的时候提示找不到 arm-linux-gcc 就是这错了,改一下。
arm-elf-gcc 是用来编译 uClinux 内核的工具,arm-linux-gcc 用来编译 LINUX
2)加进自己板子的项目
搜索 B2 的这部分文件
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上这部分:
TT_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
切记在@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
前面的是 Tab 来的,TT_config : unconfig 也是一样,不能用空格代
替,因为它是靠这个来识别命令的
=============================================================
=============================
[2]在宿主机(PC 机)上建立 arm-elf-gcc 交叉编译环境
1)建立 arm-linux-gcc 编译环境
在 RedHat Linux 系统下以 root 用户登录,
将 文件复制到/目录下,
安装:
# tar jxvf
这个命令会在你的/usr/local/arm/ 目录下安装 arm-linux-gcc 交叉编译程序,
然后在 PATH 变量中添加一项:/usr/local/arm/
[root@localhost root]# export PATH=$PATH:/usr/local/arm/
或
把 PATH=:$PATH:/usr/local/arm/ 添加到/ETC/bash_profile 文件中
或者
在/etc/bashrc 文件中添加一项:
export PATH=:$PATH:/usr/local/arm/
之后可以测试一下 echo $PATH
注意:PATH 大小写不一样,另外 LINUX 下大小写是不同的,以后不特别声明。
注意:命令中的参数之间都由单个空格或者 TAB 隔开,命令前有的有# 代表命
令行符,不用输入。
注 意 : 不 可 在 WINDOWS 下 用 winRAR 解 压 或
这种文件,会少文件,去 LINUX 下,另外解压的时候也不用
非点用命令行操作,LINUX 现在对 GUI 已经支持的非常好了,比如解压只要右
键点文件,选解压到当前文件夹就可以,执行的时候只要双击再选“执行”
注意:我用的 VMWARE(虚拟机)装的 LINUX,要在 LINUX 和 WIN 中间传
递文件用 VM-》SETTING 里的 SHARE FOLDER
该功能是把 WIN 下的一个文件夹共享给 LINUX。
这个功能必须装 VMWARE TOOLS 才能用,
装 VMWARE TOOLS 方法:首先在 VM-》SETTING 里 CDROM 项里把光驱设
置为装入 VMWARE 安装文件夹下的 LINUX 工具的.ISO,LUINUX 下就出现
CDROM 了 拷贝 解压 安装不在话下。必须注意的是 VMWARE TOOLS 在每次
重起 LINUX 之后还必须也重起一下,TMD,谁搞定不用重起告诉我一声
重起的方法:/etc/ restart
就有消息出来了
注意:另外郁闷的是我的 WIN 与 LINUX 之间复制文字似乎也不顺畅,干脆在
SHARE FOLDER 里建立一个 TXT,两个系统捣文字玩~~
测试:
把终端关闭,重新打开后执行如下命令:
# arm-linux-gcc –v
建立好交叉编译环境后可以试着编译 u-boot 了
2)也可以建立 arm-elf-gcc
与上面类似,用周立功的编译包直接安装
会在/usr/local/bin 下产生 arm-elf-gcc 只类的文件
然后设置路径
[root@localhost root]# export PATH=$PATH:/usr/local/arm-elf/bin
=============================================================
=========================================
[3] 测试交叉编译器搞好没有
编译个 44B0 例子 在 UBOOT 包目录下执行一下命令,以下是编译的包自带的
DAVE 公司板子 B2(名)
1) Make distclean (清除以前编译的痕迹)
2) Make B2_config(B2 代表 B2 板子的,前面见到过)
3) Make
没问题就可以进行下面了
注意:B2 默认用 arm-linux-gcc 编译,要是前面安的 arm-elf-gcc 的话此时会报错
把 UBOOT 目录下的 MAKEFILE 按照前面说的改一下
注意:一般说来还会有个问题,怀疑是编译器的问题 提示什么 abi=apcs-gnu 只
类的找不到吧~~记不住了
改 UBOOT 目录下 (好象)
文件里改成如下
PLATFORM_CPPFLAGS += $ (call cc-option,-mapcs-32, $ (call
cc-option,-mabi=apcs-gnu,))
原来的行少了$(call cc-option,-mabi=apcs-gnu,) 具体在哪行忘了 CTRL+F 搜索
一下
其他应该没问题,有问题 GOOGLE 搜一下,不是通病就是自己安装的问题了
注意:
MAKE 之后会生成三个文件:
u-boot——ELF 格式的文件,可以被大多数 Debug 程序识别;
——二进制 bin 文件,纯粹的 U-BOOT 二进制执行代码,不保存 ELF
格式和调试信息。这个文件一般用于烧录到用户开发板中;
——Motorola S-Record 格式,可以通过串行口下载到开发板中。
[4]开始配置 U BOOT
1)给自己板子个公司起个名,我的公司叫 T2T 板子叫 TT,刚才那个例子公司
名 DAVE 板子名 B2
以 B2 板子的程序做为模板来做,省很多工作
#cd U BOOT 目录
#cd board //进 BOARD 目录,该目录下存放各种公司的开发板,但 44B0 的好象
只有一种 B2
#cp -R dave T2T (复制 并且改名)
#cd T2T
#mv B2 TT (复制 并且改名)
#cd TT
# mv
修改 TT 里面的 Makefile, 把 B2 改成 TT,编译时如果报的其它类似找不到 B2
的错误也是把相应的 B2 改成 TT 来处理。
修改 T2T/TT/
TEXT_BASE = 0x0c1000000
修改 T2T/TT/Makefile
将所有的 B2 改为 TT
2)/include/configs
cp 依旧是把 B2 的改个名
注意:DAVE 的板子是用 44B0 的,但还有其他板子用吗?怎么确定只有它用?
用以下命令
到 board 目录查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
结果是:
./dave/B2/
B2 网站是:
3)以下文件修改记录
----------------------------------------------------------------------------------------------------
-----------------------------------/include/configs/------------------------------------------
-
----------------------------------------------------------------------------------------------------
#define CONFIG_INIT_CRITICAL 1 这个在 cpu/s3c44b0/ 里
面用到,如果你的 u-boot 程序不是在 sdram 中调试而是固化到 flash 中运行的话,
这个必不可少。
找到 #define CONFIG_B2 1 改成 CONFIG_TT
找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 主频改成 60
找到 Size of malloc() pool 这部分设置,改成这样。
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for
Monitor */
#define CFG_ENV_SIZE (64*1024) /* 1024 bytes may
be used for env vars*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data
*/
#define CFG_ENV_IS_IN_FLASH 1 这个必不可少,如果你想把你的
参数保存到 flash 的话
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 这个就是你的参数
保存在 flash 里的起始地址了
#define CFG_ENV_OFFSET 0x40000 这个我后来看它源程序发现如果你
上一步没有设置它的起始地址的话就会用它来作默认地址的了
#define CONFIG_AUTO_COMPLETE
其它地方没有深究哦,有些好像不要也行,你就试试吧。
找到 Hardware drivers 部分,这应该是网络芯片设置吧,参考一下这个吧(要看
芯片的):
#define CONFIG_DRIVER_RTL8019 这个就要看你的板上用的是什么网
卡了(这个是台湾出的,有 10M)
#define RTL8019_BASE 0x06000300 这个是网卡相就寄存器的起始
地址,有的挂在 BANK4 上了地址自然是 0X08000300
以下部分我试过不要也行,你试下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 应该是重试的次
数吧
#define CONFIG_SERIAL 1
#define CONFIG_BAUDRATE 115200 设置波特率
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_DATE | \
CFG_CMD_ELF | \
CFG_CMD_NET | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
CFG_CMD_FAT | \
CFG_CMD_JFFS2)
把 CFG_CMD_EEPROM 改成 CFG_CMD_FLASH 吧,虽然不改也是可以的,具
体没考究。
以下是板上 env 参数设置,看一下吧,其实我觉得了解一下就行的了,只是一些
初始设置值,以后可以用命令 setenv saveenv 来修改的。
#define CONFIG_BOOTDELAY 3 这个就是运行 bootcmd 之
前的等待时间
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200"
引导 uClinux 的时候传递的参数,不会就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 网卡的物理地址 MAC
#define CONFIG_NETMASK 掩码地址,设置过 ip 的人都
应该知道吧
#define CONFIG_IPADDR 这是你板上网卡 8019 的 ip
地址
#define CONFIG_SERVERIP 这是你宿主机的 ip地址,
以后用 tftp 下载的时候用到,一定要跟你的宿主机一致才行。
#define CONFIG_BOOTFILE "" 这个就是你要下载文
件的默认名字,注意的是不是 UBOOT 编译的文件 而是 UBOOT 下载以后在这个
地址执行这个文件,比如这个文件在下 LINUX 后就常被改成 了
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 这是 bootdelay 后运
行的命令
Miscellaneous configurable options 部分,参考一下吧:
#define CFG_LONGHELP /* undef to save memory
*/
#define CFG_PROMPT "TENWAY=>" 这是进入命令模式下的提示
符,改个帅一点的吧
#define CFG_CBSIZE 256 /* Console I/O Buffer Size
*/
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print
Buffer Size */
#define CFG_MAXARGS 100 /* max number of
command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer
Size */
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on
*/
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM
*/
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR 0x0c008000 默认的下载地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供
选择的波特率
Physical Memory Map 部分,比较重要,修改你的 sdram 和 flash 的地址和容量。
#define CONFIG_NR_DRAM_BANKS 1 我们只占用了一个 Bank 用来映
射 sdram
#define PHYS_SDRAM_1 0x0c000000 sdram 的起始地址
#define PHYS_SDRAM_1_SIZE 0x00800000 sdram 的容量(8M)
#define PHYS_FLASH_1 0x00000000 flash 的起始地址
#define PHYS_FLASH_SIZE 0x00200000 flash 的容量(2M)
#define CFG_FLASH_BASE PHYS_FLASH_1 定义多个名字而已,
其它地方会用到
注意:
存储容量的计算方法
2M=0x00200000-----------------16 进制转换成 10 进制(用 WINDOWS 自带的计算
机就行)-------------------》2097152
2097152=1024*1024*2
FLASH organization 部分,看注释应该知道了吧,参考一下:
/*-----------------------------------------------------------------------
* FLASH organization
*/
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 256 /* 最大支持的 SECTOR 数量,另外 SAM
FEI 的补丁这里设置了 32 个 是错误的*/
//#define CFG_MAIN_SECT_SIZE 0x10000 /* main size of sectors on one
chip */
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms)
在前面加个 4 让它长点 */
#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
其他地方还没动 以后动的再补上
UBOOT 移植操作(3)
----------------------------------------------------------------------------------------------------
-----------------------------------board/myboard/common/------------------------------
-----
----------------------------------------------------------------------------------------------------
找到这个函数:write_buff
里面有这句话,一共有 6 处吧?全改了:#ifdef CONFIG_B2
把 CONFIG_B2 改成上面 文件里面起的名,我的叫 CONFIG_TT
关于 FLASH 的一点疑问:
一直怀疑 29LV160 和 39LV160 在 U BOOT 下是否兼容的问题
看了这段程序后似乎 U BOOT 是可以自动检测的
----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/-----------------------------------
----------------------------------- 也 叫
board/T2T/TT/-----------------------------------
----------------------------------------------------------------------------------------------------
按照如下改
* Bank 0 parameter */
.equ B0_Tacs, 0x3 /* 0clk */
.equ B0_Tcos, 0x3 /* 0clk */
.equ B0_Tacc, 0x7 /* 14clk */
.equ B0_Tcoh, 0x3 /* 0clk */
.equ B0_Tah, 0x3 /* 0clk */
.equ B0_Tacp, 0x1 /* 0clk */
.equ B0_PMC, 0x0 /* normal(1data) */
/* Bank 1 parameter */
.equ B1_Tacs, 0x0 /* 4clk */
.equ B1_Tcos, 0x1 /* 4clk */
.equ B1_Tacc, 0x2 /* 14clkv */
.equ B1_Tcoh, 0x1 /* 4clk */
.equ B1_Tah, 0x0 /* 4clk */
.equ B1_Tacp, 0x0 /* 6clk */
.equ B1_PMC, 0x0 /* normal(1data) */
/* Bank 2 parameter - */
.equ B2_Tacs, 0x0 /* 4clk */
.equ B2_Tcos, 0x2 /* 4clk */
.equ B2_Tacc, 0x4 /* 14clk */
.equ B2_Tcoh, 0x2 /* 4clk */
.equ B2_Tah, 0x3 /* 4clk */
.equ B2_Tacp, 0x3 /* 6clk */
.equ B2_PMC, 0x0 /* normal(1data) */
/* Bank 3 parameter */
.equ B3_Tacs, 0x3 /* 4clk */
.equ B3_Tcos, 0x3 /* 4clk */
.equ B3_Tacc, 0x7 /* 14clk */
.equ B3_Tcoh, 0x3 /* 4clk */
.equ B3_Tah, 0x3 /* 4clk */
.equ B3_Tacp, 0x3 /* 6clk */
.equ B3_PMC, 0x0 /* normal(1data) */
/* Bank 4 parameter */
.equ B4_Tacs, 0x3 /* 4clk */
.equ B4_Tcos, 0x3 /* 4clk */
.equ B4_Tacc, 0x7 /* 14clk */
.equ B4_Tcoh, 0x3 /* 4clk */
.equ B4_Tah, 0x3 /* 4clk */
.equ B4_Tacp, 0x3 /* 6clk */
.equ B4_PMC, 0x0 /* normal(1data) */
/* Bank 5 parameter */
.equ B5_Tacs, 0x0 /* 4clk */
.equ B5_Tcos, 0x1 /* 4clk */
.equ B5_Tacc, 0x4 /* 14clk */
.equ B5_Tcoh, 0x1 /* 4clk */
.equ B5_Tah, 0x0 /* 4clk */
.equ B5_Tacp, 0x0 /* 6clk */
.equ B5_PMC, 0x0 /* normal(1data) */
/* Bank 6(if SROM) parameter */
.equ B6_Tacs, 0x3 /* 4clk */
.equ B6_Tcos, 0x3 /* 4clk */
.equ B6_Tacc, 0x7 /* 14clk */
.equ B6_Tcoh, 0x3 /* 4clk */
.equ B6_Tah, 0x3 /* 4clk */
.equ B6_Tacp, 0x3 /* 6clk */
.equ B6_PMC, 0x0 /* normal(1data) */
/* Bank 7(if SROM) parameter */
.equ B7_Tacs, 0x3 /* 4clk */
.equ B7_Tcos, 0x3 /* 4clk */
.equ B7_Tacc, 0x7 /* 14clk */
.equ B7_Tcoh, 0x3 /* 4clk */
.equ B7_Tah, 0x3 /* 4clk */
.equ B7_Tacp, 0x3 /* 6clk */
.equ B7_PMC, 0x0 /* normal(1data) */
/* Bank 6 parameter */
.equ B6_MT, 0x3 /* SDRAM */
.equ B6_Trcd, 0x1 /* 2clk */
.equ B6_SCAN, 0x0 /* 8bit */
.equ B7_MT, 0x3 /* SDRAM */
.equ B7_Trcd, 0x1 /* 2clk */
.equ B7_SCAN, 0x0 /* 8bit */
/* REFRESH parameter */
.equ REFEN, 0x1 /* Refresh enable */
.equ TREFMD, 0x0 /* CBR(CAS before RAS)/Auto *** */
.equ Trp, 0x0 /* 2clk */
.equ Trc, 0x3 /* 0x1=5clk 0x3=11clk*/
.equ Tchr, 0x0 /* 0x2=3clk 0x0=0clks */
.equ REFCNT, 1550
MEMORY_CONFIG:
.long 0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,
Bank2=Nowait,UB/LB*/
.word
((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B
0_Tacp<<2)+(B0_PMC)) /*GCS0*/
.word
((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B
1_Tacp<<2)+(B1_PMC)) /*GCS1*/
.word
((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B
2_Tacp<<2)+(B2_PMC)) /*GCS2*/
.word
((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B
3_Tacp<<2)+(B3_PMC)) /*GCS3*/
.word
((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B
4_Tacp<<2)+(B4_PMC)) /*GCS4*/
.word
((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B
5_Tacp<<2)+(B5_PMC)) /*GCS5*/
.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) /*GCS6*/
.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) /*GCS7*/
.word
((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
/*REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019*/
.word 0x10 /*SCLK power down mode, BANKSIZE 16M/16M*/
.word 0x20 /*MRSR6 CL=2clk*/
.word 0x20 /*MRSR7*/
主要是设置 MEMORY_CONFIG 里的内容 值得注意的是.long 0x01000102 /*
Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/中
设置了各个 BANK 的位宽,要注意。因为 8019 有 8 位的,有 16 位的,配置错
了网络不通
其实就是一些字
有人从地址读出来后是下面这样也可以
“
MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于对 armsys 硬件不是太了解,没有办法,只得看 armsys bootloader 程序,但每个版
本又有差别.因此是用 AXD 调试看 bootlaoder 启动后 0x1c80000 中的值定的.
”
注意:这个注意是后补上的,因为自己和朋友在做的时候发现网上对这部分分析
的人特别少,可能因为理论比较简单,操作起来又比较麻烦吧。
听听菜鸟的方法吧。
首 先 U 和 版 本 有 个 小 差 别 , 就 是 文 件 名 的 差 别 叫
, 叫 如果把别人用 编译的直接拿过来也可
以,但一定记得在改文件名的同时还一定要在文件里改函数名!就是这个文件最
后那部分汇编上面的函数名。不然后来会提示 里找不到 lowlevel_init。
切记
另外,比较重要的这部分究竟代表什么,怎么改。
这个文件实际分 3 部分,这 3 个部分实际又是把 44B0 初始化那几个汇编文件重
新组合了,就是 ADS 在 RAM 里调试文档里说的,把 44B0 当单片机用时 C 语
言 前 面 的 那 写 汇 编 文 件 , 一 般 说 来 包 括
。其中 就包含了内存初始化的参数,按照这两个文
件改吧。
再说这 3 部分
开始是内存设置,在数据手册(英文)4-14 页,各个意思就不多说了。说说怎么
改,当然得根据你的内存具体改(一句废话)但是有简单的方法,前面提到了,
看 这个文件。
然后是一些移位只类的操作,把各个 BANK 设置好,其实就是设置一些预定义
的字,然后在其他的地方利用这些字设置寄存器。就把这些理解为宏或者就当是
个结构体吧(不准确,就帮助理解)。为什么这么设置看看数据手册(英文)4-13
页
这部分在怎么改的快?找,哪找? 里面有,一模一样,不罗嗦了。
最后那部分是这个文件唯一执行的部分
基本不需要改吧(除了有的时候函数名:))
看见 0X01C80000 还不明白吗?看数据手册(英文)4-3 页去吧,有汇编的例子,
至于这个 32 位寄存器为什么这么设置。
别看我这装的明白,就是会对付,别跟我较真,我还也在研究中:)
注意:顺便在这里说说个小问题,有朋友问“为什么原理图上地址线从 A1 开始,
而不是 A0”看数据手册(英文)4-4 页,因为是 16 位地~~~
注意:我的 8019 是连在 BANK3 上的 而且是 8BIT 的 所以 MEMORY_CONFIG
下面第一项里要做设置 要不不好使
----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/-----------------------------------
----------------------------------------------------------------------------------------------------
修 改 最 后 的 TEXT_BASE 为 把 UBOOT 加 载 到 RAM 的 地 址 , 这 里 添
0XC700000,当然添 0XC300000 也可以 但是如果添 0XC300000 之前的似乎在
下载 LINUX 的时候会死机,因为地址空间不够
-----------------------------------------------------------------
-----------------------------------cpu/s3c44b0/------
-------------------------------------------------------------------
找到
#if CONFIG_S3C44B0_CLOCK_SPEED==60
ldr r0, =0x70081 /* 60MHz (Quartz=10MHz) 具体怎么算的 可以看我写的计算
方法说明*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0xac042 /* 75MHz */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
设置一下主频
------------------------------------------------------------------------------
--------------cpu/s3c44b0/-----------------------------------
--------------------------------------------------------------------------------
找到以下几项
主要是把频率改一下并把分拼设置对
void serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;
u32 divisor = 0;
/* get correct divisor */
switch(gd->baudrate) {
case 1200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 3124;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 3905;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;
case 9600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 390;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 487;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;
case 19200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 194;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 243;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;
case 38400:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 97;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 121;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif break;
case 57600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 64;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 80;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif break;
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;/*具体算法和上面主频算法在一个文档里*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 40;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
--------------------------------------------------------------------------
---------board/T2T/TT/-------------------------------
------------------------------------------------------------
这个没什么好说的,如果你用的是网上流行的原理图,改动基本没有,我的因为
加了些东西,所以这个文件改动很多。
但文件里主要就是对 44B0 各个管脚设置,哪个是 IO 哪个是 TXD、RXD。不多
说了,自己看数据手册 8-6 页,有点耐心。
---------------------------------------------------------------------
------------lib_arm/-----------------------------------
---------------------------------------------------------
好象网卡需要加个 INCLUDE
//待补充
这个文件不用修改,在网上找的讲解,顺便提一下
进行各种初始化设置,主要有:
cpu_init CPU 相关的设置, 具体在./cpu/s3c44b0/ 中.
board_init 板子相关的设置, 具体在 board/wx/wx20/ 中
interrupt_init 中断设置,我们没有用,具体在./cpu/s3c44b0/ 中
env_init 初始化环境变量, 具体要看用什么介质来存储环境变量,如果用 flash 来
存贮, 程序在 common/ 中.
init_baudrate 设置 baud 参数
serial_init 串口初始化, 具体在 cpu/s3c44b0/.
console_init_f 控制台设置, 具体在./common/
display_banner 显示标题.[这里可以鼓捣一下,让它输出些个性的东西:)]
dram_init 可用内存配置, 具体在./board/wx/wx20/.
flash_init flash 初始化,具体./drivers/.
接下来就是环境变量初始化, 网络初始化,最后到 main_loop,可以运行各种命令.
====================================
[5]烧写 FLASH
这部分可能过于简单,很少有人写,但是对于不了解 ARM 开发过程的人真的简
单吗?我是菜鸟,在这卡了 3 天:)
一般说来有几种方法,
1)板子原来的 BOOTLOADER 程序或者为烧写而编写的专用 ADS 程序
比较高级而快速的方法,很多现成的开发板都用这种方法(相对来说有实力的公
司),此状态下 CPU 是运行的,所以速度快。
比如 ZLG 的,但是对于初学或者不准备细研究硬件的人来说就比较麻烦,因为
要编写(改写)ADS 烧写程序。愿意的人可以看看。
2)FLUTED
和 FLASHPGM 一样,使用的好象叫边界扫描法,CPU 此时并不运行,因此烧写
的比较慢。
在这里也不推荐 FLUTED 这个软件,原因比较简单,麻烦+速度慢。
因为需要编写(改写)两个配置文件,而且是字符界面。倒是有人说这个软件只
能在 WIN98 下用的说法好象不对(现在有可以让 2000 和 XP 下用的方法)
喜欢的朋友可以用用
3)FLASHPGM(推荐)
很简单的程序,GUI 界面,速度尚好。
设置很简单,在 CPU 里选对型号,当然是 3 星的 44B0。在 FLASH 里也一样,
39LV160,29LV160 都有。
确定好地址,RAM 地址我的是 0XC000000(BANK7 上) FLASH 地址 0X0
(BANK0 上)
选完了以后读一下 FLASH 的 ID(左下脚的按钮吧)能读出厂家的 ID 就行。
然后是烧写了,PROGRAME 按钮,注意的是 FLASHPGM 不支持 BIN 格式,按
照下面方法处理。
再有就是尽量在写之前擦一下,PROGRAME 菜单里有个选项,打个钩就 OK。
具体烧写方法可以看我总结的另一篇文档,在这里只说说 UBOOT 相关的。
前面说过 UBOOT 编译以后产生 3 个文件
u-boot——ELF 格式的文件,可以被大多数 Debug 程序识别;
——二进制 bin 文件,纯粹的 U-BOOT 二进制执行代码,不保存 ELF
格式和调试信息。这个文件一般用于烧录到用户开发板中;
——Motorola S-Record 格式,可以通过串行口下载到开发板中。
FLASHPGM 不支持 BIN 格式的,可以烧写 u-boot——ELF 格式的文件,别看它
没扩展名,一样烧写。
还有,如果你懒(和我一样),拿别人现成的 BIN 文件来烧,FLASHPGM 还提
供了一个 BINTOS19 的程序,就在它的安装目录下。具体用法运行它,它自己
就告诉你了。
注意:有时(尤其是 FLASH 里已经有程序的时候)0XC000000 会莫名奇妙的提
示内存不可以写,有几个方法可以试试:把地址改成 0x10000000(好象是缓存
地址),之后点 EREASE 擦除芯片,擦除一般说来是不成功的,最后无论如何都
下不去,没关系,这时候关闭擦除对话框,然后 0x10000000 地址不变,烧
FLASH,我一般是烧写一个我自己写的 LED 测试小程序把内存占上:)。回来
这时候再把 0X1000000 换成 0XC000000 再按照正常操作,一般可以正常。
这现象的原因就是过去下的程序(多数是不正确的程序)正在运行 占用了 RAM
与 ROM,下个 LED 测试小程序就是把这几个部分清除掉。
如果以上方法还不正常,可以用另一个程序叫 FLASHP 就差 2 个字母:)很好!
在这里对这个程序的作者致敬!!
用这个软件擦 FLASH,然后再用 FLASHPGM 烧,原因是 FLASHP 擦厉害,但
写好象有些问题~~
细小的问题--patch 命令的使用
有的时候大家收到的别人移植好的 UBOOT 了 UCLINUC 了是以 patch 包发布的
这里转个写的比较好的 patch 命令的使用方法
文件:(在/root 下)
--- 2005-06-17 22:48: +0300
+++ -new/drivers/usb/Makefile 2005-07-27 08:11: +0300
......
......
由于 patch 文件的首行已经指明了路径,所以根据当前所在的目录,加不同的参
数使用 patch 命令:
1:如果当前的目录是和 的同级目录:
[root@kcn-110mw]#patch -p0 </root/
2:如果当前的目录为
[root@kcn-110mw]#patch -p1 </root/
3:如果当前的目录为
[root@kcn-110mw]#patch -p2 </root/
0,1,2,是指略去的 patch 文件中的前几级目录
细小的问题---VMWARE 安装与使用
mamajinco 发表于 2006-9-6 9:49:00
首先 推荐大家在开发的过程中使用 VMWARE 虚拟机 安装 LINUX
原因比较简单 开发过程中会频繁的在两个系统之间交换 对于没有两个计算机
的朋友来说 过于麻烦
对的不说了 说说开发里遇到问题
==================================
一 安装 VMWARE 虚拟机与 LINUX
1 分出个 10G 左右的地方
我是分个 10G 的 FAT32 格式分区来单独做 LINUX 的区域,推荐分出来的空间
大于 9G,因为对于新手来说 LIXUN 要尽量全部安装。
分区尽量是 FAT32 格式(WINDOWS 用的)NTFS 听有的朋友说过好象有问题。
推荐计算机内存大于 256M,我用的是 512M,开 VMWARE 再开 ACROBAT 时
就会明显慢。
安装后的 VMWARE 虚拟机基本是 3 种文件,VMWARE 程序文件我安在 C 盘下
了,VMWARE 的配置文件(安装后再添加的,比较小)和 VMWARE 虚拟出的
硬盘文件(选 10G,该文件就是 10G),所以我单独分出个驱存他们。
虚拟机里安装后的操作系统(一般都是 LINUX 吧,顺便说一下,你也可以按 WIN
了苹果了操作系统)
2 安装 VMWARE 虚拟机
VMWARE 虚拟机对于 WINDOWS 来说就是个软件,用这个软件虚拟出个计算
机来。对于 VMWARE 虚拟机里面安装的系统来说自己就独占了一台计算机。
安装没有什么特殊的,我用的是 ,选标准安装,基本一律下一步就搞定。
值得注意的是中间有问你分出来多大硬盘空间,默认是 8G ,改成 10G 吧。
之后是建立 VMWARE 虚拟机配置文件,根据自己的要求建立,基本不用改什么,
就是整错了也可以在后来的 SETTING 里改。
不多说了。
3 安装 LINUX
把 LINUX 安装盘放光驱里吧,启动虚拟机,自己就检测启动了。
多说一句,到这大家都明白了吧?启动虚拟机就相当于启动一个计算机,光盘自
动启动也跟物理上的计算机完全一样。
值得注意的是:如果电脑里安了虚拟光驱可能影响光盘自动启动,如果有问题就
把虚拟光驱卸了吧。
安装的时候同样没什么问题,手动分驱,按照内存大小的 2 倍分出来个 SWAP
分驱,其余的我分成一个驱,强制为主分驱,挂载点选“/”根目录,分驱格式选
EXT3……
多说一句,在分驱里就能看出来了吧?LINUX 完全独占了这 10G 的地方,看不
到 WINDOWS
二 安装 VMWARE-tools
VMWARE-tools 还是安装比较好,最起码 WIN 和 LINUX 交换文件就方便了
引用别人的文章 加上自己的注释吧
1、以 ROOT 身份进入 LINUX
2、按下 CTRL+ALT 组合键,进入主操作系统,点击 VMWARE 状态栏安装提
示,或者点击 SETTING 菜单下的 ENABLE VMWARE TOOLS 子菜单。
3、确认安装 VMWARE TOOLS。
这时我们并没有真正的安装上了 VMWARE TOOLS 软件包,如果您点击菜单:
DEVICES , 您 就 会 发 现 光 驱 的 菜 单 文 字 变 为 : ide1 : 0-> Crogram
FilesVMwareVMware ,这表示 VMWARE 将 LINUX
的 ISO 映象文件作为了虚拟机的光盘
注释:有的时候不能自动挂载,自己要在菜单里光驱项目里选挂载 VMWARE 安
装目录(不是配置文件存储目录,我的在 C 盘里)里某个目录的
4、鼠标点击 LINUX 界面,进入 LINUX。
5、运行如下命令,注意大小写。
mount -t iso9660 /dev/cdrom /mnt
加载 CDROM 设备,这时如果进入 /mnt 目录下,你将会发现多了一个文件:
。这就是 WMWARE TOOLS 的 LINUX 软件包,也就是
我们刚才使用 WINISO 打开 文件所看到的。
注释:在新版本里可以不用命令挂载和卸载了,打开 后 LINUX 桌
面会自动弹出光驱标志,双击打开。
cp /mnt/ /tmp
将该软件包拷贝到 LINUX 的 TMP 目录下。
umount /dev/cdrom
卸载 CDROM。
cd /tmp
进入 TMP 目录
tar zxf
解压缩该软件包,默认解压到 vmware-linux-tools 目录下(与文件名同名)。
cd vmware-linux-tools
进入解压后的目录
./
运行安装命令。
这时 install 提示你是否需要备份以前的配置文件,建议选择"y"。
等待 INSTALL 运行完成后,这时键入 START 命令,是不是可以看到漂亮的
LINUX 图形界面了?
三 使用 VMWARE TOOLS
必须注意的是 VMWARE TOOLS 在每次重起 LINUX 之后还必须也重起一下,
TMD,谁搞定不用重起告诉我一声
重起的方法:/etc/ restart
就有消息出来了
四 文件共享
我用的VMWARE虚拟机装的LINUX,要在LINUX和WIN中间传递文件用VM-》
SETTING 里的 SHARE FOLDER
该功能是把 WIN 下的一个文件夹共享给 LINUX。
这个功能必须装 VMWARE TOOLS 才能用。
共享以后在 LINUX 的 MNT 目录下就出一个 F 什么打头的文件夹,进去就是你
共享的文件夹名了
细小的问题---arm-linux-gcc 与 arm-elf-gcc 的区别
总看见有人问
arm-linux-gcc 为有 MMU 的 LINUX 准备的比如 2410 上的 LINUX
arm-elf-gcc 为没有 MMU 的 UCLINUX 准备的比如 44B0 上的 UCLINUX
就这么简单
闲聊 ARM 的入门(1)
我的笔记刚公布就有很多朋友来找我,把我当高手,问我“ARM 怎么入门”。我
不是高手,仍然是菜鸟。
但是回想起自己当时的迷茫,特意写了这篇东西,当作给和我一样的兄弟姐妹的
帮助吧。问这个问题的人多半不是已经工作的工程师,而是和我一样是学生,所
以这篇笔记就把看家当成我一样的菜鸟,高手勿怪。
首先声明:本人还没有找工作,事实上处于研究生刚毕业,还没开始找工作的空
闲时间,44B0 只是兴趣所在,打发时间。
所有看法完全是自己的感受,不代表任何他人。错了的观点各位帮我纠正。
再次补充:很多朋友看了上面的话就问我为什么研究生毕业了还不找工作:)说
是打发时间,其实是因为研究生的时候带了一个项目,申请提前毕业以后项目还
有块尾巴,答应导师把项目做完再走:)就这么简单。男人总点负点责,呵呵
以下问题常被问到,我就想到哪说到哪吧。
一 首先说说 ARM 的发展
可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程
师职位。
广义的嵌入式无非几种:传统的什么 51、AVR、PIC 称做嵌入式微控制器;ARM
是嵌入式微处理器;DSP;FPGA。
客观的讲,工作需求量上 DSP 的需求比 ARM 要多,而 ARM 和 FPGA 差不多。
DSP 因为数字处理与通信领域的空前发展而火暴,小到 MP3 射象头,大到我们
军品里的控制器,应用面很广。
FPGA 的兄弟一般做 ANSIC(特殊芯片设计,好象是这么翻译的)。
而 ARM 单纯说来并不比一个单片机强多少,但是它的独特就在于不断下降的价
格和提升的性能。这完全依靠于 ARM 公司的战略,厉害!!很佩服他们的战略
眼光!!
值得注意的是:在找工作中,企业(著名的,小的不算)对单纯的 ARM 硬件开
发工程师并不比单片机重视,很少有大企业的职位里写“从事过 ARM 开发优
先”。
写的多的是什么?“嵌入式 LINUX”
到这相信大家看出来了吧,需要的是硬件中的软件。
二 ARM 是硬件还是软件
很难说,ARM 是硬件,LINUX 是软件。
ARM 的硬件多半已经模块化了,像我这样把板子改成这样的就算动的多的了,
这同样是 ARM 公司的战略,再次佩服。
实际中的 LINUX 的开发工作更多,更耗时。从这方面说 ARM 应该算是软件了。
在找工作中更是这样,举个例子,联想里和 ARM 最接近的是“BIOS 工程师”是
软件,MOTO 里接近的是嵌入式 LINUX 工程师是软件。而其他很多公司把嵌入
式产品开发归为硬件。
所以,不要讨论这个,好好玩转自己的板子才是关键。实在不爽你就把自己叫“嵌
入式开发工程师”
三 要不要买开发板 买哪家
我的答案是“在你个人的学习方法”,但是如果看家是需要看这骗笔记的水平,个
人推荐还是买现成的。
1 买
买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心
自己硬件上的问题,我就是以便调试一边写驱动和程序,每次写驱动前就要先确
认硬件没问题。
另外,买板子更省钱和时间,我自己做的板子,原理图 PCB 花了 2 周以上!制
版又 15 天,回来以后焊接 44B0 160 个脚!那叫一个麻烦~~花了多少钱呢?2 层
板,制版费就 300 块!当然 我把接口都外引了,还做了个 20X18 的 LCD 背板,
板子比较大。
总体下来 元件+LCD 屏+PCB=11XX 块!够 2410 的了。
再有就是买的资料相对来说比较全,但是不要指望有技术支持!都是骗人的,卖
你之后就不会理你。
2 做
自己做可以更了解底层硬件,可以按照自己的要求加东西,比如我就加了 GPS
模块、 GPRS 模块 、SD 卡模块,扩了个 IIC 的 35 个键子的键盘、把 LCD 接
口按照买的 LCD 改装了,可以用 FPC 线直接连接。做的很爽的。玩一把吗。
当然,你可以有策略的做,比如像我一样,把 RAM 和 ROM,网络都保持和某
现成的板子一样,这样他们的资料你就可以拿过来直接用,给自己留个退路。其
他的如 SD 了 什么的自己做。都达到了~~就是费钱,费时间。
再有就是给做的朋友几点建议:尽量拿到现成的板子,尽量多搜集其他板子的全
套资料,一定要拿到一张没问题的原理图。
网上流传的原理图多数是龚俊 03 年画的,再这里对龚俊表达一下我的敬意!!
牛人!
但是那个图有个小 BUG,我指的是 03 版的,后来的没这问题了。8019 那地址
线和地址有问题。还有人仿照他的 PDF 图画的 SCH,更是漏洞百出!谴责!顺
便谴责把龚俊板子偷卖的人。
3 买哪家
个人感觉分 3 类吧
1)首先是 ZLG 的,资料非常的全,感觉他是真正想教你怎么开发 ARM,而不
是像有的公司自己技术都没做好就做个板子出来卖钱。但是最大的不利就是价格
太贵!而且主要是 PHILIP 的,货源比较麻烦~~可能有人说 21XX 系列的不贵啊,
那是总线不外扩的,只能跑 UCOS,不能跑 UCLINUX。但是说是话,21XX 系
列才是 ARM7 的价格性能结合点。ARM7 最适合做工业控制,ARM 普及,销量
都是怎么来的?都是 ARM7 来的,而 44B0 是典型的商业片子。但是,这里如果
你看中的是为工作做准备,还是选能跑 UCLINUX 的吧。
但是仍然作为第一个推荐,因为菜鸟时期,合适的资料太重要了!!在这里被
ZLG 的务实精神感动!你看人家那代码写的。
2)感觉立宇泰的 44B0 不错
硬件没别的,就是资料比较全的说,不像有些家,原理图直接拿人家的,还错的
~~
3)找个最便宜的
好象最便宜的有卖 350 的吧?也是没别的,就是即省了钱 还省时间搜集资料,
至于资料全不全,别计较了~~硬件肯定好使就行吧。
四 要不要有 51 AVR 等单片机基础
有更好,但没有也无所谓。
两个月以前,我只是看别人做,耳濡目染~~,本科学过单片机,从来没做过。我
们这的技术主干做 AVR 和 51,我就跟他们调过 C 语言程序。你看出来了?我是
个不折不扣的菜鸟吧?
但是做这个之前我特意找了 ZLG 的两本书,看了里面的例子和原理图,这很重
要。例程里有汇编有 C,都看懂了就 OK,不用自己现写
五 开发都需要学习哪些软件
总结起来最主要的有以下几个吧
1 ADS 调试用
确切的说是 ADS+AXD。ADS 里包含 AXD。原来都用 SDT 后来 ARM 公司停止
对 SDT 支持了,改支持 ADS 了,还是用 ADS 吧。
有的人的程序发布的仍然是 SDT 版本的,但基本都可以找到相应 ADS 的,新人
在这里不要发蒙。ADS 是编译器,AXD 是调试器。便宜成 AXF 以后再在 ARM
的 RAM 里调试。
2 PLASHPGM
FLASH 烧写的软件。AXD 在 RAM 里调试,掉电就没有了,方便程序修改。调
试好的程序再下到 FLASH 里,上电直接运行。
同类的软件还有很多,什么 FLUTED 了、FLSHP 了都是,但 FLASHPGM 最好,
要是有人还问 FLASH 不支持 BIN 格式文件的问题就要看我写的 PLASHPGM 使
用了。
3 BANYANT 调试代理(不知道名对不,起这么个难记的,我一般都叫它“半羊”
因为知道它那几天刚吃了烤羊)
调试代理就是用它帮你使用更简单的 JTAG(便宜啊)来实现原本 1K 才卖的
JTAG 仿真器的大部分功能。JTAG 调试原理看我另一篇笔记。简单的就可以把
他理解为你自己做的 JTAG 的驱动就行了。
调试代理还有很多种,什么 H-JTAG 了、ARM7 了(不知道具体叫什么,就记得
可执行文件叫 )都是,BANYANT 比较好。
需要注意的是,没种调试代理安装方法虽然都简单 但都不一样,需要看说明。
而且 AXD 调试之前都要运行。省钱了,就别怕麻烦了。
4 ARM-ELF-TOOLS 工具链
里面是 UCLINUX 开发用的工具比如 ARM-ELF-GCC 只类的。工具链就是把很
多工具打包在一起发布的方便你开发的东西。具体安装方法看我另一篇笔记。
另外如果你开发 LINUX 就要用 ARM-LINUX-TOOLS,不一样,不通用。
5 U-BOOT
大名鼎鼎的 BOOTLOADER 生成工具,同类的好象还有 VIVI(名字很暧昧~~)
生成的 BOOTLOADER 烧到 FLASH 里,然后就可以用 BOOTLOADER 下载 烧
写其他了
有了 BOOTLOADER 才能下 UCLINUX。BOOTLOADER 就像电脑上的 BIOS。
当然 UCOS 的不用这个,用什么我不知道:)
最新版本是 具体使用方法看我另一篇笔记吧。
6 UCLINUX 包
UCLINUX 的源码包,不用多说了吧?建议大家用现成的先体会一下,然后再自
己编译,裁剪。因为单独 UCLINUX 的编辑技术上比较简单,但涉及的方面还是
比较广的。
7 VMWARE
老牌的虚拟机软件,在一个机器上虚拟出一个机器装 LINUX(PC 上用的),省
得你来回开关机了。记得装 VMWARE-TOOLS,安装方法在我另一篇笔记里。
六 有哪些书推荐
主要推荐 ZLG 的三本书,有这 3 本再加网络就不用别的书了,其中主要推荐前
2 本,3 是介绍体系结构的,也不错
1 ARM 嵌入式 LINUX 系统构建与驱动开发,北航版
驱动写的很详细,前期开发介绍也很好
2 ARM 嵌入式系统实验教程(二),北航版
有 ZLG2200 的原理图,实验程序和注释,了解人家是怎么开发的。
3 ARM 嵌入式系统基础教程
最重要的是体系结构,汇编部分介绍,看看吧,增加理论素质。
4 44B0 数据手册
写在这里是强调它的重要。
不推荐 ZLG 早期出的红色皮的 ARM 什么体系结构~只类的
写的太多,看烦了。
其他的书没了几本,没看见好的,大家有看过的推荐吧。
闲聊 ARM 的入门(2)
mamajinco 发表于 2006-9-7 9:34:00
七 选 UCOS?UCLINUX?LINUX?VXWORKS?还是当单片机用
1 搞开发,工程设计,用 UCOS,小巧,多进程,简单,体现了 ARM7 的精髓。
2 LINUX 正根的嵌入式系统,LINUX 消费与通信领域用的比较多,但缺点是必
须 ARM9 才能跑,ARM9 的板子自己做就不行了,6 层板太贵。买开发板 1K 达
底吧。但是还是推荐选 ARM9+LINUX
3 UCLINUX 算投机嵌入式系统:)ARM7 上可以跑,由有 LINUX 近亲,学好
好可以比较方便的转向 LINUX,像我一样的穷鬼用吧,呵呵
4 VXWORKS
学好后可以找到高薪工作,但工作机会本身并不比 LINUX 好找。
5 当单片机用
不推荐,虽然我景仰的 ZLG 一直号召这么干。因为对于学习来说多进程的系统
设计才是 ARM7 的玩头,至少你也要整个 UCOS 啊:)
有朋友问我先学这个当基础不行吗?那当然可以~~但我当时就用了 1 周搞定,就
是我先的 ADS 在 RAM 中调试的笔记。后来我清空 FLASH 用的小段程序还是当
时写的 LED 闪烁程序呢。另外 1 周里其中还因为自己过于菜,没把 OM 设置好
导致晶阵不阵
哈哈。这个是必须做的,但一带而过。目标放的远一点。
八 学习要用多长时间
我从菜鸟到现在两个多月,中间被打扰数次。仍然搞定了 PCB 设计与制版,RAM
调试,FLASH 下载,UBOOT 移植和下载 UCLINUX(没剪裁,用现成的),LCD
驱动。
再次坦诚的说:我确实比较菜,说这些不是让大家羡慕,只是告诉你们“你们应
该比这个更好”
我相信良好的态度+合适的方法+及时的总结=成绩
九 ARM 都玩什么
就几点
1 硬件设计
2 系统移植
3 驱动开发
4 应用开发
没了。其中推荐把注意力放在后两个上,3 有难度,4 比较灵活,最重要的是都
是找工作的砝码。
十 我用的什么板子
很多人问我这个问题,我特意写过一个的。再说一次吧。
我是自己做的,RAM、ROM、8019 等比较麻烦而当时的自己不理解的都按照龚
俊的做的。保持其他不便的情况下做了如下改动。
1 加了串口通信的 GPS 模块、 GPRS 模块
一个 UART0,一个 UART1,当与要用超级终端时用跳线切换。
2 SD 卡,和 7843 触摸屏
同时挂在 SPI 总线上,因为 SPI 只能挂一个设备,同时还做了 I/O 模拟的准备,
把两个设备又通过跳线挂在 4 个 IO 上。
3 扩了个 IIC 的 35 个键子的键盘
用的 ZLG 的 7290,不占用 CPU,最大支持 64 个键子,只上了 35 个,其他留接
口。
4 把 LCD 接口按照买的 LCD 改装了,可以用 FPC 线直接连接。
所以改动虽然多,但真正很移植了,初期调试有关的并没动,就是为了现在不
那么菜的时候做准备:)
十一 开发流程
这里是我的开发流程
1 设计原理图(含 WIGGLER 的 JTAG 访真器)
2 设计 PCB(含 WIGGLER 的 JTAG 访真器)
3 制版
4 焊接电压,确定电压没问题
5 焊接 44B0+JTAG 电路+WIGGLER 的 JTAG 访真器+周边电路,用 BANYANT+
仿真器连接,BANYANT 提示错误,但可以显示 44B0 编号,好象是 0X0F0F0F0F
只类的,说明 44B0 没问题
6 焊接晶体+RAM+ROM+周边电路,用 BANYANT+仿真器连接,可以显示正确
的 44B0 了
7 用 BANYANT+仿真器连接,开 AXD,在命令行窗口操作 RAM,看可不可以
修改,可以的话(用内存窗口看 RAM 地址)RAM 就没问题
可以用这个命令“setmem 0xc000000,0xffffffff,32”
我的 RAM 挂在 BANK6 上 所以地址是 0XC000000,你要是改了就也得改。
8 用我写的《自己写了个 C 工程模板又写了个使用说明 》里的方法调试程序吧,
写个简单的,我当时写个 LED 闪烁的。看好使不。
9 把程序按照《FLASH 烧写总结 》里的烧到 FLASH 里,测试一下
10 按照《UBOOT 移植操作》移植 UBOOT
11 按照《UCLINUX 下载简单说明》下个 UCLINUX
12 看看驱动开发的方法,自己写个驱动看看
13 还有很多事东西着你玩 呵呵
十二 关于 JTAG 访真器
JTAG 访真器现在用的多是简板的,一个 244 那种,用的没什么不好。
按照并口定义不同分几种,建议选 WIFFLER 定义的,因为支持的软件多。这个
网上多的是,不多说了。
值得提的是有的 JTAG 访真器原理图上有跳线用来使能复位信号,这个一般不跳
上。就是不用复位信号,因为 JTAG 协议里本身也可以控制 44B0 复位。
当然,板子上的复位信号跳线也不用跳。
十三 哪个公司的 ARM
这个是问题比较简单。
1 ARM7 主要就几个公司的
三星,PHILIP,ATMEL 的
ATMEL 的有比较便宜的 AT91SAM7S32 和 AT91SAM7S64 专为 8 位应用产品
量身定做,价格很便宜好象《3 刀吧。和 PHILIP 的 21XX 差不多,资料太少,
项目中选还不错。
其他两家上面说了的不多说了吧
2 ARM9
这个玩 2410 和 2440 的多吧,现在 2440 还比较火啊 可以考虑买个了
但是 2410 就比较便宜了,作为学习来说反到和不错,推荐整一个:)
其实 ARM9 用的最多的领域应该是消费电子,比如手机 PDA,而这上面用的多
的应该是 INTEL 的和 TI 的吧。
但是 INTEL 的 TI 的入门材料少,价格高,自己看情况定吧。
UBOOT 命令总结(转)
很好的 UBOOT 命令总结,我在起步时就是看的这篇东西,熟悉了以后就用“?”
看自带帮助就行:)
Printenv 打印环境变量。
Uboot> printenv
baudrate=115200
ipaddr=
ethaddr=12:34:56:78:9A:BC
serverip=
Environment size: 80/8188 bytes
Setenv 设置新的变量
Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=
ethaddr=12:34:56:78:9A:BC
serverip=
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
Saveenv 保存变量
命令将当前定义的所有的变量及其值存入 flash 中。用来存储变量及其值的空间
只有 8k 字节,应不要超过。
Loadb 通过串口 Kermit 协议下载二进制数据。
Tftp 通过网络下载程序,需要先设置好网络配置
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr
Uboot> setenv serverip (tftp 服务器的地址)
下载 bin 文件到地址 0x20000000 处。
Uboot> tftp 20000000 (应位于 tftp服务程序的目录)
Uboot> tftp 32000000 vmlinux
把 server(IP=环境变量中设置的 serverip)中/tftpdroot/ 下的 vmlinux 通过 TFTP
读入到物理内存 32000000 处。
Md 显示内存区的内容。
Mm 修改内存,地址自动递增。
Nm 修改内存,地址不自动递增。
Mw 用模型填充内存
mw 32000000 ff 10000(把内存 0x32000000 开始的 0x10000 字节设为 0xFF)
Cp 拷贝一块内存到另一块
Cmp 比较两块内存区
这些内存操作命令后都可加一个后缀表示操作数据的大小,比如 表示按字
节拷贝。
Protect 写保护操作
protect on 1:0-3(就是对第一块 FLASH 的 0-3 扇区进行保护)
protect off 1:0-3 取消写保护
Erase 擦除扇区。
erase: 删除 FLASH 的扇区
erase 1:0-2(就是对每一块 FLASH 的 0-2 扇区进行删除)
对 DataFlash 的操作
U-Boot 在引导时如果发现 NPCS0 和 NPCS3 上连有 DataFlash,就会分配虚拟的
地址给它,具体为 :
0xC0000000---NPCS0
0xD0000000---NPCS3
run 执行设置好的脚本
Uboot> setenv flashit tftp 20000000 \; erase 10020000 1002FFFF\;
20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit
bootcmd 保留的环境变量,也是一种脚本
如果定义了该变量,在 autoboot 模式下,将会执行该脚本的内容。
Go 执行内存中的二进制代码,一个简单的跳转到指定地址
Bootm 执行内存中的二进制代码
要求二进制代码为制定格式的。通常为 mkimage 处理过的二进制文件。
起动 UBOOT TOOLS 制作的压缩 LINUX 内核, bootm 3200000
Bootp 通过网络启动,需要提前设置好硬件地址。
? 得到所有命令列表
help help usb, 列出 USB 功能的使用说明
ping 注:只能开发板 PING 别的机器
usb
usb start: 起动 usb 功能
usb info: 列出设备
usb scan: 扫描 usb storage(u 盘)设备
kgo 起动没有压缩的 linux 内核
kgo 32000000
fatls 列出 DOS FAT 文件系统
fatls usb 0 列出第一块 U 盘中的文件
fatload 读入 FAT 中的一个文件
fatload usb 0:0 32000000 把 USB 中的 读到物理内存 0x32000000 处!
flinfo 列出 flash 的信息
nfs
nfs 32000000 :
把 (LINUX 的 NFS 文件系统)中的 NFS 文件系统中的 读入内
存 0x32000000 处。
CPU 频率计算方法---PLL 设置
看见很多朋友不会计算 PLL 分频和串口频率,整理个笔记发上来
cpu 时钟频率和串口波特率的计算公式
S3C44B0 的系统时钟设置公式
Fpllo 为系统的主频,此处为 60MHz
Fin 为晶振的频率,此处为 10MHz
一. 通过 PLL 输出时钟脉冲频率的计算:
a) Fpllo = (m × Fin)/ (p × 2^s)
b) m = (MDIV + 8) , p = (PDIV + 2), s = SDIV
c) 20MHz < Fpllo < 66MHz
d) Fpllo * 2s < 170MHz (s 应该尽可能的大)
e) 1MHz <= Fin/p < 2MHz (最好是 Fin/p = 1MHz)
f) 如果 PLL 打开则:Fpllo = Fout
g) 这样计算出 MDIV, PDIV, SDIV 的值写入 PLLCON 寄存器中就可设置 Fpllo
的输出频率。
根据 d)知道 s=1
根据 e)知道 p=10
再根据 a)就知道了 m=120,注意 2^s 代表 2 的 s 次方
再根据 b)知道 MDIV=112, PDIV=8, SDIV=1
根据 44B0 数据手册 5-14 页算出 PLLCON=0X70081
注意:PLLCON 的结果不为一!比如 P 可以取 8 取 7……
注意:PLLCON 寄存器是 20 位的 各个区域中间有空的
比如 MDIV 是寄存器里 19-12 位,PDIV 是 9-4 位两个中间有 11,10 位空,如果
用 2 进制算就添 0
不过做过硬件的就知道 大可不必只要把 MDIV, PDIV, SDIV 用 WEINDOWS 自
带计算机直接由 2 进制转换成 16 进制顺序写就行
比如 MDIV=112=0x70, PDIV=8=0x08, SDIV=1=0x1
PLLCON 寄存器就是 0x70081(看到这 连手册都不用翻了吧?:))
还得多说一句 不是 0x700801,因为 SDIV=1=0x1 不是 0X01,跟 PDIV=8=0x08
不一样
S3C44B0 的 UART 波特率计算公式---分频设置
S3C44B0 的 UART 波特率计算公式
MCLK 即主频 此处为 60MHz
UBRDIVn(又称 divisor) = ( (int)(MCLK / (bps * 16) + ) – 1 )
MCLK = Fout = Fpllo
Bps = 1200,9600,19200,38400,57600,115200
例如 主频=60MHz=60000000Hz
串口速度选 115200
divisor=取整[60000000/(115200*16) + ] -1 = 32
MINICOM 设置
最近的朋友很多问 MINICOM 设置的问题
把原来写的整理一下 发一下 现成的还行 有朋友问我驱动怎么开发
这个就比较麻烦了:)还是等我过段时间了也把手头的几个驱动搞定了再说
---------正文-------------
MINICOM 是 LINUX 提供的和 WEINDOWS 超级终端一样的工具,一般用做串
口与开发板通信,当然有的板子也用 USB,但这里只介绍串口的设置
一 VMWARE 虚拟机添加串口(如果没用虚拟机可以跳过这步)
如果在 VMWARE 虚拟机下 一定要记得先确认这步 要不不好使 很多朋友的问
题就在这里!
先关闭虚拟机下的 LINUX,然后设置一下虚拟机:在 vm-〉settings-〉hardware
里添加串口 COM1 COM2 都加上吧
二 设置 MINICOM
进 LINUX 系统 开个控制台 字符里输入 minicom 就启动了
这时一般还要设置一下
Ctrl+A 进入控制界面(Esc 返回)按 Z 进设置
一般设置两个
1 按 O(注意:是 O 不是零)设置第三第四项,分别是串口设置与 MODEM 设
置
串口设置:不用说了吧 进去都看明白了 敲字母 设置相应项目 比如“115200
8-N-1”
MODEM 设置:也要设置一下 要不有的看不到东西 把上面两个选项都清空 就
是按那行前面的字母(好象是‘A’和什么)然后光标就跳过去了 删之
回车 到开始选第三第四项的菜单 选下面的保存(别忘了保存 菜鸟们常犯)
2 回到刚才按 O 的界面 看一下 P 里面的串口设置对不对
对就不用改了 不对改之
提醒一下:LINUX 设备的编号是从 0 开始的 比如串口 1 也就是 COM1 在 LINUX
里的设备号叫 ttyS0
串口设置里面要用到 那里添全部路径也就是"/dev/ttyS0"
好了 就这么简单
uclinux 编译文档
user94/mamajinco/upload/ 编译的过程是非常折磨人的,
我在这整了 3 天!妈的!把很多公司的都试遍了。第 3 天的晚上 10 点搞定了~~
但说真的,很难写下来整体过程,因为跟版本有关,跟各个板子也有关系……
所有的移植都是用 做的,谁让咱是菜鸟呢,先从简单的做。
总结几点吧,介绍个现在主流的立宇泰的板子 UCLINUX 编译方法和我自己拿
HFRK 的板子提供的 UCLINUX 改的 8019 和 NFS 的方法
一 立宇泰(凭回忆,有些地方当时没记下来)
1 下载
前两个 UCLINUX 的网站有下的,很快。
后两个立宇泰公司网站有下的,很小,也很快。
2 安装
在 LINUX(我用的 VMWARE 跑的 PC4)下双击,选运行就行,不多说了,有
人这里出过问题,提示一个错误,去 21IC 搜索一下,把一个参数改一下就行。
但我的没这个问题。
考到/usr/src/下,右键截压缩到当前目录,也没什么说的。就是记得硬盘要有足
够的空间,这个比较大,一般还得有几个备份,得 2G 左右。
这个补丁确实不错!!好商家!还共享了,改了一堆文件。
截压缩不说了,得到 PARCH 文件,拷贝到刚才 UCLINUX 源代码包目录下,注
意,要到 uClinux-dist 目录里。不是 目录里。
还不能直接补丁,需要改一下 uClinux-dist/vector/Samsung/4510B 这个文件夹,
直接把名字改成 44B0 就行了。
打开终端吧,CD 到 uClinux-dist 目录里输入以下命令:
patch -p1 <
注意-P1 是数字一不是 L 字母,命令什么意思就不解释了,GOOGLE 一下,有
个兄弟专门讲了。
打包到最后会有问题,因为刚才咱们把 4510 直接改成 44B0 了嘛,问你问题的
时候敲的 N 吧,退出。
把 uClinux-dist/vector/Samsung/44B0 里 M akefile 和 rc 打 开 , 对 着
改。
具体方法是:双击(这里 PC 机都默认使用 GNOME,比 KDE 方便,比如双击
打开)查看 PATCH 文件。对着改吧。
补充个语法知识:.patch 里面主要有几种符号分别是“+++”“---”"+""-""@@""diff"
每个区域都是 diff --- +++ @@四行开始 之后是+ -或者无符号的行,+代表在一
个位置加一行,-代表删除一行,什么都不带就什么都不做,用来定位的。
好了,文件最后可以找到 diff uClinux-dist/vector/Samsung/44B0开始的文件了吧?
对着把Makefile 和 rc 改了吧。
打完补丁,还得做一件事,把/uClinux-dist/ 改
了
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
#endif
后加个
#ifdef CONFIG_BOARD_MBA44
extern char romfs_data[];
extern char romfs_data_end[];
#endif
#ifdef CONFIG_BOARD_MBA44
{0, 0xc700000, -1},
#endif
改策成
#ifdef CONFIG_BOARD_MBA44
{0, romfs_data, -1},
#endif
要不编译后的内核运行的时候会有“Kernel panic: VFS: Unable to mount root fs on
XXXXX”错误
3 设置
make menuconfig
当然 也可以 make Xconfig 但不推荐,虽然显示很好,但速度慢~~
进了菜单,基本就几个键子上 下 左 右 回车 空格。
选什么比较麻烦,建议第一次先用刚才下的 configfiledemo 立宇泰的设置文件,
解压以后是三个文件,分别对应主菜单,内核和用户菜单。
选择 Load an Alternate Configuration File
里面输入文件的地址与名称,记得开始的时候说的 VMWARE-TOOS 共享吧?把
这几个文件拷贝到合适的目录下吧,我就放在 下了。
左右选《EXIT》退出。选保存。
一会自动弹出 KERNEL 设置菜单,和上面一样 Load an Alternate Configuration
File,选 config_kernel 文件。
需要注意的是这里的 USB 好象不对,因为板子上没整 USB(以后再整)就把 USB
的选项直接去掉了(到 USB 子菜单下把[*]去了)。
要不会有 错误。
System Type 里要改一下
(Samsung) ARM system type
[*] Set flash/sdram size and base addr
(00800000) (S)DRAM Size
(00200000) FLASH Size
(S3C44B0X-MBA44) Board Implementation
Block devices 也改一下
[*] RAM disk support
(4096) Default RAM disk size
(AMD) FLASH type
(AUTO) FLASH size
(AUTO) FLASH bit width
General setup 改一下
[*] Timer and CPU usage LEDs
[*] Timer LED
[*] CPU usage LED
其他没说就是别动
左右选《EXIT》退出。选保存
一会自动弹出 USER 设置菜单,和上面一样 Load an Alternate Configuration File,
选 config_user 文件。(语法多整齐)
没有注意了,直接左右选《EXIT》退出。选保存。
说实在的,要是没有这些 CONFIG 文件,自己改是件很麻烦的事,本人就尝试
了自己增加 NFS 和修改 8019(我的板子是自己画的和这个不一样)那叫一个麻
烦~~~。建议大家新手还是先把这些顺利的做完了再说改的。
退出以后就是编译了。
4 编译
几大命令
make dep
make clean
make lib_only
make user_only
make romfs
make
顺利的话一次全的执行了,但第 3 步要是自己鼓捣过在这里就要受苦了,比如后
面要讲的把驱动编译进内核里。
这里要说的是,出问题不可怕,但一要做好记录,知道自己改什么,错误可能出
现在什么地方,因为报告的错误很可能不是出现错误的位置。二要善于搜索,使
用 GOOGLE 搜索。三 要 BBS 提问的时候把错误,操作记录都说清楚了,等待
高手给你解答。四就是自己要积累看 MAKE 错误的知识。此外别无他法!
二 好了
我最后用的是 HFRK 的包,版本是 2005311,不用打补丁。但听说所有 2005311
的包都不用打了,好消息啊。但编译的过程仍然折磨人。
设置与编译的过程仍然和上面一样,这里共项我的 CONFIG 文件供大家参考吧。
就不多说了。
下面说我自己改 8019 驱动的方法。
8019 用的是 drivers/net/下的 文件改的。
改之前要差几点:8019 是 8 位还是 16 位,地址线是怎么对应的(8019 是 ADDR1
对 44B0 的 ADDR 几?),8019 挂在 44B0 的哪个 BANK 上,8019 使用哪个中断,
中断号多少。
好了,对应的改吧。
先改文件。
drivers/net/
找到 CONFIG_BOARD_MBA44,修改一下中断号 dev-irq,改成我们电路中使用
的 EINT1(中断号 24),挂在 BANK3 上地址 0x06000000
……
#elif defined(CONFIG_BOARD_MBA44)
static int once = 0;
if (once)
return -ENXIO;
dev->base_addr = base_addr = 0x06000000;
dev->irq = 24 ;
once++;
……
注意:一定要知道 8019 地址线是怎么对应的,我的是 0 对 0(8 位)但有的朋
友 8019 是 7 对 0,就要改了,但是具体哪个文件忘了,GOOGLE 搜索一下吧:)
进 make menuconfig 里把以下选了
1 General Setup --->
Networking Support
2Networking options --->
Packet socket
TCP/IP networking
3 进 Networking device Support---》
4 File system --->
Network device support?
Ethernet (10 or 100Mbit) --->
Other ISA cards
NE2000/NE1000 support
注意:这里通过[ ] 16Bits mode support 选择 8019 工作位,我没选,因为
做的是 8 位的
4 Network Applications --->
arp
ifconfig
inetd
ping
route
好了,之后就是编译了,烧写,然后测试一下 PING 宿主机,NFS 挂一下看看。
注意:宿主机的防火墙要关了,不然 PING 不通,当然 NFS 也不行。
好了,编译内核就到这里,因为过于繁琐,只能分部分来简化写了~~大家有问题
再交流吧。
搞定 UCLINUX 移植以后就开始整个最小的程序吧,当然是 HELLOWORLD 了:)
一 先写个 (对于小代码我喜欢先在 WINDOW 下建个“新建 文本文
档.txt”再在里面写代码,然后保存后改名成 注意的是扩展名也要从
TXT 改成 C 才行,原来说过,不多说了)
里面写下面等号里的代码:
==================
#i nclude <>
#i nclude <>
int main(void)
{
printf("hello world ! I got it!\n");
return 0;
}
==================
不用解释了吧:)
二 然后编写个 makefile 吧,别总用 arm-elf-gcc 了。
为以后编写大规模程序打个基础:)
建个 makefile(和前面一样,先 TXT 然后改名,没有扩展名)
=====================
EXEC = helloworld
OBJS =
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
rm -f $(EXEC) *.elf *.gdb *.o
======================
基本能看明白吧?MAKE 的语法比较复杂,就不多讲了,可以看我在前几篇笔
记里推荐的 ZLG 那本书。但幸运的是基本不用自己动手了,LINUX 源代码里有
很多 MAKE 拿来改改吧:)
三 下面就是有朋友问我怎么把程序下到板子里了
一般说来有几种方法。
1 板子挂载宿主机的 NFS 共享目录,把程序拷贝到/tmp 目录(在 RAM 里)测
试一下,但缺点是掉电要消失,只适合做调试时用。
2 做 JFFS 之类的日志文件系统,和上面一样 NFS 挂载拷贝过来,JFFS 文件系
统可以保证掉电不消失,类似 U 盘里拷贝程序(只是结果类似,原理完全不同)。
3 直接把程序烧写进 ROMFS 文件系统,这里就只介绍这种。原因有两点 首先
我还没学怎么做 JFFS,其次 我还没学怎么做 JFFS。哈哈
好了,那开工。
1)在 uClinux-dist/user/下建立目录 hello
把 和 makefile 拷 贝 到 里 面 , 怎 么 拷 贝 不 用 说 了 吧 ?
VMWARE-TOOLS 共享文件夹吧。
2)修改 uClinux-dist/user/makefile
在适当位置 找一行(这句语法扎堆的地方)加
dir_$(CONFIG_USER_HELLO) += hello
3)记住 CONFIG_USER_HELLO 这个名(自己可以改的 )
在 uClinux-dist/config/ 里加(扎堆)下面两行
CONFIG_USER_HELLO
Only print hello world
上面是名(和前面必须一致)下面是注释
4)改 uClinux-dist/config/ 里按照扎堆的原则加下面几行
#####################################################################
########
mainmenu_option next_comment
comment 'Hello World'
bool 'demo' CONFIG_USER_MYAPP_DEMO
endmenu
#####################################################################
########
#号中间加的就是语法了,基本意思就是在 Hello World--->下加个[]demo
编译过内核的都熟悉吧:)
5)像编译内核一样编译了
进内核源代码目录,比如 uClinux-dist
make menucinfig
把主菜单选好了,不用说了吧?我的编译内核笔记里有,当然如果不想修改内核
就只选上以下这个
Kernel/Library/Defaults Selection --->[*] Customize Kernel Settings (NEW)
意思是修改 USER 程序
EXIT 保存
然后在 Customize Kernel Settings 菜单里最后会出现 Hello World--->
回车进去以后看见[]demo 了吧?
选上
EXIT 保存
6)编译
几大命令~~~
make dep
make clean
make lib_only
make user_only
make romfs
make
之后在生成 uClinux-dist/image 下有了
7)烧写到板子里
板子里有 UBOOT 了吧?
顺序做下面步骤(我在 UBOOT 编译笔记里写过,再写一次)
A:loadb 0xc500000
B:发送(KERMIT 协议)
C:erase 0x50000 0x1fffff
D:cp 0xc500000 0x50000 文件大小
注意:文件大小就是在传输完 后显示的数字 0X 开头=什么的那
个 0X 数字
比如提示是 0X0012a7f1=1222641
就 0X0012a7f1/4+2=0x4A9FE 命令就是:cp 0xc500000 0x50000 0x4A9FE
E:重起板子 就进 UCLINUX 了
8)板子进到/bin 下 看是不是有个 helloworld?
执行它就看见“hello world ! I got it!”
注意:因为把文件编写到内核了,所以不是用./helloworld
直接在任何目录下写 helloworld 就行
最简单的驱动---让 LED 闪一闪-1
user94/mamajinco/upload/ 这几天抽时间做了几个驱动,基本都是
字符设备,什么 GPS 模块了 GPRS 模块了 LCD 了
有很多朋友关心驱动,但更菜的菜鸟居多:)总结了一下 把 I/O 驱动改成个更
简单的 LED 驱动吧
做的工作非常简单,就是让连在 GPC0-GPC2 上的 LED 顺序闪 10 下
目的就是演示一下驱动过程。
一 先补充一下基础知识 懂的朋友就不用看了
嵌入式驱动的概念
设备驱动程序是操作系统内核和机器硬件之间的接口,设备驱动程序为应用程序
屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程
序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,
它主要完成的功能有:对设备进行初始化和释放;把数据从内核传送到硬件和从
硬件读取数据;读取应用程序传送给设备文件的数据、回送应用程序请求的数据
以及检测和处理设备出现的错误。
Linux 将设备分为最基本的两大类:一类是字符设备,另一类是块设备。字符设
备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件 I/O 一
般就紧接着发生了。字符设备以单个字节为单位进行顺序读写操作,通常不使用
缓冲技术;块设备则是以固定大小的数据块进行存储和读写的,如硬盘、软盘等,
并利用一块系统内存作为缓冲区。为提高效率,系统对于块设备的读写提供了缓
存机制,由于涉及缓冲区管理、调度和同步等问题,实现起来比字符设备复杂得
多。LCD 是以字符设备方式加以访问和管理的,Linux 把显示驱动看做字符设备,
把要显示的数据一字节一字节地送往 LCD 驱动器。
Linux 的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在
/dev 目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完
成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设
备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类
的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux 有约
定俗成的编号,如硬盘的主设备号是 3。Linux 为所有的设备文件都提供了统一
的操作函数接口,方法是使用数据结构 struct file_operations。这个数据结构中包
括许多操作函数的指针,如 open()、close()、read()和 write()等,但由于外设的种
类较多,操作方式各不相同。Struct file_operations 结构体中的成员为一系列的接
口函数,如用于读/写的 read/write 函数和用于控制的 ioctl 等。打开一个文件就
是调用这个文件 file_operations 中的 open 操作。不同类型的文件有不同的
file_operations 成员函数,如普通的磁盘数据文件,接口函数完成磁盘数据块读
写操作;而对于各种设备文件,则最终调用各自驱动程序中的 I/O 函数进行具体
设备的操作。这样,应用程序根本不必考虑操作的是设备还是普通文件,可一律
当作文件处理,具有非常清晰统一的 I/O 接口。所以 file_operations 是文件层次
的 I/O 接口。
二 开始写了
采用了在代码里加注释的方法,同时把几个文件上传了一下,喜欢的朋友可以下
载当作模板。每个文件以==隔开
一共需要写写 3 个文件,1 个驱动头文件,1 个驱动文件,一个驱动测试用程序
文件
分别是 , 和
简单说说驱动都做什么,怎么做
1 系统加载驱动
2 应用程序里打开设备(文件)
3 应用程序对设备操作
4 应用程序关闭设备(文件)
5 系统关闭设备
应用程序如何对设备操作?
记得 C 语言里怎么写文件吗?这里很相象的。对于一般的字符设备(还有块设
备,网络设备等等)主要有 3 个函数(还有很多,可以看)llseek read: write:
ioctl: 这里只用 ioctl:控制函数,当然也可以使用读写函数操作 IO 口,但 ioctl:
似乎更适合。
具体实现可以看 文件了。
中主要有几个函数 分别负责初始化和清除,打开和关闭。以及 ioctl 对串
口寄存器写一些数据。
初始化和清除,打开和关闭函数里都各有一句主要句,已经分别作了注释。只要
记住就好了。
对寄存器操作就不单独说了,需要看 44B0 数据手册了。好了 剩下的看代码吧。
==============================
============================
==============================
/****************************************Copyright
(c)**************************************************
** FREE
**
**--------------File Info-------------------------------
** File Name:
** Last modified Date: 2006-9-9
** Last Version:
** Descriptions: User Configurable File
**
**----------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date: 2006-9-9
** Version:
** Descriptions: First version
**
**-------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:
** Descriptions:在此忠心感谢 ZLG 的模版 我的高质量编程意识起源于此
**
*****************************************************/
//防止重复包含此文件而设置的宏
#ifndef __CONFIG_H
#define __CONFIG_H
//包含必要的头文件
#i nclude <linux/>
#i nclude <linux/> //模块必须包含的头文件
#i nclude <linux/> /* printk()函数,用于向内核输出信息 */
#i nclude <linux/> /* 很重要 其中包含了如 file_opration 等结构
此结构用于文件层接口 */
#i nclude <linux/> /* 错误代码*/
#i nclude <asm/>
#i nclude <linux/>
#i nclude <linux/>
#i nclude <asm/arch/>
/********************************/
/* 应用程序配置 */
/********************************/
//以下根据需要改动
//定义主设备号 设备名称
#define LED_MAJOR_NR 231 //231~239 240~255 都可以
#define DEVICE_NAME "led" /* name for messaging */
#define SET_LED_OFF 0
#define SET_LED_ON 1
#endif
/************************ End Of File
*********************************************************/
=============END===============
最简单的驱动---让 LED 闪一闪-2
==============================
============================
==============================
/*************Copyright (c)**************************
** FREE
**
**--------------File Info-----------------------------------------
** File Name:
** Last modified Date: 2006-9-9
** Last Version:
** Descriptions: User Configurable File
**
**----------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date: 2006-9-9
** Version:
** Descriptions: First version
**
**--------------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:
** Descriptions:在此忠心感谢 ZLG 的模版 我的高质量编程意识起源于此
**
***********************************************************/
#i nclude ""//包含驱动头文件
/************************************************************
function announce
******************************************************/
//以下是关键函数的声明
static int led_open(struct inode *inode, struct file *filp);
//打开设备时用的 linux 把设备当作文件管理 设备最好在用的时候再打开 尽量
不要提前
static int led_release(struct inode *inode, struct file *filp);
static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
unsigned long param);
//控制函数 这里用于控制 LED 亮与灭
int led_init(void);//注册时用的 注意 模块注册的越早越好
void led_cleanup(void);//卸载时用的
/*************************************************************
** "全局和静态变量在这里定义"
** global variables and static variables define here
/****************************************************************/
static struct file_operations LED_fops = /* 前面基础部分提到的重要结构
体了*/
{
owner: THIS_MODULE,
#if 0/*注意:#if 0-#endif 里的代码是不编译的,但这里为了驱动模板讲解上的完
整性仍然加上了*/
llseek: gpio_llseek,
read: gpio_read,
write: gpio_write,
#endif
ioctl: led_ioctl,//控制函数
open: led_open, //打开函数,打开文件时做初始化的
release: led_release,//释放函数,关闭时调用
};
/**************************************************************
** Function name: led_open
** Descriptions: open device
** Input:inode: information of device
** filp: pointer of file
** Output 0: OK
** other: not OK
** Created by: Chenmingji
** Created Date: 2006-9-9
**-------------------------------------------------------------
** Modified by:mamajinco
** Modified Date: 2006-9-9
**--------------------------------------------------------------
**************************************************************/
static int led_open(struct inode *inode, struct file *filp)
{
/*初始化放在 OPEN 里*/
(*(volatile unsigned *)S3C44B0X_PCONC) &= 0xffffffc0;
(*(volatile unsigned *)S3C44B0X_PCONC) |= 0xffffffd5; /*GPIO C 口 0~2 设置为
输出*/
(*(volatile unsigned *)S3C44B0X_PUPC) &= 0xffffffc0;/*GPIO C 口 0~2 设置为
上拉*/
MOD_INC_USE_COUNT;
return 0;
}
最简单的驱动---让 LED 闪一闪-3
*********************************************************
** Function name: led_release
** Descriptions: release device
** Input:inode: information of device
** filp: pointer of file
** Output 0: OK
** other: not OK
** Created by: Chenmingji
** Created Date: 2006-9-9
**-----------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**--------------------------------------------------------
****************************************************/
static int led_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
return(0);
}
/****************************************************
** Function name: led_ioctl
** Descriptions: IO control function
** Input:inode: information of device
** filp: pointer of file
** cmd: command
** arg: additive parameter
** Output 0: OK
** other: not OK
** Created by: Chenmingji
** Created Date: 2006-9-9
**-------------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**----------------------------------------------------------
***********************************************************/
static int led_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
if( arg > 2 )//判断 IO 是否属于 0-2
return -1;
switch(cmd)
{
case 0://把 ARG 传来的 IO 口编号转换成寄存器数据,把相应 IO 口置低
(*(volatile unsigned *)S3C44B0X_PDATC) |= 0x1 << arg;
break;
case 1://把 ARG 传来的 IO 口编号转换成寄存器数据,把相应 IO 口置高
(*(volatile unsigned *)S3C44B0X_PDATC) &= 0x0 << arg;
break;
default:
return -1;
break;
}
return 0;
}
/**************************************************
** Function name: led_init
** Descriptions: init driver
** Input:none
** Output 0: OK
** other: not OK
** Created by: Chenmingji
** Created Date: 2006-9-9
**------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**-----------------------------------------------------
*************************************************/
int led_init(void)
{
int result;
result = register_chrdev(231,"led", &LED_fops);
/*关键语句 用于注册
** 注意!这是传统的注册方法 在 以上的 linux 版本中 加入了 devfs 设备文
件系统 使注册更容易 但为了与大部分资料相**同 大家看的方便 这里仍然使
用老方法*/
if (result < 0) //用于异常检测
{
printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n",
LED_MAJOR_NR ); //printk 用于向内核输出信息
return(result);
}
printk(KERN_INFO DEVICE_NAME ": init OK\n");
return(0);
}
最简单的驱动---让 LED 闪一闪-4
/*************************************************************
** Function name: led_cleanup
** Descriptions: exit driver
** Input:none
** Output none
** Created by: Chenmingji
** Created Date: 2006-9-9
**--------------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**-----------------------------------------------------
**************************************************/
void led_cleanup(void)
{
unregister_chrdev(231, "led"); //与 register_chrdev 配对使用 用于清楚驱动
}
/***********************************************************
** End Of File
****************************************************/
===============END=============
=====================================
============================
===================================
/*********************Copyright (c)**************************
** FREE
**
**--------------File Info----------------------------
** File Name:
** Last modified Date: 2006-9-9
** Last Version:
** Descriptions: User Configurable File
**
**-------------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date: 2006-9-9
** Version:
** Descriptions: First version
**
**--------------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:
** Descriptions:在此忠心感谢 ZLG 的模版 我的高质量编程意识起源于此
**
********************************************************/
#i nclude <>
#i nclude <>
#i nclude <>
#i nclude <>
#i nclude <sys/>
#i nclude <sys/>
void delay(int delay)//延时用函数
{
int i;
for(;delay>0;delay--)
{
for(i=0 ; i < 5000 ; i ++);
}
}
int main()
{
int fd1;
int j;
fd1= open("/dev/led" , O_RDWR);/*打开设备,就象打开文件一样简单*/
if(fd1 == -1)/*异常处理*/
{
printf ( "file can not be open" );
return -1;
}
for (j =0 ; j< 10 ; j ++)/*重复 10 次*/
{
ioctl(fd1 , 1 , 0);/*GPC0 上 LED 亮*/
delay(1000);
ioctl(fd1 , 0 , 0);/*GPC0 上 LED 灭*/
ioctl(fd1 , 1 , 1);/*GPC1 上 LED 亮*/
delay(1000);
ioctl(fd1 , 0 , 1);/*GPC1 上 LED 灭*/
ioctl(fd1 , 1 , 2);/*GPC2 上 LED 亮*/
delay(1000);
ioctl(fd1 , 0 , 2);/*GPC2 上 LED 灭*/
delay(1000);
}
close (fd1);/*关闭设备(文件)*/
return 0;
}
===============END===============
最简单的驱动---让 LED 闪一闪-5
三 驱动编译进内核
编译的中对于菜鸟来说需要需要注意几点
1 被打错字,包括上面的函数中也是!
就算各位扔砖头我也得说,因为编译进内核是很费时间的~~而且最重要的是对于
菜鸟来说 make 的错误提示都是一道关,绝对不要自己给自己设置障碍!我们团
队里就常有兄弟姐妹出现这样的错误,怎么看怎么对,尤其是从书上抄下来的命
令和字符,l 和 1 还有 I 你怎么分?最后一个是大写的 i :)
2 不要用中文文件名 包括 ABC(复件)
要不然 MAKE 出错
3 在各个现成的文件里修改的时候按照原有的格式修改 要不然菜鸟很难保证不
犯低级错误
让我想起来了 IBM 的规律总结测试题:6 13 7 14 8 下一个数字是什么?
好了 开始修改!
===============START==============
uClinux-dist/
----------------------------------------------
obj-$(CONFIG_C5471_WDT) += 之后加
obj-$(CONFIG_TEST) +=
================END============
=================START===========
uClinux-dist/
-----------------------------------------
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X 之
后加
bool 'Test LED Driver' CONFIG_TEST
================END=================
=================START=============
uClinux-dist/
-----------------------------------------
开头的地方扎堆加
#ifdef CONFIG_LEDTEST
extern void led_init(void);
#endif
int __init chr_dev_init(void)之后加
#ifdef CONFIG_TEST
led_init();
#endif
================END==============
=================START============
uClinux-dist/vendors/Samsung/44B0/Makefile
-----------------------------------------
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15\之后加
\
led,c,231,0 \
================END==============
四 把程序编译进内核
没什么说的了,和过去写的简单的程序一样加 但这里再重复一次
================START============
uClinux-dist/user/Makefile
-----------------------------------------
扎堆加个下面
dir_$(CONFIG_USER_LEDTEST) += LEDtest
=================END===============
================START============
uClinux-dist/config/
-----------------------------------------
扎堆加个下面
CONFIG_USER_LEDTEST
Test the LED driver
=================END=============
================START================
uClinux-dist/config/
-----------------------------------------
##############################
mainmenu_option next_comment
comment 'LED driver test PG'
bool 'LEDtest' CONFIG_USER_LEDTEST
endmenu
###############################
=================END=============
五 编译 烧写……省略 200 字 想看的看我写的 helloworld 编译笔记吧
六 下面的操作在板子上执行
1 cd /dev
2 ls
看见里面有个 LED 了吧?
3 cd /proc
4 cat devices
看见驱动列表吧?
led 231 也应该在里面
5 LEDtest
在任何地方执行这个语句 就可以
之后看 GPIO 的 C 口电平吧:)