历史上的今天
今天是:2024年09月05日(星期四)
2019年09月05日 | RTEMS在S3C2440上的移植-(4)
2019-09-05 来源:eefocus
有了前一篇文章的铺垫,基本上移植的工作就成功了一大半了,接下来要做的就是针对2410和2440的不同及不同开发板模块、接口的差异对2410的BSP进行修改工作。由于2410的寄存器基本吻合,所以头文件不改也没问题,这里我主要还是参考了Etual大牛的博客做了一下工作:
1.修改了时钟(PLL设置)。
libcpuarms3c24xxclocksupport.c
修改get_FCLK
由于2440 的PLL计算公式不同,在原来的基础上乘以2 就行了。修改为
return((BSP_OSC_FREQ * m * 2) / (p << s));
2.对启动代码进行修改。libbsparmsbc2440startstart.S
删除 GamePark magic sequence
修改启动代码,我是用GDB的话,则会根据ELF文件自动下载的,RTEMS 的运行地址是 0x30000100 添加初始化
(1)关闭看门狗,关闭所有中断,SVC模式
(2)设置PLL,将 FCLK : HCLK : PCLK 设置为 200 : 100 : 50 MHZ
(3)清除 .bss 段的内容。
(4)接着做RTEMS 原来的初始化
添加到内容如下
/*
* Etual add
*/
#define WTCON 0x53000000
#define INTMSK 0x4A000008
#define INTSUBMSK 0x4A00001C
/*
* watching dog off
*/
ldr r0, =WTCON
mov r1, # 0x0
str r1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, # 0xffffffff
ldr r0, =INTMSK
str r1, [r0]
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
/*
* FCLK:HCLK:PCLK = 1:2:4
* default OSC = 12MHZ
* FCLK : HCLK : PCLK = 200 : 100 : 50 MHZ
*/
mov r1, # 0x4C000000
adr r2, pll_cfg_val
add r3, r1, # 7*4
1:
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
b clear_bss
pll_cfg_val:
.long 0xFFFFFFFF @LOCKTIME 0x4C000000
.long 0x0005C012 @MPLLCON
.long 0x00038021 @UPLLCON
.long 0x001FFFF0 @CLKCON
.long 0x00000004 @CLKSLOW
.long 0x00000003 @CLKDIVN
.long 0x00000000 @CAMDIVN
/*
* clear .bss
*/
clear_bss:
ldr r0, =_axf_bss_start
ldr r1, =_axf_bss_end
mov r2, #0x00000000
b clbss_2
clbss_l:
str r2, [r0]
add r0, r0, #4
clbss_2:
cmp r0, r1
bne clbss_l
3.修改串口相关的代码
static ssize_t uart_write(int minor, const char *buf, size_t len)
函数下修改这里:
while(!(rUTRSTAT0 & 0x4)) //原来这里为0x2
{
...
}
初始化函数不使用FIFO直接使用死循环模式。
static void uart_init(int minor)
{
int i;
unsigned int reg = 0;
rGPHCON |= 0xa0;
rGPHUP = 0x0c;
/* enable UART0 */
rCLKCON|= (1<<10);
/* value is calculated so : (int)(PCLK/16./baudrate) -1 */
reg = get_PCLK() / (16 * 115200) - 1;
/* FIFO enable, Tx/Rx FIFO clear */
rUFCON0 = 0x0;
rUMCON0 = 0x0;
/* Normal,No parity,1 stop,8 bit */
rULCON0 = 0x3;
/*
* tx=level,rx=edge,disable timeout int.,enable rx error int.,
* normal,interrupt or polling
*/
rUCON0 = 0x05;
rUBRDIV0 = reg;
for (i = 0; i < 100; i++);
}
主要修改UART0口的初始化就行了,不用FIFO,主要发送的时候判断。
4.sbc2440/startup/bspstart.c 屏蔽掉设置时钟频率,设置SDRAM控制器到代码,因为时钟已经在 start.S 中做了。而内存控制器在gdb的启动脚本中做,在debug开发不许要设置。
bsp_start_default 函数中
/* setup clocks */
// rCLKDIVN = M_CLKDIVN;
// rMPLLCON = ((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);
/* 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);
5.完成之后 make install 安装
下一篇:ARM9 SWI软件中断
史海拾趣
|
该电路图的目的是分析对输入信号进行分类,然后输出,对输出脉冲进行计数的功能。 此电路图只对信号分类。 可是我还不能很理解。 请求给予帮住。 [ 本帖最后由 阳光如烟 于 2008-8-25 17:34 编辑 ]… 查看全部问答> |
|
呵呵,那位坛友手中有多余一套LM3S8962开发板,或者闲着不用的,砸个过来 坛友们,您们谁有多余的或者不用的,有偿转让一下呵呵,本人近期有时间想认真学习一下,谢谢啦嘿嘿 本人的QQ是282574314,嘿嘿或者想学STM32的互换一下。… 查看全部问答> |
|
有谁使用过了vxworks6.6及其开发workbench的,一起来分享啊。 我先自己说下自己的使用后的感受吧,vxworks6.6的系统启动代码和5.5区别还是很大,而对与新的平台的使用我用的也不是很爽,之中遇到了很多的问题。 哎~ 又要开始一个新的痛苦的学习过 ...… 查看全部问答> |
|
我打算通过扩展定时器的方法测出多路PWM信号的占空比,利用GATE门控位,当GATE低电平的时候读取外部定时器8253计数器的值。可是我怎么也读不出来值,当我使RD位有效时,读的计数器的值也总是不变是个固定值,大家看看我的程序有什么问题??怎么改 ...… 查看全部问答> |
|
用51板做东西的时候,AD转换芯片用的是ICL7135(双积分AD转换芯片)。我看见一些资料上面写着 用计数器对积分阶段进行计数,最后得到的计数减去1001就是AD的转换结果。 我有一点不明白:计数器的结果-1001就直接是AD 转换的数字结果 ...… 查看全部问答> |
|
【TI首届低功耗设计大赛】+@fxyc87+CCS编译环境初识+第一课 点亮LED 【TI首届低功耗设计大赛】+@fxyc87+CCS编译环境初识+第一课 点亮LED在论坛搜索 【TI首届低功耗设计大赛】+@fxyc87+ 上一次发布了开发板的秀,https://bbs.eeworld.com.cn/thread-446740-1-1.html 以及IAR编译环境的使用说明及点亮LED,见贴[url]h ...… 查看全部问答> |




