u-boot-2012.07移植到TQ2440(二)

2024-05-13 19:38
文章标签 移植 boot tq2440 2012.07

本文主要是介绍u-boot-2012.07移植到TQ2440(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

五、支持Nand Flash读写:

  1.修改配置文件include\configs\smdk2440.h打开之前注释掉的NAND相关的宏

     #defineCONFIG_CMD_NAND    //zai 101 hang
   
#define CONFIG_ENV_IS_IN_NAND
    #define CONFIG_ENV_OFFSET0x40000
    #define CONFIG_ENV_SIZE0x20000

    #define CONFIG_NAND_S3C2440                       //zai  206  hang

    #define CONFIG_SYS_S3C2440_NAND_HWECC

  2.在drivers/mtd/nand/Makefile文件中增加一行

       COBJS-$(CONFIG_NAND_S3C2440)+= s3c2440_nand.o

  3.将drivers\mtd\nand\s3c2410_nand.c复制为drivers\mtd\nand\s3c2440_nand.c并进行修改

     将s3c2440_nand.c中所有的2410替换为2440

     //#define S3C2410_NFCONF_EN (1<<15) 

     //#define S3C2410_NFCONF_512BYTE (1<<14) 

     //#define S3C2410_NFCONF_4STEP (1<<13) 

     #define S3C2410_NFCONF_INITECC (1<<12) 

     #define S3C2410_NFCONF_nFCE (1<<11) 

    //#define S3C2410_NFCONF_TACLS(x) ((x)<<8) 

    //#define S3C2410_NFCONF_TWRPH0(x) ((x)<<4)

    //#define S3C2410_NFCONF_TWRPH1(x) ((x)<<0) 

    #define S3C2410_ADDR_NALE 12 

    #define S3C2410_ADDR_NCLE 8

    修改下面这个函数为如下:

    static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
   {
       struct nand_chip *chip = mtd->priv;
       struct s3c2440_nand *nand = s3c2440_get_base_nand();
       debug("hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);

       if (ctrl & NAND_CLE) 

       

           /* 发命令 */ writeb(cmd, &nand->nfcmd); 

        }

       else if (ctrl & NAND_ALE)

       {

           /* 发地址 */ writeb(cmd, &nand->nfaddr);

       }

   }

   将以下内容:

   /* initialize hardware */ 

   #if defined(CONFIG_S3C24XX_CUSTOM_NAND_TIMING) 

      tacls = CONFIG_S3C24XX_TACLS; 

      twrph0 = CONFIG_S3C24XX_TWRPH0;

      twrph1 = CONFIG_S3C24XX_TWRPH1;

   #else

       tacls = 4;

       twrph0 = 8;

       twrph1 = 8;

   #endif

   cfg = S3C2410_NFCONF_EN;

   cfg |= S3C2410_NFCONF_TACLS(tacls - 1);

   cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);

   cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);

   writel(cfg, &nand_reg->nfconf);

       替换为:

   writel((0 << 12)|(1 << 8)|(0 << 4), &nand_reg->nfconf);

   /*初始化ECC、禁止片选、使能NAND FLASH控制器*/

   writel((1 << 4)|(0 << 1)|(1 << 0), &nand_reg->nfcont);


六、支持Nand Flash启动:

  1. 去除arch/arm/config.mk:88:LDFLAGS_u-boot += -pie中的“-pie”
  2.修改配置文件include\configs\smdk2440.h
   给u-boot分配512KB
   #define CONFIG_SYS_TEXT_BASE  0x33f80000

   增加文件board\smdk2440\nand_read_ll.c并修改相应的Makefile

   COBJS   := smdk2440.onand_read_ll.o

   Nand_read_ll.c文件内容如下:

