最近折腾tiny4412开发板,先用裸板点个灯,玩一下裸板程序,后面打算移植最新的uboot和内核到tiny4412开发板上去。
原理图中,4个led用到的是GPM4_0 - GPM4_4.
看芯片手册:GPM4CON地址为0x110002E0
GPM4DAT寄存器地址为:0x110002E4
led.s
.text
.globl _start
_start:
/*
* set GPM4 as output
*/
ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0
ldr r1, [r0] // 先读出原值
bic r1, r1, #0xff00 // 清除bit[15:8] //bic为bit clear 位清除指令
bic r1, r1, #0xff // 清除bit[7:0]
orr r1, r1, #0x1100 // 设置bit[15:8]为0b00010001 //orr为 按位或指令
orr r1, r1, #0x11 // 设置bit[7:0]为0b00010001
str r1, [r0] // 写入GPM4CON 将r1寄存器中的值传送到 地址值为r0的寄存器中
/*
* set GPM4DAT as Low For leds
*/
ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E0
ldr r1, [r0] // 读出原值
leds_loop:
bic r1, r1, #0xf // 清除bit[0-3]为0 全亮
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
orr r1, r1, #0xe // 设置bit[0]为0 LED1亮
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
bic r1, r1, #0x3 // 设置bit[1]为0 LED2亮
orr r1, r1, #1
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
bic r1, r1, #0x6 // 设置bit[2]为0 LED3亮
orr r1, r1, #2
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
bic r1, r1, #0xc // 设置bit[3]为0 LED4亮
orr r1, r1, #4
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
orr r1, r1, #0xf
str r1, [r0] // 写入GPM4DAT 全灭
ldr r2,=0xffffff
bl delay
b leds_loop
halt_loop:
b halt_loop
delay:
//跑马灯延时程序
sub r2,r2,#1 //sub 减法
cmp r2,#0x0 //将r0 与0比较
bne delay //b是跳 ne 是不相等 ,不相等就跳到delay
mov pc,lr //lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回
Makefile
led.bin : led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -Tled.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
第一步 执行arm-linux-gcc -c -o led.o led.S命令将当前目录下存在的汇编文件led.S编译成led.o文件;
第二步 执行arm-linux-ld -Tled.lds -N led.o -o led.elf将.o文件链接成elf文件,-Tled.lds 其中led.lds位链接脚本,告诉连接器如何对程序进行链接,以及链接地址等等(下面会有讲解);
第三步 执行arm-linux-objcopy -O binary -S led.elf led.bin将elf文件抽取为可在开发板上运行的bin文件;
第四步 执行arm-linux-objdump -D -m arm led.elf > led.dis将elf文件反汇编,便于我们对程序的分析,查找错误等等;
led.lds
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
第2行表示程序的连接地址从0x02023400开始,这表示我们的程序运行之前应该位于内存地址0x02023400字节处,
BL1会把 BL2复制到0x02023400地址处,再启动它。
第 3~6行,表示从 0x02023400 开始,依次排放程序的代码段、 只读数据段、数据段、BSS段。
编译:在服务器上make之后会得到led.bin 文件
烧写:需要制作卡启动,较为麻烦。下面是友善之臂提供的烧写uboot SD卡驱动方法:
参照此方法,将u-boot替换给我们的led.bin 应该是可以的,再烧写过程中遇到了几个坑,找了一些资料才解决,下一篇博文中会写出来给大家参考。
-----------------------------------------------------
1. Build uboot
a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好
环境变量PATH,保证可以正常使用。
b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录
tar xzf uboot_tiny4412-20130729.tgz
c) 配置 uboot 并编译
cd uboot_tiny4412
make tiny4412_config
make
d) 编译 用于生成bl2 的工具
make -C sd_fuse
或者
cd sd_fuse; make
-----------------------------------------------------
2. 制作启动 Tiny4412 的SD卡
a) 先准备一张4G或以上的SDHC卡
注意:该卡的已有数据将会被破坏,因此请先对SD卡上的数据进行备份。
b) fusing SD card
假设SD卡已被PC Linux识别为/dev/sdb, 以root用户运行以下命令即可:
cd sd_fuse/tiny4412
./sd_fusing.sh /dev/sdb
-----------------------------------------------------
3. 使用SD卡启动 Tiny4412 并烧写Android
a) 将已经制作好的SD卡插到 Tiny4412 板上,拨动S2切换到SDBOOT,同时连接
串口线到PC且假设已经准备好。
b) 开发板加电,然后在串口控制台(如minicom),按任意键进入uboot 命令行模式
c) 对SD卡进行分区
输入以下uboot命令即可对SD卡进行分区:
fdisk -c 0 320 806 518
重新分区后,可重新格式化FAT分区
fatformat mmc 0:1
d) 进入fastboot模式以烧写Android
使用USB线连接Tiny4412的MICRO_USB口到PC,然后输入以下uboot命令:
fastboot
e) 烧写 Android 到SD卡
首先请准备好Android image,包括: zImage, ramdisk-u.img, system.img
在PC端输入以下命令进行烧写:
fastboot flash kernel zImage (烧写kernel)
fastboot -w (格式化userdata和cache)
fastboot flash ramdisk ramdisk-u.img (烧写ramdisk)
fastboot flash system system.img (烧写system)
f) 也可以在PC端通过fastboot烧写uboot到SD卡
先手动生成bl2.bin
cd sd_fuse/tiny4412
../mkbl2 ../../u-boot.bin bl2.bin 14336
然后输入以下命令:
fastboot flash fwbl1 E4412_N.bl1.bin
fastboot flash bl2 bl2.bin
fastboot flash bootloader ../../u-boot.bin
fastboot flash tzsw E4412_tzsw.bin
-----------------------------------------------------
4. 使用SD卡启动 Android
a) 如果是使用HD700,则烧写完成后直接重启Tiny4412 即可自动启动 Android
b) 如果是使用S700,则需要在uboot上设置kernel命令行参数:
setenv bootargs console=ttySAC0,115200n8 androidboot.console=ttySAC0 lcd=S700
saveenv
然后重启Tiny4412即可。
参考:http://www.techbulo.com/1313.html