- 论坛徽章:
- 0
|
重点
1. 关闭的宏要怎么打开???
-----处理措施:
去它的.h配置文件中添加。
例如: #define CONFIG_S3C2440
2. 怎么删除一个文件???
--处理措施:
例如: 要删除 drivers\mtd\nand\s3c2410_nand.c
找到 drivers\mtd\nand\Makefile
搜索 s3c2410_nand
找到 COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
根据 CONFIG_NAND_S3C2410宏
找到 #define CONFIG_NAND_S3C2410的宏开关
注销掉 //#define CONFIG_NAND_S3C2410的宏开关
3. 编辑出来的U-BOOT非常大,用光盘里的U-BOOT来更新新的U-BOOT.
烧写到NOR FLASH的方法:
把光盘里的u-boot.bin 烧写进NOR FALSH
进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送
Usb 1 30000000 // 一次, 目标地址
Protect off all //擦出NOR 的写保护
Erase 0 7ffff //从什么位置擦出, 擦出多大
Cp.b 30000000 0 80000 //源地址, 目标地址, 复制多大
烧写到 NAND FLASH的方法:
把光盘里的u-boot.bin 烧写进NOR FALSH
进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送
Usb 1 30000000 // 一次, 目标地址
Nand erase 0 80000 //从什么位置擦出, 擦出多大
Nand write 30000000 0 80000 //源地址, 目标地址, 复制多大
A. 尝试创建新单板
1. 编译相近的smdk2410看u-boot能否通过
Make smdk2410_config
Make //成功编译出U-BOOT
2. 开始创建自己的单板
cd board/samsung/
cp smdk2410 smdk2440 –rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h
但现在还不能make smdk2440_config 通过grep "smdk2410" * -nR知道还需要修改boards.cfg
3. vi boards.cfg
添加一行:
smdk2440 arm arm920t - samsung s3c24x0
现在可以make smdk2440_config,新单板的u-boot的最初模型出来了,但绝对还不能使用,需要修改代码
B. 修改代码(SDRAM, UART,时钟,重定位)
一. 修改时钟
从\u-boot-2012.04.01\arch\arm\cpu\arm920t\start.S阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
注释掉原文对PLL,MPLL的设置,,提取到start.S里设置
1. 注释掉(\board\samsung\smdk2410\Smdk2440.c)int board_early_init_f(void)中的
#if 0
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
#endif
2. Start.S 修改时钟设置,
注释掉:start.S 中的
#if 0
/* FCLK:HCLK CLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
3. 添加代码
/* 2. 设置时钟 */
ldr r0, =0x4c000014
// mov r1, #0x03; // FCLK:HCLK CLK=1:2:4, HDIVN=1,PDIVN=1
mov r1, #0x05; // FCLK:HCLK CLK=1:4:8
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“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 ((0x5c<<12)|(0x01<<4)|(0x01))
/* MPLLCON = S3C2440_MPLL_200MHZ */
ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]
/* 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
二: 修改SDRAM
注释掉以前对SMRDATA的设置换成
SMRDATA:
.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
make 出现乱码
三: UART 波特率
跟踪文件:
Start.S
board_init_f
init_sequence
serial_init, /* serial communications setup */
serial_init_dev(UART_NR)
_serial_setbrg(dev_index);
reg = get_PCLK() / (16 * gd->baudrate) - 1;
get_HCLK
最中找到了这句 #ifdef CONFIG_S3C2440) 宏未定义
1. 处理措施:\include\configs\Smdk2440.h
取消/ /#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */
添加 #define CONFIG_S3C2440
Make
出现一堆问题
查看代码发现因为我们关闭了 CONFIG_S3C2410 这个宏,导致里面的nand->nfconf成员不能用,需要完全的修改 static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) 这个函数,但我们现阶段只想让它能正常显示,所以先删除这个文件
2. 删除 drivers\mtd\nand\s3c2410_nand.c文件
--处理措施:
找到drivers\mtd\nand\Makefile
搜索s3c2410_nand
找到 COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
根据CONFIG_NAND_S3C2410宏
找到#define CONFIG_NAND_S3C2410的宏开关
全部注销 #ifdef CONFIG_CMD_NAND
//#define CONFIG_CMD_NAND
Make 烧写进NOR flash
看结果 能正常显示!!!!!
C. 修改代码支持NAND FLASH
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).
1. 通过 grep "\-pie" * -nR 搜索
arch/arm/config.mk:75:LDFLAGS_u-boot += -pie
vi arch/arm/config.mk +75
ifndef CONFIG_NAND_SPL
#LDFLAGS_u-boot += -pie
Endif
2. 添加一个 init.c文件进U-BOOT工程
把文件放入board/Samsung/smdk2440文件夹
修改当前目录里的Makefile
vi board/samsung/smdk2440/Makefile
添加:COBJS := smdk2410.o init.o
Init.c 代码
/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E00000 )
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if (*p == 0x1234567
{
/* 写成功, 是nand启动 */
*p = val;
return 0;
}
else
{
/* NOR不能像内存一样写 */
return 1;
}
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
int i = 0;
/* 如果是NOR启动 */
if (isBootFromNorFlash())
{
while (i < len)
{
dest = src;
i++;
}
}
else
{
nand_read_ll((unsigned int)src, dest, len);
}
}
void clear_bss(void)
{
extern int __bss_start, __bss_end;
int *p = &__bss_start;
for (; p < &__bss_end; p++)
*p = 0;
}
void nand_init_ll(void)
{
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
/* 设置时序 */
NFCONF = (TACLS<<12)|(TWRPH0<< |(TWRPH1<<4);
/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
NFCONT = (1<<4)|(1<<1)|(1<<0);
}
static void nand_select(void)
{
NFCONT &= ~(1<<1);
}
static void nand_deselect(void)
{
NFCONT |= (1<<1);
}
static void nand_cmd(unsigned char cmd)
{
volatile int i;
NFCMMD = cmd;
for (i = 0; i < 10; i++);
}
static void nand_addr(unsigned int addr)
{
unsigned int col = addr % 2048;
unsigned int page = addr / 2048;
volatile int i;
NFADDR = col & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (col >> & 0xff;
for (i = 0; i < 10; i++);
NFADDR = page & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 16) & 0xff;
for (i = 0; i < 10; i++);
}
static void nand_wait_ready(void)
{
while (!(NFSTAT & 1));
}
static unsigned char nand_data(void)
{
return NFDATA;
}
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
int col = addr % 2048;
int i = 0;
/* 1. 选中 */
nand_select();
while (i < len)
{
/* 2. 发出读命令00h */
nand_cmd(0x00);
/* 3. 发出地址(分5步发出) */
nand_addr(addr);
/* 4. 发出读命令30h */
nand_cmd(0x30);
/* 5. 判断状态 */
nand_wait_ready();
/* 6. 读数据 */
for (; (col < 204 && (i < len); col++)
{
buf = nand_data();
i++;
addr++;
}
col = 0;
}
/* 7. 取消选中 */
nand_deselect();
}
3. 修改start.S 的重定位 代码
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
bl nand_init_ll
mov r0, #0 //源地址
ldr r1, _TEXT_BASE //目地地址
ldr r2, _bss_start_ofs //长度
bl copy_code_to_sdram //拷贝代码
bl clear_bss //清除BSS
ldr pc, =call_board_init_f //从片内内存掉到SDRAM执行
/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:
ldr r0,=0x00000000
bl board_init_f
ldr r1, _TEXT_BASE //第二阶段board_init_r(第二个参数)
bl board_init_r //跳到第二阶段函数
修改arch\arm\lib\Board.c里的这个 board_init_f 函数,让它有返回值,作为第二阶段board_init_r(第一个参数)保存到r0 里面
unsigned int board_init_f(ulong bootflag)
return (unsigned int ) id;
4. 修改目地地址
include\configs\Smdk2440.h
设置为:#define CONFIG_SYS_TEXT_BASE 0x33f80000 //512K
后续还会修改,这只是个自己假设的值.后续编译得出的U-BOOT二进制文件远超过设定的0x33f80000
最终定位:#define CONFIG_SYS_TEXT_BASE 0x33f80000 //1M
5. 删除 arch\arm\lib\Board.c
//relocate_code(addr_sp, id, addr);
6. 删除start.S里的这一段代码:
/*------------------------------------------------------------------------------*/
* void relocate_code (addr_sp, gd, addr_moni)
* …………………
…………………
.globl relocate_code
relocate_code:
mov r4, r0 /* save addr_sp */
…………………..
……………………
bl red_led_on
#endif
7. 修改链接脚本把 start.S, init.c, lowlevel.S等文件放在最前面
find -name "u-boot.lds"
vi ./arch/arm/cpu/u-boot.lds:
.text :
{
__image_copy_start = .;
CPUDIR/start.o (.text)
添加:board/samsung/smdk2440/libsmdk2440.o (.text)
*(.text)
}
Make 一下
提示定义的board_init_f 函数与include/common.h:276行 类型不相同
处理措施:
修改:unsigned int board_init_f (ulong) ;
void board_init_r (gd_t *, ulong) ;
make 一下
提示找不到这个nand_info
处理措施:
8.
//addr -= gd->mon_len;
//addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE;
D 修改代码支持NOR FLASH
搜索 “Flash:” 找到arch\arm\lib\Board.c
//puts(failed);
//hang();
puts("0 KB" ;
还未写完,,,后续继续更新
|
failed, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH, FLASH
|