专门做兼职的网站,教做3d的网站,wordpress销售页面,深圳建网站价格今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版#xff0c;通过记录学习分享#xff0c;与大家一起进步#xff01;#xff01;#xff01;
1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2#xff0c;建立source insight工程。将下载好的uboot通过…今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版通过记录学习分享与大家一起进步
1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2建立source insight工程。将下载好的uboot通过FTP服务器传送到虚拟机中的linux系统下。 解压uboot
tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 make smdk2410_config make
将得到的u-boot.bin文件下载到开发板下载方式不唯一连接至串口发现没有输出。所以我们下载的uboot不支持我们的jz2440开发板我们接下来应该通过修改uboot源码使它支持我们的开发板。
2.分析u-boot: 得知大概的启动过程如下
-初始化硬件关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH -如果bootloader较大要把它重定位到SDRAM -把内核从NAND FLASH 读到 SDRAM -设置“设置要传给内核的参数” -跳转要执行的内核
3.修改U-BOOT代码 3.1 建一个单板 cd board/samsung/ cp smdk2410 smdk2440 -rf cd ../../include/configs/ cp smdk2410.h smdk2440.h
修改boards.cfg: 仿照 smdk2410 arm arm920t - samsung s3c24x0 添加 smdk2440 arm arm920t - samsung s3c24x0 重新编译烧写看结果串口还是没有输出. 阅读代码发现不足UBOOT里先以60MHZ的时钟计算参数来设置内存控制器但是MPLL还未设置 处理措施把MPLL的设置放到start.S里取消board_early_init_f里对MPLL的设置 操作如下 在uboot中的start.s中170行有代码如下 /* FCLK:HCLK:PCLK 1:2:4 *//* default FCLK is 120 MHz ! */ldr r0, CLKDIVNmov r1, #3str r1, [r0]
这是设置时钟的我们将这一部分删掉然后换成如下代码
/* 2. 设置时钟 */ldr r0, 0x4c000014// mov r1, #0x03; // FCLK:HCLK:PCLK1:2:4, HDIVN1,PDIVN1mov r1, #0x05; // FCLK:HCLK:PCLK1:4:8str r1, [r0]/* 如果HDIVN非0CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */#define S3C2440_MPLL_400MHZ ((0x5c12)|(0x014)|(0x01))/* MPLLCON S3C2440_MPLL_200MHZ */ldr r0, 0x4c000004ldr r1, S3C2440_MPLL_400MHZstr r1, [r0]/* 启动ICACHE */mrc p15, 0, r0, c1, c0, 0 read control regorr r0, r0, #(112)mcr p15, 0, r0, c1, c0, 0 write it back在lowlevel_init.S中最后有如下代码
SMRDATA:.word (0(B1_BWSCON4)(B2_BWSCON8)(B3_BWSCON12)(B4_BWSCON16)(B5_BWSCON20)(B6_BWSCON24)(B7_BWSCON28)).word ((B0_Tacs13)(B0_Tcos11)(B0_Tacc8)(B0_Tcoh6)(B0_Tah4)(B0_Tacp2)(B0_PMC)).word ((B1_Tacs13)(B1_Tcos11)(B1_Tacc8)(B1_Tcoh6)(B1_Tah4)(B1_Tacp2)(B1_PMC)).word ((B2_Tacs13)(B2_Tcos11)(B2_Tacc8)(B2_Tcoh6)(B2_Tah4)(B2_Tacp2)(B2_PMC)).word ((B3_Tacs13)(B3_Tcos11)(B3_Tacc8)(B3_Tcoh6)(B3_Tah4)(B3_Tacp2)(B3_PMC)).word ((B4_Tacs13)(B4_Tcos11)(B4_Tacc8)(B4_Tcoh6)(B4_Tah4)(B4_Tacp2)(B4_PMC)).word ((B5_Tacs13)(B5_Tcos11)(B5_Tacc8)(B5_Tcoh6)(B5_Tah4)(B5_Tacp2)(B5_PMC)).word ((B6_MT15)(B6_Trcd2)(B6_SCAN)).word ((B7_MT15)(B7_Trcd2)(B7_SCAN)).word ((REFEN23)(TREFMD22)(Trp20)(Trc18)(Tchr16)REFCNT).word 0x32.word 0x30.word 0x30将其删掉改为 .long 0x22011110 //BWSCON.long 0x00000700 //BANKCON0.long 0x00000700 //BANKCON1.long 0x00000700 //BANKCON2.long 0x00000700 //BANKCON3 .long 0x00000700 //BANKCON4.long 0x00000700 //BANKCON5.long 0x00018005 //BANKCON6.long 0x00018005 //BANKCON7.long 0x008C04F4 // REFRESH.long 0x000000B1 //BANKSIZE.long 0x00000030 //MRSRB6.long 0x00000030 //MRSRB7
重新编译烧写看看什么情况编译烧写成功启动串口输出打印乱码如下至少有打印了说明我们已经成功了第一步哈哈哈 3.1下面解决串口打印乱码问题 查看串口波特率的设置在arch\arm\lib中有函数board_init_f其中有一个结构体init_sequence
for (init_fnc_ptr init_sequence; *init_fnc_ptr; init_fnc_ptr) {if ((*init_fnc_ptr)() ! 0) {hang ();
跳转到这个结构体 init_fnc_t *init_sequence[] {
#if defined(CONFIG_ARCH_CPU_INIT)arch_cpu_init, /* basic arch cpu dependent setup */
#endif
#if defined(CONFIG_BOARD_EARLY_INIT_F)board_early_init_f,
#endif
#ifdef CONFIG_OF_CONTROLfdtdec_check_fdt,
#endiftimer_init, /* initialize timer */
#ifdef CONFIG_FSL_ESDHCget_clocks,
#endifenv_init, /* initialize environment */init_baudrate, /* initialze baudrate settings */serial_init, /* serial communications setup */console_init_f, /* stage 1 init of console */display_banner, /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)checkboard, /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)init_func_i2c,
#endifdram_init, /* configure available RAM banks */NULL,
};里面是各种初始化找到串口初始化serial_init跳转到这里
int serial_init(void)
{return serial_init_dev(UART_NR);
}
#endif
然后跳转到这里serial_init_dev
/* Initialise the serial port. The settings are always 8 data bits, no parity,* 1 stop bit, no start bits.*/
static int serial_init_dev(const int dev_index)
{struct s3c24x0_uart *uart s3c24x0_get_base_uart(dev_index);#ifdef CONFIG_HWFLOWhwflow 0; /* turned off by default */
#endif/* FIFO enable, Tx/Rx FIFO clear */writel(0x07, uart-ufcon);writel(0x0, uart-umcon);/* Normal,No parity,1 stop,8 bit */writel(0x3, uart-ulcon);/** txlevel,rxedge,disable timeout int.,enable rx error int.,* normal,interrupt or polling*/writel(0x245, uart-ucon);#ifdef CONFIG_HWFLOWwritel(0x1, uart-umcon); /* rts up */
#endif/* FIXME: This is sooooooooooooooooooo ugly */
#if defined(CONFIG_ARCH_GTA02_v1) || defined(CONFIG_ARCH_GTA02_v2)/* we need auto hw flow control on the gsm and gps port */if (dev_index 0 || dev_index 1)writel(0x10, uart-umcon);
#endif_serial_setbrg(dev_index);return (0);
}然后跳转到这里_serial_setbrg void _serial_setbrg(const int dev_index) { struct s3c24x0_uart *uart s3c24x0_get_base_uart(dev_index); unsigned int reg 0; int i;
/* value is calculated so : (int)(PCLK/16./baudrate) -1 */
reg get_PCLK() / (16 * gd-baudrate) - 1;writel(reg, uart-ubrdiv);
for (i 0; i 100; i)/* Delay */ ;} 跳转到get_PCLK
ulong get_PCLK(void)
{struct s3c24x0_clock_power *clk_power s3c24x0_get_base_clock_power();return (readl(clk_power-clkdivn) 1) ? get_HCLK() / 2 : get_HCLK();
}
跳转到这里get_HCLK
ulong get_HCLK(void)
{struct s3c24x0_clock_power *clk_power s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440switch (readl(clk_power-clkdivn) 0x6) {default:case 0:return get_FCLK();case 2:return get_FCLK() / 2;case 4:return (readl(clk_power-camdivn) (1 9)) ?get_FCLK() / 8 : get_FCLK() / 4;case 6:return (readl(clk_power-camdivn) (1 8)) ?get_FCLK() / 6 : get_FCLK() / 3;}
我们会发现#ifdef CONFIG_S3C2440 这一句是黑色的说明没有定义这个CONFIG_S3C2440 处理措施 在include/configs/smdk2440.h: 去掉CONFIG_S3C2410 换成CONFIG_S3C2440 #define CONFIG_S3C2440 定义好这个之后重新编译发现编译有错误如下
错误显示有大量关于nand的错误猜想原因应该是此uboot暂时不支持该单板我决定先把nand去掉先看看串口是否可以正常打印出不是乱码的消息之后再加入nand的支持要一步一步来嘛我们把关于nand的编译选项去掉查看/drivers/mtd/nand/Makefile,找到只一句 COBJS-$(CONFIG_NAND_S3C2410) s3c2410_nand.o 说明编译s3c2410_nand.c以来的定义是CONFIG_NAND_S3C2410在源码中搜索CONFIG_NAND_S3C2410在smdk2440.h中找到
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
#endif
说明定义了CONFIG_CMD_NAND则CONFIG_NAND_S3C2410就被定义我们只需要让CONFIG_CMD_NAND不被定义即可搜索到如下 #define CONFIG_CMD_NAND 将其改为 //#define CONFIG_CMD_NAND 重新编译没有出现错误烧写测试串口输出为
哈哈哈串口终于输出而且不是乱码了我们已经走出了第一步接下来就是让它支持nand flash了也不是容易的事情啊已经写了这么多了就放到下一篇 博客中吧
想跟我一起交流学的加我 qq1126137994 二维码 微信liu1126137994 二维码 备注交流学习哦 另外我这里有大量的学习资料以及现成的项目的经验总结欢迎叨扰