1、Uboot 基于TQ2440 开发板上的移植u-boot-2011.03在TQ2440上的移植(1)-建立自己的demo板收藏参考文章黄刚博客tekkman博客1、到ftp:/ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz22、解压tar jxvf u-boot-2010.06.tar.bz23、进入ubootcd u-boot-2010.064、删减uboot进入/board,留下samsung,其它全部删除进入/arch,留下arm,其它全部删除进入/arch/arm/cpu,留下arm920t,其它全部删除5、建立自己的DEMO板cd /bo
2、ard/samsungmkdir smdk2440cp -rf smdk2410/* smdk2440/将2410下所有的代码复制到2440下cd smdk2440/进入smdk2440目录mv smdk2410.c smdk2440.c/将smdk2440下的smdk2410.c改名为smdk2440.c然后在文件夹samsung里留下smdk2440,其它全部删除cp include/configs/smdk2410.h include/configs/smdk2440.h/建立2440头文件在include/configs下留下smdk2440.h, 其它全部删除viboard/sams
3、ung/smdk2440/Makefile/修改smdk2440下Makefile的编译项,如下:COBJS := smdk2440.o flash.o/修改第28行因在smdk2440下我们将smdk2410.c改名为smdk2440.c6、修改u-boot跟目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器,修改159行CROSS_COMPILE ?= arm-linux-/指定交叉编译器为arm-linux-gccsmdk2410_config:unco
4、nfig/2410编译选项格式$(MKCONFIG) $(:_config=)arm arm920t smdk2410 samsung s3c24x0smdk2440_config:unconfig/修改蒂3054行,2440编译选项格式$(MKCONFIG) $(:_config=)arm arm920tsmdk2440 samsung s3c24x0*说明:arm :CPU的架构(ARCH) arm920t:CPU的类型 smdk2440 :对应在board目录下建立新的开发板项目的目录 samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为N
5、ULL s3c24x0:CPU型号*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错7、测试编译新建的smdk2440开发板项目在uboot根目录测试make smdk2440_configmake即可在uboot根目录下生成bin文件在uboot里,清除中间文件用命令make distcleanu-boot-2011.03在TQ2440上的移植(2)-初始化时钟收藏smdk2440的初始化设置1、u-boot主要的目录结构如下2、启动流程图下图由上图可知u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常
6、放在lib_xxxx/board.c文件中,他用C语言写成。3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏vi include/configs/smdk2440.h在第40行添加#define CONFIG_S3C2440 14、stage1阶段的硬件设备初始化。vi arch/arm/cpu/arm920t/start.S去掉117,118行点亮AT91RM9200DK系列LED的代码/*bl coloured_LED_initbl red_LED_on*/5、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设
7、置部分。在164行添加如下红色内容#ifdefined(CONFIG_S3C2410)ldr r1,=0x3ffldr r0,=INTSUBMSKstr r1,r0#endif/*164行*/# if defined(CONFIG_S3C2440)/添加s3c2440的中断禁止部分 ldr r1, =0x7fff /根据2440芯片手册,INTSUBMSK寄存器有15位可用 ldr r0, =INTSUBMSK str r1, r0# endif# if defined(CONFIG_S3C2440) /添加s3c2440的时钟部分#define MPLLCON 0x4C000004 /系统主
8、频配置寄存器基地址#define UPLLCON 0x4C000008 /USB时钟频率配置寄存器基地址 ldr r0, =CLKDIVN /设置分频系数FCLK:HCLK:PCLK = 1:4:8 mov r1, #5 str r1, r0 ldr r0, =MPLLCON /设置系统主频为405MHz ldr r1, =0x7F021 /这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分 str r1, r0 ldr r0, =UPLLCON /设置USB时钟频率为48MHz ldr r1, =0x38022 /这个值参考芯片手册“PLL VALUE SELECT
9、ION TABLE”部分 str r1, r0# else /其他开发板的时钟部分,这里就不用管了,我们现在是做2440的6、S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:vi board/samsung/smdk2440/smdk2440.c时钟部分修改第34行和在45行添加如下红色部分#define FCLK_SPEED 2 /设置默认等于2,即下面红色代码部分有效#if FCLK_SPEED=0 /* Fout = 203
10、MHz, Fin = 12MHz for Audio */#define M_MDIV 0xC3#define M_PDIV 0x4#define M_SDIV 0x1#elif FCLK_SPEED=1 /* Fout = 202.8MHz */#define M_MDIV 0xA1#define M_PDIV 0x3#define M_SDIV 0x1#elif FCLK_SPEED=2 /* Fout = 405MHz */#define M_MDIV 0x7F /这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置#define M_PD
11、IV 0x2#define M_SDIV 0x1#endifUSB时钟部分修改第51行和在61行添加如下红色部分#define USB_CLOCK 2 /设置默认等于2,即下面红色代码部分有效#if USB_CLOCK=0#define U_M_MDIV 0xA1#define U_M_PDIV 0x3#define U_M_SDIV 0x1#elif USB_CLOCK=1#define U_M_MDIV 0x48#define U_M_PDIV 0x3#define U_M_SDIV 0x2#elif USB_CLOCK=2 /* Fout = 48MHz */#define U_M_MD
12、IV 0x38 /这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置#define U_M_PDIV 0x2#define U_M_SDIV 0x2#endif7、vi arch/arm/cpu/arm920t/s3c24x0/speed.c /根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数get_PLLCLK函数修改第66行如下static ulong get_PLLCLK(int pllreg) S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBas
13、e_CLOCK_POWER(); ulong r, m, p, s; if (pllreg = MPLL) r = clk_power-MPLLCON; else if (pllreg = UPLL) r = clk_power-UPLLCON; else hang(); m = (r & 0xFF000) 12) + 8; p = (r & 0x003F0) 4) + 2; s = r & 0x3;#if defined(CONFIG_S3C2440) if(pllreg = MPLL) /参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s) return
14、(CONFIG_SYS_CLK_FREQ * m * 2) / (p s); #endif return(CONFIG_SYS_CLK_FREQ * m) / (p CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK();u-boot-2011.03在TQ2440上的移植(3)-支持norflash启动收藏1、修改命令提示符为自己的vi include/configs/smdk2440.h第118行修改为#define CONFIG_SYS_PROMPT SMDK2440# /将命令行前的名字改成SMDK24402、通常,在嵌入式bootloader中,有两种方式
15、来引导启动内核:从Nor Flash启动和从Nand Flash启动。u-boot中默认是从Nor Flash启动的。3、TQ2440的所用的Norflash为EN29LV160AB。接线同AM29LV160DB翻开此芯片的datasheet看到TQ2440原理图上的第47脚BYTE#是接高电平的,so 此芯片工作于16位模式(半字模式)A0-A19是地址线,在半字模式下,D0-D15做为数据输入输出口。因为数据位是16位,A0-A19可以选择220 = 1M *2BYTE = 2Mbyte。正好是AM29LV160DB的容量。S3C2440的ADDR1要接AM29LV160DB的A0。上图中
16、AM29LV160DB的A20,A21是空脚,分别接的是LADDR21,LADDR22。这应该是为了以后方便扩展NOR FLASH的容量。LADDR21,LADDR22对AM29LV160DB是没用的。2048K * 8bit / 1024K * 16bit Flash Memory Boot Sector Flash MemoryFlexible Sector Architecture:-One16-Kbyte,two8-Kbyte,one32-Kbyte, andthirty-one64-Kbyte sectors(byte mode)-One8-Kword,two4-Kword,one1
17、6-Kword,andthirty-one32-Kword sectors(word mode)无论哪种模式总扇区是35sectors。4、修改Norflash参数vi include/configs/smdk2440.h/*-* FLASH and environment organization*/#if 0 /注释掉下面两个类型的Nor Flash设置,因为不是我们所使用的型号#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */#define CONFIG_AMD_LV800 1 /* unco
18、mment this if you have a LV800 flash */#endif#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */#ifdef CONFIG_AMD_LV800#define PHYS_FLASH_SIZE 0x00100000 /* 1MB */#define CONFIG_SYS_MAX_FLASH_SECT (19) /* max number of sectors on one chip */#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH
19、_BASE + 0x0F0000) /* addr of environment */#endif#ifdef CONFIG_AMD_LV400#define PHYS_FLASH_SIZE 0x00080000 /* 512KB */#define CONFIG_SYS_MAX_FLASH_SECT (11) /* max number of sectors on one chip */#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) /* addr of environment */#endif/第175行添加如下内容#d
20、efine CONFIG_EON_29LV160AB 1 /添加TQ2440开发板Nor Flash设置#define PHYS_FLASH_SIZE 0x200000 /我们开发板的Nor Flash是2M#define CONFIG_SYS_MAX_FLASH_SECT (35) /根据EN29LV160AB的芯片手册描述,共35个扇区#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x80000) /暂设置环境变量的首地址为0x80000 /在256K处放uboot参数5、添加Norflash的informationvi include/
21、flash.h第181行添加#define EON_ID_LV160AB 0x224922496、修改norflash的驱动,在u-boot中对Nor Flash的操作分别有初始化、擦除和写入,所以我们主要修改与硬件密切相关的三个函数flash_init、flash_erase、write_hword。vi board/samsung/smdk2440/flash.c由-One8-Kword,two4-Kword,one16-Kword,andthirty-one32-Kword sectors(word mode)可知主要扇区大小为32k,so修改第31行#define MAIN_SECT_
22、SIZE 0x8000/定义为32k,主要扇区的大小#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 1)#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE+ (0x000002AA 1)由于我们是把norflash连接到了s3c2440的bank0上,因此norflash中的地址相对于s3c2440来说基址为0x00000000,即CONFIG_SYS_FLASH_BASE = 0。而之所以又把norflas
23、h中的地址向左移一位(即乘以2),是因为我们是把s3c2440的ADDR1连接到了norflash的A0上的缘故。由数据手册可知EN29LV160AB第0扇区大小为8K,第1、2为4K,第3为16K,后面31扇区为32K。前面4个扇区加起来刚好是主要扇区的大小 = 32K, 所以修改87行下如下for (j = 0; j flash_infoi.sector_count; j+) if (j flash_id & FLASH_VENDMASK) case (AMD_MANUFACT & FLASH_VENDMASK):printf (AMD: );break;case (EON_MANUFAC
24、T & FLASH_VENDMASK):printf (EON: );break;default:printf (Unknown Vendor );break;switch (info-flash_id & FLASH_TYPEMASK) case (AMD_ID_LV400B & FLASH_TYPEMASK):printf (1x Amd29LV400BB (4Mbit)n);break;case (AMD_ID_LV800B & FLASH_TYPEMASK):printf (1x Amd29LV800BB (8Mbit)n);break;case (EON_ID_LV160AB & F
25、LASH_TYPEMASK):printf (1x EN29LV160AB (16Mbit)n);break;default:printf (Unknown Chip Typen);goto Done;break;修改int flash_erase (flash_info_t * info, int s_first, int s_last)if (info-flash_id & FLASH_VENDMASK) != (EON_MANUFACT& FLASH_VENDMASK) return ERR_UNKNOWN_FLASH_VENDOR;7、至此,uboot关于Norflash已经移植好make distcleanmake smdk2440_configmake即可生成u-boot.bin下载到板子的Norflash,在命令台输入saveenv即可SMDK2440#saveenvSaving Environment to Flash.Un-Protected 2 sectorsErasing Flash.Erasing sector 19 . ok.Erasing sector 20 . ok.Erased 2 sectorsWriting to Flash. doneProte
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1