u-boot-2009.08在mini2440上的移植 增加nor flash功能

发布者:平和心态最新更新时间:2024-07-01 来源: elecfans关键字:u-boot  mini2440  移植  nor  flash功能 手机看文章 扫描二维码
随时随地手机看文章

移植环境

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

通常,在嵌入式bootloader中,有两种方式来引导启动内核:从Nor Flash启动和从Nand Flash启动。u-boot中默认是从Nor Flash启动,再从上一节测试运行的结果的中看,还发现几个问题:第一,我开发板的Nor Flash是2M的,而这里显示的是512kB;第二,出现Warning - bad CRC, using default environment的警告信息。不是u-boot默认是从Nor Flash启动的吗?为什么会有这些错误信息呢?这是因为我们还没有添加对我们自己的Nor Flash的支持,u-boot默认的是其他型号的Nor Flash,而我们的Nor Flash的型号是SST39VF1601。另外怎样将命令行提示符前面的SMDK2410变成我自己定义的呢?下面我们一一来解决这些问题。

2.1,修改u-boot源码,使其完全支持Nor Flash。

【1】添加对我们mini2440开发板上2M的Nor Flash(型号为SST39VF1601)的支持

在虽然 S3C2440 和S3C2410 对于Nor Flash 的链接都是一样的,但是SBC2410 使用的AMD 的Nor Flash 芯片,而mini2440 使用的SST 的Nor Flash。这两款芯片在写入时所使用的块大小、时序和指令代码有差别,所以必须根据芯片的数据手册进行修改。主要的差别请看数据手册的对比:
SST39VF1601:

u-boot-2009.08在mini2440上的移植(二)

 Am29LV160:

u-boot-2009.08在mini2440上的移植(二)

 

在u-boot中对Nor Flash的操作分别有初始化、擦除和写入,所以我们主要修改与硬件密切相关的三个函数flash_init、flash_erase、write_hword。

用gedit打开board/samsung/mini2440/flash.c,定位到31行附近,修改如下:

#define FLASH_BANK_SIZE PHYS_FLASH_SIZE
//#define MAIN_SECT_SIZE  0x10000 /* 64 KB */
#define MAIN_SECT_SIZE     0x1000  //定义为4k,刚好是一个扇区的大小

flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];

... ...

Nor Flash硬件连接

u-boot-2009.08在mini2440上的移植(二)

 

有原理图可知,一般NorFlash放在Bank0.所以CONFIG_SYS_BASE=0,但是开启mmu后baseaddr=地址0映射到的新地址。0x555<<1的原因是LADDR1与A0连接。也就是0x555表示片内第0x555个word(16bit)。

#define CMD_UNLOCK_BYPASS 0x00000020

#if defined(CONFIG_SST_VF1601)
#define MEM_FLASH_ADDR1  (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000005555 << 1)))
#define MEM_FLASH_ADDR2  (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AAA << 1)))
#else
#define MEM_FLASH_ADDR1  (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2  (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))
#endif

#define BIT_ERASE_DONE  0x00000080

在flash_init 函数中修改或添加后代码如下:

ulong flash_init (void)
{
 int i, j;
 ulong size = 0;

for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
  ulong flashbase = 0;

... ...

#elif defined(CONFIG_AMD_LV800)
            (AMD_MANUFACT & FLASH_VENDMASK) |
            (AMD_ID_LV800B & FLASH_TYPEMASK);
#elif defined(CONFIG_SST_39VF1601)  
            (SST_MANUFACT & FLASH_VENDMASK) |
            (SST_ID_xF1601 & FLASH_TYPEMASK);
#else
#error 'Unknown flash configured'
#endif

... ...

for (j = 0; j < flash_info[i].sector_count; j++) {
#ifndef CONFIG_SST_VF1601
   if (j <= 3) {
    /* 1st one is 16 KB */

... ...
#else
    flash_info[i].start[j] =
     flashbase + (j) * MAIN_SECT_SIZE;
#endif


 }
  size += flash_info[i].size;
 }

  ... ...

    return size;

}

在flash_print_info 函数中修改或添加后代码如下:

void flash_print_info (flash_info_t * info)
{
     int i;

    switch (info->flash_id & FLASH_VENDMASK) {
              case (AMD_MANUFACT & FLASH_VENDMASK):
              printf ('AMD: ');
              break;
              case (SST_MANUFACT & FLASH_VENDMASK):
              printf ('SST: ');
              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 (SST_ID_xF1601 & FLASH_TYPEMASK):
               printf ('1x SST39VF1610 (16Mbit)n');
               break;


               default:
               printf ('Unknown Chip Typen');
               goto Done;
               break;


    }

   ... ...

    Done:;
}

在flash_erase函数中修改或添加后代码如下:

