最近调驱动时,调试led时遇到了点问题,因而回过头来再写个led裸板程序。在我写的pcDuino第一个裸板程序uart的基础上,再写个led裸板程序仍是很轻松的。不少人以为没有必要写什么pcDuino裸板程序,以为没啥意义。我以为能够用来熟悉硬件,特别是想作底层驱动开发,以及系统移植,熟悉底层硬件仍是有用的。其实作底层驱动开发,也是跟硬件打交道,硬件相关的操做和裸板程序是同样的。下面介绍怎样在pcDuino上跑一个最简单的led裸板程序。php 开发环境: 系统:ubuntu 10.04.4 单板:pcDuino 编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2linux 目标:实现pcDuino上的TX_LED闪烁ubuntu 1、硬件介绍ide 仔细看pcDuino上的原理图和pcDuino的手册,发现两者不是彻底对应的,仍是以原理图为准。根据原理图知道TX_LED是接到PH15上,能够当作普通IO口用,不须要连跳线工具 2、编写源代码oop 主要是看手册30.Port Controller,根据手册写led初始化程序主要包括设为输出、是能上拉及Multi-Driving寄存器设置。包括start.S、main.c、clock.c、clock.h、Makefile,下面贴出所有代码测试 文件start.S:ui
- <p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">[plain] view plaincopyprint?.global _start</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">_start:
- ldr sp, =0x00007f00</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">b main</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">.global _start</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">_start:
- ldr sp, =0x00007f00</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">b main</p>
复制代码
文件main.c:google
文件·clock.h:spa
- [plain] view plaincopyprint?void clock_init(void);
复制代码
void clock_init(void);文件·Makefile:
- <p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">[plain] view plaincopyprint?led.bin:start.S main.c clock.c
- arm-none-linux-gnueabi-gcc -nostdlib -c start.S -o start.o
- arm-none-linux-gnueabi-gcc -nostdlib -c main.c -o main.o
- arm-none-linux-gnueabi-gcc -nostdlib -c clock.c -o clock.o
- arm-none-linux-gnueabi-ld -Ttext 0xD0020010 start.o main.o clock.o -o led_elf
- arm-none-linux-gnueabi-objcopy -O binary -S led_elf led.bin</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">clean:
- rm -rf *.o *.bin led_elf *.dis</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">led.bin:start.S main.c clock.c
- arm-none-linux-gnueabi-gcc -nostdlib -c start.S -o start.o
- arm-none-linux-gnueabi-gcc -nostdlib -c main.c -o main.o
- arm-none-linux-gnueabi-gcc -nostdlib -c clock.c -o clock.o
- arm-none-linux-gnueabi-ld -Ttext 0xD0020010 start.o main.o clock.o -o led_elf
- arm-none-linux-gnueabi-objcopy -O binary -S led_elf led.bin</p><p style="margin-bottom: 1.714285714rem; border: 0px; vertical-align: baseline; ">clean:
- rm -rf *.o *.bin led_elf *.dis</p>
复制代码
代码确实很简单,上面也有看手册时留下的注释,就不分析了,有问题留言吧。 3、编译、测试 1.安装交叉编译链,给个连接 http://code.google.com/p/smp-on-qemu/downloads/list 选择arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2并下载。而后在ubuntu下直接解压便可,过程就不说了,还不清楚的看Ubuntu 10.04.4开发环境配置。 2.编译
- change@change :~$ cd Si/A10/2_led/
- change@change :~/Si/A10/2_led$ ls
- clock.c clock.h main.c Makefile mksunxiboot start.S
- change@change :~/Si/A10/2_led$ make
- arm-none-linux-gnueabi-gcc -nostdlib -c start.S -o start.o
- arm-none-linux-gnueabi-gcc -nostdlib -c main.c -o main.o
- arm-none-linux-gnueabi-gcc -nostdlib -c clock.c -o clock.o
- arm-none-linux-gnueabi-ld -Ttext 0xD0020010 start.o main.o clock.o -o led_elf
- arm-none-linux-gnueabi-objcopy -O binary -S led_elf led.bin
- change@change :~/Si/A10/2_led$ ./mksunxiboot led.bin leds.bin
- File size: 0×154
- Load size: 0×154
- Read 0×154 bytes
- Write 0×200 bytes
- change@change :~/Si/A10/2_led$
复制代码
其中有个./mksunxiboot led.bin leds.bin要注意,不通过mksunxiboot工具 的.bin文件,pcDuino是运行不了的。这个工具在官网上都有下。如今的处理启动都很复杂,内有固化有bl0代码,在跳转到bl1时须要校验程序的合法性,这个工具mksunxiboot简单点少就是给咱们程序加了点头部,让处理器可以识别咱们写的代码。你能够分析led.bin和leds.bin的反汇编代码,就一目了然了。这部分感兴趣的能够一块儿讨论。
3.测试 上面生成的leds.bin就能够放到板子上运行了。为了避免破会NAND中的系统,直接放到tf卡运行。不用担忧那个先启动,看全志手册就知道pcDuino默认先从tf卡启动,只有tf卡没有启动的引导程序才会跳到NAND启动。插上tf卡到PC机
- change@change:~/Si/A10/2_led$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1
- 1+0 records in
- 1+0 records out
- 1048576 bytes (1.0 MB) copied, 0.425886 s, 2.5 MB/s
- change@change:~/Si/A10/2_led$ sudo dd if=leds.bin of=/dev/sdb bs=1024 seek=8
- 0+1 records in
- 0+1 records out
- 512 bytes (512 B) copied, 0.00600667 s, 85.2 kB/s
- change@change:~/Si/A10/2_led$
复制代码
而后取下tf卡,插到pcDuino上,RX LED就开始闪烁了。若是你手上有led,接到GPIO四、GPIO5也会闪烁。
|