rtems-4.11移植到MINI2440 (二) 之移植

-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以外的无用文件,加快编译;

完事应该可以编译成功,脚本如下(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. compile
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 


10. 无图无真相


By liitokala
enjoy it

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值