/* NAND FLASH控制器 */
#define NFCONF(*((volatile unsigned long *)0x4E000000))
#define NFCONT(*((volatile unsigned long *)0x4E000004))
#define NFCMMD(*((volatile unsigned char *)0x4E000008))
#define NFADDR(*((volatile unsigned char *)0x4E00000C))
#define NFDATA(*((volatile unsigned char *)0x4E000010))
#define NFSTAT(*((volatile unsigned char *)0x4E000020))
static int isBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if (*p == 0x12345678) 
{
/* 写成功,是nand启动 */
*p = val;
return 0;
}
else
{
/* NOR不能像内存一样写 */
return 1;
}
}
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)
{
#defineTACLS   0
#defineTWRPH0  1
#defineTWRPH1  0
/* 设置时序 */
NFCONF =(TACLS<<12)|(TWRPH0<<8)|(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 >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = page & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 8) & 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 < 2048) && (i< len); col++) 
{
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
}
/* 7. 取消选中 */
nand_deselect();
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
int i = 0;
/* 如果是NOR启动 */
if (isBootFromNorFlash()) 
{
while (i < len)
{
dest[i] = src[i];
i++;
}
}
else
{
nand_init_ll();
nand_read_ll((unsigned int)src, dest,len);
}
}


 

     3.修改arch\arm\cpu\arm920t\start.S

   call_board_init_f:
   ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
   bic sp, sp, #7 /* 8-byte alignment for ABIcompliance */
   ldr r0,=0x00000000

ldr r1, _TEXT_BASE
ldr r2, _bss_start_ofs
bl copy_code_to_sdram
bl clear_bss
ldr pc, = board_init_f  /* 跳转到SDRAM */
.globl second
second:
mov sp, r2 /*重新设置栈指针 */
/* 调用第2阶段的代码 */
bl board_init_r



   ldr r1, _TEXT_BASE
   ldr r2, _bss_start_ofs
   bl copy_code_to_sdram
   bl clear_bss
   ldr pc, = board_init_f  /* 跳转到SDRAM */
   .globl second
   second:
    mov sp, r2 /*重新设置栈指针 */
   /* 调用第2阶段的代码 */
   bl board_init_r


   注释掉以下代码

   #if 0
    .globl    relocate_code
   relocate_code:
   mov      r4, r0   /* save addr_sp */
   mov      r5, r1   /* save addr of gd */
   mov      r6, r2   /* save addr of destination */

   。。。。。。。。。。。。。。。
   clbss_l:str  r2, [r0]              /*clear loop...                  */
   add       r0, r0, #4
   cmp      r0, r1
   bne       clbss_l

   bl coloured_LED_init
   bl red_led_on
   #endif
   #endif

  4.修改arch\arm\lib\board.c中的函数board_init_f

   //addr -=gd->mon_len;
   //
addr &=~(4096 - 1);
   addr =CONFIG_SYS_TEXT_BASE;
   注视最后的重定位,并跳转到刚才定义的second
   //relocate_code(addr_sp,id, addr);
   second(id, addraddr_sp);

  5.修改链接脚本arch\arm\cpu\u-boot.lds把start.o、nand_read_ll.o、lowlevel_init.o编译到前面4k

   CPUDIR/start.o (.text)
   board/smdk2440/libsmdk2440.o(.text)

  6.修改arch\arm\lib\board.c

   由于从NAND启动,CPU检测不到NOR FLASH,所以无法启动:

   我们直接注释掉上面的hang();

      # endif /*CONFIG_SYS_FLASH_CHECKSUM */
      }
      else {
      puts(failed);
       //hang();
       }
   #endif

  7.测试能否成功从nand启动:

     a.首先在开发板上ping一下主机,看是否恩能够ping通。

     b.然后将u-boot.bin文件通过 TFTP 的方式加载到开发板的RAM中

        SMDK2440 #tftp 32000000 u-boot.bin

     c.擦除nand flash 芯片:

        SMDK2440 #nand erase 0 40000
     d.将u-boot.bin写到nand flash中:

        SMDK2440 #nand write 32000000 0 40000

     e.重启开发板。

    

这篇关于u-boot-2012.07移植到TQ2440(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986634

相关文章

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小