Arm2440——Nand flash启动模式详解(LED程序为例)
时间:11-28
来源:互联网
点击:
一般人来讲,理解起来确实比较困难,而且受本人水平限制,很多地方只能说是只可意会不可言传,如果误导了大家请大家谅解。当然如果看到这里还不能理解arm的启动过程可以留言讨论这个问题。下面是相关的其他代码,我附在这里,2440addr.h没有贴出,由于我也是使用arm自带示例程序中的代码,而且代码有四千多行,多数地址是没有用到的。其他的代码如下
代码Init.s- #include"2440addr.h"
- voiddisable_watch_dog(void);
- voidclock_init(void);
- voidmemsetup(void);
- voidcopy_steppingstone_to_sdram(void);
- voidinituart(void);
- voiddisable_watch_dog(void)
- {
- rWTCON=0;
- }
- voidclock_init(void)
- {
- rCLKdivN=0x03;
- /*
- *如果HdivN非0,CPU的总线模式应该从
- *“fastbusmode”变为“asynchronous
- *busmode”
- */
- __asm__(
- "mrcp15,0,r1,c1,c0,0"
- "orrr1,r1,#0xc0000000"
- "mcrp15,0,r1,c1,c0,0"
- );
- rMPLLCON=(92<12)|(1<4)|(2);
- //rMPLLCON=((0x5c<12)|(0x01<4)|(0x02));
- }
- voidmemsetup(void)
- {
- volatileunsignedlong*p=(volatileunsignedlong*)0x48000000;
- /*这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
- *写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
- *SDRAM之前就可以在steppingstone中运行
- */
- /*存储控制器13个寄存器的值*/
- p[0]=0x22011110;//BWSCON
- p[1]=0x00000700;//BANKCON0
- p[2]=0x00000700;//BANKCON1
- p[3]=0x00000700;//BANKCON2
- p[4]=0x00000700;//BANKCON3
- p[5]=0x00000700;//BANKCON4
- p[6]=0x00000700;//BANKCON5
- p[7]=0x00018005;//BANKCON6
- p[8]=0x00018005;//BANKCON7
- /*REFRESH,
- *HCLK=12MHz:0x008C07A3,
- *HCLK=100MHz:0x008C04F4
- */
- p[9]=0x008C04F4;
- p[10]=0x000000B1;//BANKSIZE
- p[11]=0x00000030;//MRSRB6
- p[12]=0x00000030;//MRSRB7
- }
- voidcopy_steppingstone_to_sdram(void)
- {
- unsignedint*pdwSrc=(unsignedint*)0;
- unsignedint*pdwDest=(unsignedint*)0x30000000;
- while(pdwSrc<(unsignedint*)4096)
- {
- *pdwDest=*pdwSrc;
- pdwDest++;
- pdwSrc++;
- }
- }
代码Main.c:
- #include"2440addr.h"
- voidDelay(inti)
- {
- intm,n,p;
- for(m=0;m!=i;++m)
- {
- for(n=0;n!=255;++n)
- {
- for(p=0;p!=255;++p)
- ;
- }
- }
- }
- voidMain()
- {
- intcount;
- intleds[4]={0x1c0,0x1a0,0x160,0xe0};
- rGPBCON=0x00155555;
- rGPBUP=rGPBUP&0xFF00;
- while(1)
- {
- for(count=0;count!=4;++count)
- {
- rGPBDAT=leds[count];
- if(count%2)
- rGPBDAT+=1;
- Delay(2);
- }
- }
- }
链接文件led.lds如下:
- SECTIONS
- {
- .=0x30000000;
- .text:{*(.text)}
- .rodataALIGN(4):{*(.rodata)}
- .dataALIGN(4):{*(.data)}
- .bssALIGN(4):{*(.bss)*(COMMON)}
- }
makefile如下:
- objects:=Head.oInit.oMain.o
- led.bin:$(objects)
- arm-linux-ld-Tled.lds-nostdlib-oled_elf$^
- arm-linux-objcopy-Obinary-Sled_elf$@
- arm-linux-objdump-D-marmled_elf>led.dis
- %.o:%.c
- arm-linux-gcc-Wall-O2-c-o$@$
- %.o:%.s
- arm-linux-gcc-Wall-O2-c-o$@$<;
- .PYTHON:clean
- clean:
- rm-fled.binled_elfled.dis*.o
如上除了2440addr.h之外就都全了,另外需要指出的是2440addr.h中引用了Option.h,为了简化代码,可以将这句可以注释掉,在我们这段代码中完全用不到该文件相关功能。否则需要自行修改makefile文件完成Option.h相关的编译和链接工作。
好了,又浪费了大家这么长的时间,这里就不多说了,有什么问题求高手指出来。
Arm2440Nandflash启动模 相关文章:
- Arm 2440——Nand flash启动模式详解(LED程序为例)(11-28)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)