int flash_erase (flash_info_t * info, int s_first, int s_last)
{
    ushort result;
    int iflag, cflag, prot, sect;
    int rc = ERR_OK;
    int chip;

     .... ....

    if ((s_first < 0) || (s_first > s_last)) {
    return ERR_INVAL;
    }

 if ((s_first < 0) || (s_first > s_last)) {
  return ERR_INVAL;
 }

#ifdef CONFIG_SST_VF1601
 if ((info->flash_id & FLASH_VENDMASK) !=
     (SST_MANUFACT & FLASH_VENDMASK)) {
  return ERR_UNKNOWN_FLASH_VENDOR;
 }
#else

 if ((info->flash_id & FLASH_VENDMASK) !=
     (AMD_MANUFACT & FLASH_VENDMASK)) {
  return ERR_UNKNOWN_FLASH_VENDOR;
 }
#endif
 prot = 0;

... ...

   if (info->protect[sect] == 0) { /* not protected */


   vu_short *addr = (vu_short *) (info->start[sect]);

   MEM_FLASH_ADDR1 = CMD_UNLOCK1;
   MEM_FLASH_ADDR2 = CMD_UNLOCK2;
   MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;

   MEM_FLASH_ADDR1 = CMD_UNLOCK1;
   MEM_FLASH_ADDR2 = CMD_UNLOCK2;
   *addr = CMD_ERASE_CONFIRM;

   /* wait until flash is ready */

#if 0

  chip = 0;

   do {

... ...

    printf ('ok.n');
   } else { /* it was protected */

        printf ('protected!n');
   }
}
#endif
   while(1){
          unsigned short i;
          i = *((volatile unsigned short *)addr) & 0x40;
          if(i != (*((volatile unsigned short *)addr) & 0x40))
               continue;
          if((*((volatile unsigned short *)addr)) & 0x80)
               break;
    }
    printf ('ok.n');
   } else { /* it was protected */
   printf ('protected!n');
  }
}

在write_hword函数中修改或添加后代码如下:

tatic int write_hword (flash_info_t * info, ulong dest, ushort data)
{
    vu_short *addr = (vu_short *) dest;
    ushort result;
    int rc = ERR_OK;
    int cflag, iflag;
    int chip;

    ... ...

    MEM_FLASH_ADDR1 = CMD_UNLOCK1;
    MEM_FLASH_ADDR2 = CMD_UNLOCK2;
    //MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
    MEM_FLASH_ADDR1 = CMD_PROGRAM;
    //*addr = CMD_PROGRAM;
    *addr = data;

    /* arm simple, non interrupt dependent timer */
    reset_timer_masked ();

    /* wait until flash is ready */

#if 0 

 chip = 0;
   do {
   result = *addr;

... ...

    } while (!chip);

    *addr = CMD_READ_ARRAY;

    if (chip == ERR || *addr != data)
        rc = ERR_PROG_ERROR;
#endif

  while(1){
         unsigned short i = *(volatile unsigned short *)addr & 0x40;
         if(i != (*(volatile unsigned short *)addr & 0x40))   //D6 == D6
             continue;
         if((*(volatile unsigned short *)addr & 0x80) == (data & 0x80)){
             rc = ERR_OK;
         break;     //D7 == D7
          }
        }
   if (iflag)
     enable_interrupts ();

   if (cflag)
     icache_enable ();

    return rc;
}

修改完后,保存。

【2】修改lowlevel_init.S 文件

为了匹配mini2440 的存储器配置(总线上连接的Nor Flash 和SDRAM),需要修改lowlevel_init.S文件。这个所连接的Nor Flash位数有关。至于SDRAM的参数,可以从芯片手册查到。据说有人将其64MB的内存升到了128MB,其参数就是在这里修改的,有需要可以看MINI2440: Auto probe for SDRAM size 。以下的64MB 内存的参数修改:

打开/board/samsung/mini2440/lowlevel_init.S,定位到123行,修改如下:

[1] [2]
关键字:u-boot  mini2440  移植  nor  flash功能 引用地址:u-boot-2009.08在mini2440上的移植 增加nor flash功能

上一篇:u-boot-2009.08在mini2440上的移植 建立mini2440工程环境
下一篇:u-boot-2009.08在mini2440上的移植 增加nand flash功能

推荐阅读最新更新时间:2024-11-03 06:05

