StarterWarelinux下裸机实验
1.下载StarterWare SDK
这里下载需要ti帐号,下载AM335X_StarterWare_02_00_01_01_Setup.bin
2.安装StarterWare SDK
./AM335X_StarterWare_02_00_01_01_Setup.bin选择默认安装即可,安装完成后,在home目录下
3.编译器gcc version 6.2.1
20161016 (Linaro GCC 6.2-2016.11)
使用ti-processor-sdk-linux-am335x-evm-04.00.00.04自带的gcc
arm-linux-gnueabihf-gcc
4.编译配置
/home/fang/AM335X_StarterWare_02_00_01_01/build/armv7a/gcc/makedef
修改3个地方
LIB_GCC=/home/fang/ti-processor-sdk-linux-am335x-evm-04.00.00.04/linux-devkit/sysroots/x86_64-arago-linux/usr/lib/gcc/arm-linux-gnueabihf/6.2.1
LIB_C=/home/fang/ext-disk/workdir/src/glibc-2.26/install/lib
PREFIX=arm-linux-gnueabihf-
4.编译libc
由于ti的gcc缺少libc,这里我自行编译了libc-2.26
cd glibc-2.26
make build install
cd build
CC=arm-linux-gnueabihf-gcc ../configure
--prefix=/home/fang/ext-disk/workdir/src/glibc-2.26/install --host=arm-linux --cache-file=arm-linux.cache
make install
5.编译uart编译链接地址
cd ~/AM335X_StarterWare_02_00_01_01/build/armv7a/gcc/am335x/evmAM335x/uart
ls
makefileuartEcho.lds
这里修改一下链接地址
修改makefile
IMG_LOAD_ADDR = 0x402f0400
修改uartEcho.ld
DDR0 :o = 0x402f0400,l = 0xFBFF/* 512MB external DDR Bank 0 */
5.编译uart
make
生成的二进制在
~/AM335X_StarterWare_02_00_01_01/binary/armv7a/gcc/am335x/evmAM335x/uart/Release下
uartEcho_ti.bin就是可以在Sdram中执行的二进制了
6.串口下载uartEcho_ti.bin
等待上电启动,打印CCC时,将uartEcho_ti.bin下载
这时发现并没有像例程说明那样,在终端输入,并没有回显字符
7.加入led调试
将led.S文件复制到~/AM335X_StarterWare_02_00_01_01/system_config/armv7a/gcc
修改 ~/AM335X_StarterWare_02_00_01_01/build/armv7a/gcc/am335x/system_config/makefile
SOURCE变量(大约在第56行)
增加led.S编译,如下
SOURCE= ${SYSCONFIG_SRC}/mmu.c\
${SYSCONFIG_SRC}/cache.c\
${SYSCONFIG_SRC}/${COMPILER}/led.S\
${SYSCONFIG_SRC}/${COMPILER}/cpu.c\
8.修改~/AM335X_StarterWare_02_00_01_01/system_config/armv7a/gcc
/init.S,在第一条指令前插入点灯指令,如下
Entry:
@
@ Set up the Stack for Undefined mode
@
BLled_init
BL led_on
LDRr0, =_stack@ Read the stack address
MSRcpsr_c,
#MODE_UND|I_F_BIT@ switch to
undefmode
MOVsp,r0@ write the stack pointer
SUBr0, r0, #UND_STACK_SIZE@ give stack space
9.再次下载运行,发现灯可以点亮了,可以慢慢调试了============
附led.S源码(GPIO3Pin16)
.global led_init
.global led_on
.global led_off
led_init:
@@@@@@FOR
CM_PER_GPIO3_CLKCTRL_MODULEMODE_ENABLE
LDR
R1,=0x44E000B4
LDR
R3,[R1] @read CM_PER_GPIO3_CLKCTRL
ORR
R0,R3,#0x2 @R0=R3 | 0x2
STR
R0,[R1] @write to CM_PER_GPIO3_CLKCTRL
wait1:
LDR
R0,[R1] @read CM_PER_GPIO3_CLKCTRL
TST
R0,#0x2
@BNE
wait1
@@@@@@FOR
CM_PER_GPIO3_CLKCTRL_OPTFCLKEN_GPIO_1_GDBCLK
LDR
R1,=0x44E000B4;
LDR
R3,[R1] @read CM_PER_GPIO3_CLKCTRL
ORR
R0,R3,#0x00040000 @R0=R3 |
0x00040000
STR
R0,[R1] @write to CM_PER_GPIO3_CLKCTRL
wait2:
LDR
R0,[R1] @read CM_PER_GPIO3_CLKCTRL
TST
R0,#0x00040000
@BNE
wait2
@@@@@@Waiting for IDLEST field in
CM_PER_GPIO3_CLKCTRL register to attain the desired value.
LDR
R1,=0x44E000B4;
wait3:
LDR
R0,[R1] @read CM_PER_GPIO3_CLKCTRL
TST
R0,#0x00030000
@BNE
wait3
@@@@@ Waiting for CLKACTIVITY_GPIO_1_GDBCLK
bit in CM_PER_L4LS_CLKSTCTRL register to attain desired value.
LDR
R1,=0x44E00000;
wait4:
LDR
R0,[R1] @read CM_PER_L4LS_CLKSTCTRL
TST
R0,#0x00080000
@BNE
wait4
@@@GPIO3Pin16PinMuxSetup
ldr
r0, =0x481AE134 @GPIO_OE
ldr
r1, =0xfffEffff@0x00010000 set to
output mode
str
r1, [r0]
mov
pc, lr
led_on:
ldr
r0, =0x481AE194 @GPIO_SETDATAOUT
ldr
r1, =0x00010000
str
r1, [r0]
mov
pc, lr
led_off:
ldr
r0, =0x481AE190 @GPIO_CLEARDATAOUT
ldr
r1, =0x00010000
str
r1, [r0]
mov
pc, lr