-1. 在做移植前要做一下几点:
看看rtems的各种guide,不用整的非常明白,知道大概即可,最起码的要知道初始化的整个流程,这样就知道需要修改的大概位置了;
看看雪松、知秋一叶、etual的博客;
0. 平台:
OS: Ubuntu 12.04
rtems: 4.11
1. 添加mini2440 bsp支持,可以去掉其他不相关的;
在libbsp/arm/acinclude.m4中
mini2440 )
AC_CONFIG_SUBDIRS([mini2440]);;
这样就可使用--enable-rtemsbsp=mini2440
2. 复制smdk2410目录为mini2440;
3. 将gp32目录下的console/, smc/, start/目录复制过来;
将include/目录下的文件复制进来;
startup/bspstart.c复制过来;
startup/bspidle.c复制过来;// 其实是缺啥补啥,看编译错误在修正的
4. 修改mini2440目录下的makefile.am;
涉及gp32的都修正过来,比如:
include_HEADERS = ../gp32/include/bsp.h
改成:
i nclude_HEADERS = include/bsp.h
5. make/custom/目录下的文件改成mini2440.cfg;
6. 删除libbsp/和libcpu/目录下除shared,no_cpu以外的无用文件,加快编译;
--enable-posix: 支持posix接口;
--disable-cxx:不需要支持c++;
--disable-itron: 不需要支持itron接口;
--enable-networking: 添加网络支持;
--samples:样例,/opt/rtems-4.11/arm-rtemseabi4.11/mini2440/lib/rtems-4.11/tests/hello.exe等
--mini2440:bsp包
如果不能编译,看看有没有搞错的步骤。
7. 修改源代码;
7.0. 修改第一阶段的硬件初始化,极度汇编依赖
在start.s中,完成的工作:
1 禁用所有可屏蔽中断;
2 用~0~填充未初始化数据段~.bss;
3 初始化~C~程序调用栈;
4 从~ROM~中将初始化数据拷贝到~RAM~中;
5 调用~boot_card~函数。
7.0.6. 具体的请看附件
7.1. clock相关
7.1.1. 在bsp.h中,请参见s3c2440数据手册:
libcpu/arm/s3c24xx/clock/support.c中,
在bspstart.c中
使用的是s3c2410.h头文件,寄存器基本一致;
7.3. 串口;
7.3.1. 串口UART0
在c/src/lib/libbsp/arm/mini2440/console/uart.c:
添加
GPH初始化,串口占用gph:
8. 修改linkcmds
9.1.
./bspbuild.sh
9.2.
sudo su // get the root
export PATH=/your/path/to/rtems-4.11/bin:$PATH
cd build/mini2440
make install
su wang2 // go back to wang2
enjoy it
看看rtems的各种guide,不用整的非常明白,知道大概即可,最起码的要知道初始化的整个流程,这样就知道需要修改的大概位置了;
看看雪松、知秋一叶、etual的博客;
0. 平台:
OS: Ubuntu 12.04
rtems: 4.11
1. 添加mini2440 bsp支持,可以去掉其他不相关的;
在libbsp/arm/acinclude.m4中
mini2440 )
AC_CONFIG_SUBDIRS([mini2440]);;
这样就可使用--enable-rtemsbsp=mini2440
2. 复制smdk2410目录为mini2440;
3. 将gp32目录下的console/, smc/, start/目录复制过来;
将include/目录下的文件复制进来;
startup/bspstart.c复制过来;
startup/bspidle.c复制过来;// 其实是缺啥补啥,看编译错误在修正的
4. 修改mini2440目录下的makefile.am;
涉及gp32的都修正过来,比如:
include_HEADERS = ../gp32/include/bsp.h
改成:
i nclude_HEADERS = include/bsp.h
5. make/custom/目录下的文件改成mini2440.cfg;
6. 删除libbsp/和libcpu/目录下除shared,no_cpu以外的无用文件,加快编译;
完事应该可以编译成功,脚本如下(bspbuild.sh):
1 #!/bin/bash
2
3 export RTEMS_ROOT=/home/wang2/codePrj/ldd/sources/rtems-4.11
4 export LIBBSB=/home/wang2/codePrj/ldd/sources/rtems-4.11/c/src/lib/libbsp
5
6 echo ${PWD}
7
8 # pre-config
9 cd ${RTEMS_ROOT}
10 ./bootstrap -c
11 ./bootstrap -p
12 ./bootstrap
13
14 # Configure
15 cd ${RTEMS_ROOT}/build/mini2440
16 rm -rf ./*
17
18 ../../configure --target=arm-rtemseabi4.11 --enable-posix \
19 --disable-cxx --disable-itron --enable-networking \
20 --enable-tests=samples \
21 --enable-rtemsbsp=mini2440
--target:是告诉configure编译器是arm-rtemseabi4.11-xxx工具链;--enable-posix: 支持posix接口;
--disable-cxx:不需要支持c++;
--disable-itron: 不需要支持itron接口;
--enable-networking: 添加网络支持;
--samples:样例,/opt/rtems-4.11/arm-rtemseabi4.11/mini2440/lib/rtems-4.11/tests/hello.exe等
--mini2440:bsp包
如果不能编译,看看有没有搞错的步骤。
7. 修改源代码;
7.0. 修改第一阶段的硬件初始化,极度汇编依赖
在start.s中,完成的工作:
1 禁用所有可屏蔽中断;
2 用~0~填充未初始化数据段~.bss;
3 初始化~C~程序调用栈;
4 从~ROM~中将初始化数据拷贝到~RAM~中;
5 调用~boot_card~函数。
7.0.6. 具体的请看附件
7.1. clock相关
7.1.1. 在bsp.h中,请参见s3c2440数据手册:
/* What is the input clock freq in hertz?
* FCLK:HCLK:PCLK = 1:4:8
* FCLK = 405MHz
*/
#define BSP_OSC_FREQ 12000000 /* 12 MHz oscillator */
#define M_MDIV 0x7f /* FCLK=405Mhz, origin: 81, to: 0x7f*/
#define M_PDIV 2
#define M_SDIV 1
#define M_CLKDIVN 5 /* HCLK=FCLK/4, PCLK=FCLK/2 */
// 2 to 5
#define REFEN 0x1 /* enable refresh */
#define TREFMD 0x0 /* CBR(CAS before RAS)/auto refresh */
#define Trp 0x0 /* 2 clk */
#define Trc 0x3 /* 7 clk */
#define Tchr 0x2 /* 3 clk */
7.1.2. 时钟:2440和2410的PLL计算公式不太一样,libcpu/arm/s3c24xx/clock/support.c中,
get_FCLK()函数:
return((BSP_OSC_FREQ * m) / (p << s));
改成
return((BSP_OSC_FREQ * m * 2) / (p << s));
7.1.3. 在support.c中:
/* return HCLK frequency */
uint32_t get_HCLK(void)
{
if (rCLKDIVN & 0x2)
return get_FCLK()/2;
else
return get_FCLK();
}
改成
/* return HCLK frequency */
uint32_t get_HCLK(void)
{
if ((rCLKDIVN & 0x06) == 0x04)
return get_FCLK() / 4;
else if ((rCLKDIVN & 0x06) == 0x00)
return get_FCLK();
else if ((rCLKDIVN & 0x06) == 0x02)
return get_FCLK() / 2;
else
return get_FCLK() / 3;
}
7.2. sdram刷新设置在bspstart.c中
/* setup rREFRESH
* period = 15.6 us, HCLK=66Mhz, (2048+1-15.6*66)
*/
REFCNT = 2048+1-(15.6*get_HCLK()/1000000);
rREFRESH = ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);
/* set prescaler for timers 2,3,4 to 16(15+1) */
cr = rTCFG0 & 0xFFFF00FF;
rTCFG0 = (cr | (15<<8));
/* set prescaler for timers 0,1 to 1(0+1) */
cr = rTCFG0 & 0xFFFFFF00;
rTCFG0 = (cr | (0<<0));
其中,mini2440外接MT48LC16M16A2的刷新周期为64ms/8k,即7.8125us;
REFCNT = 2048 + 1 - (7.8125 * get_HCLK() / 1000000);
使用的是s3c2410.h头文件,寄存器基本一致;
7.3. 串口;
7.3.1. 串口UART0
在c/src/lib/libbsp/arm/mini2440/console/uart.c:
添加
GPH初始化,串口占用gph:
rGPHCON |= 0xa0;
rGPHUP = 0x0c;
使用不带FIFO模式:
/* FIFO disable, Tx/Rx FIFO clear */
rUFCON0 = 0x0;
rUMCON0 = 0x0;
rUCON0 = 0x245;
改成
rUCON0 = 0x05;/* normal;
rx: int or poll; no int when error occured and timeout;
rx: edge;
tx: int or poll; edge;
clock: PCLK
*/
static ssize_t uart_write(int minor, const char *buf, size_t len)中,
/* Wait for fifo to have room */
while(!(rUTRSTAT0 & 0x2)) {
continue;
}
改成
while(!(rUTRSTAT0 & 0x4)) {
continue;
}
8. 修改linkcmds
MEMORY {
SDRAM_MMU : ORIGIN = 0x30000000, LENGTH = 16k // TLB
SDRAM : ORIGIN = 0x30004000, LENGTH = 64M_16k
}
改成
MEMORY {
SDRAM : ORIGIN = 0x30000000, LENGTH = 64M - 16k
SDRAM_MMU : ORIGIN = 0x33ffc000, LENGTH = 16k
}
9. compile9.1.
./bspbuild.sh
9.2.
sudo su // get the root
export PATH=/your/path/to/rtems-4.11/bin:$PATH
cd build/mini2440
make install
su wang2 // go back to wang2
10. 无图无真相
enjoy it