Ubuntu下移植内核到OK6410开发板
环境:Win7+virsualBox+ubuntu12.04+ok6410开发板 一,下载源码:我这里下载的版本是--linux-3.12.7 http://www.kernel.org/ 二,解压内核: tar -xvf linux-3.12.7-tar.xz 三,更改权限(最好赋予全部权限) sudo chmod -R 777 linux-3.12.7/* 四,修改源码(针对基于smdk6410架构的ok6410开发板) 1,在arch/arm/mach-s3c64xx/目录下的mach-smdk6410.c 复制一份在当前文件下命名为mach-ok6410.c wu@wu-VirtualBox:/opt
[单片机]
Ubuntu下<font color='red'>移植</font>内核到OK6410开发板
linux-2.6.32在mini2440开发板上移植 SD卡驱动移植
编者:这个驱动还是比较复杂的,先移植着,以后在分析吧。 SD卡驱动移植 1 在内核中注册SD 设备驱动 Linux-2.6.32.2 已经自带了S3C2440 芯片的SD 卡驱动,我们只需在初始化代码中加入SD 平台设备结构就可以,打开arch/arm/mach-s3c2440/mach-mini2440.c,在nand flash 平台结构后面添加如下红色代码: ;在mini2440.c 的顶部添加SD 卡设备结构所需的头文件 #include linux/mmc/host.h #include plat/mci.h static struct platform_device mini2440_device_eth = { .n
[单片机]
Nordic Semiconductor将在亚洲消费电子展上展示蓝牙智能解决方案
挪威奥斯陆 2016年5月4日 Nordic Semiconductor公司将在2016年亚洲消费电子展(CES Asia 2016)上展示全球功能最强大的单芯片蓝牙智能(Bluetooth Smart)解决方案──nRF52系列蓝牙智能系统级芯片(SoC)。该展会将于5月11日(星期三)至5月13日(星期五)在上海新国际博览中心举办,Nordic Semiconductor公司位于N2展厅2214号展台。 蓝牙智能是物联网(IoT)和智能家居的基础技术。Nordic公司将在2016年亚洲消费电子展上为参观者提供大好机会 ── 通过实时客户演示来了解其技术如何助力各种关键的IoT和智能家居创新。每天将有Nordic公司的特选
[物联网]
S3c2440如何利用JLINK烧写U-boot到NAND Flash
很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bootloader给删除了,这时候开发板上电后由于没有bootloader,硬件没有被初始化,在NAND Flash中的操作系统也就无法被加载,开发板成“砖”了,这时候笔记本又无法利用JTag烧写程序进Nand Flash。起始这些可以利用JLink通过两种
[单片机]
Nordic Thingy: 52 IoT传感器套件荣获全球“年度电子创意奖”
威奥斯陆– 2018年1月5日 – Nordic Semiconductor宣布Nordic Thingy:52物联网(IoT)传感器套件已获“年度创意电子奖”(ACE) 评委评选为竞争激烈的“开发套件”类别获奖者。ACE大奖是著名奖项,表彰业界最具创新性的电子产品,颁奖活动在美国加利福尼亚州硅谷与嵌入式系统大会一起举办。 Nordic Thingy:52是基于Nordic nRF52832低功耗蓝牙(Bluetooth® Low Energy / Bluetooth LE)系统级芯片(SoC)和S132 协议栈(RF软件协议)的IoT无线传感器项目开发套件,使得不具备固件编程专业知识或高级开发工具的应用开发人员也能够快速设
[传感器]
<font color='red'>Nor</font>dic Thingy: 52 IoT传感器套件荣获全球“年度电子创意奖”
Nordic:让智能硬件和终端连接更快更简单
你有没有注意到,最近身边越来越多的朋友加入到“占领封面”的游戏中,占领封面者自豪得意,没有占领者遗憾失意,想必大家都知道我在说什么,这不是一款正式的游戏,但却和游戏有着高度相似的功效,这就是小米手环。小米手环作为一款火爆的可穿戴设备,8个月卖出400万件,而且一度喊出缺货,由此可见可穿戴市场已经迎来爆发式增长期,而将数据从硬件设备抛向网络的一个重要方式就是智能蓝牙。   随着可穿戴设备的发展,智能蓝牙在无线市场增长飞快,因此现有的单芯片蓝牙智能解决方案也受到极大的挑战,尤其在蓝牙技术联盟推出蓝牙4.2标准以后。为了满足新的需求,Nordic公司发布了nRF52832系统级芯片(SoC)器件。“nRF52832结合突破的性能和功效
[嵌入式]
ARM9_S3C2440学习(五)norflash启动,nandflash启动,SDRAM总结
S3C2440的启动时读取的第一条指令是在0x00上,分为成nand flash和nor flash上启动。 nand flash:适合大容量数据存储,类似硬盘; nor flash:适合小容量的程序或数据存储,类似小硬盘; sdram:主要用于程序执行时的程序存储、执行或计算,类似内存。 Nor flash的有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。 Nand flash是IO设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像nor
[单片机]
[Linux 底层]bootstrap移植裁剪及编译
bootstrap文件夹内容如下图: 在board/sama5d3_xplained目录下,有官方的默认配置文件 sama5d3_xplainednf_linux_uimage_dt_defconfig 从nandflash启动直接跳转到uimage类型内核阶段 sama5d3_xplainednf_linux_zimage_dt_defconfig 从nandflash启动直接跳转到zimage类型内核阶段 sama5d3_xplainednf_uboot_defconfig 从nandflash启动直接跳转到uboot阶段 sama5d3_xplainedsd_linux_uimage_dt_defconfig 从SD
[单片机]
[Linux 底层]bootstrap<font color='red'>移植</font>裁剪及编译
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved