ok6410 u-boot-2012.04.01移植六完善MLC NAND支持

发布者:qin199099最新更新时间:2023-05-31 来源: elecfans关键字:ok6410  u-boot  移植  MLC 手机看文章 扫描二维码
随时随地手机看文章

继ok6410 u-boot-2012.04.01移植四、五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的nand命令继续修改,最终实现通过网卡tftp程序到内存,接着通过NAND命令写到NAND。

开发环境:
系统:ubuntu 10.04.4
单板:ok6410
NAND FLASH:K9GAG08U0D 2048MB
NOR Flash:EN29LV160AB 2MB
DDR:K4X1G163PCX2 256MB
NET:DM9000AEP
编译器:arm-linux-gcc-4.3.2
搭建开发环境详见ubuntu 10.04.4开发环境配置。
目标:
1.板级初始化,支持单板ok6410
2.修改u-boot,支持NAND启动
3.增加菜单update功能
4.增加MLC NAND支持
5.支持DM9000,网卡下载程序
6.修改环境变量以及mtdpart分区
7.u-boot裁剪及制作补丁

一、配置K9GAG08U0D,支持MLC NAND

主要是在头文件中配置MLC NAND的PAGE_SIZE、BLOCK_SIZE、OOBSIZE等,这些在K9GAG08U0D的芯片手册中都能找到

修改includeconfigssmdk6410.h 主要是修改/* NAND configuration */配置,从上往下开始

#define CONFIG_SYS_NAND_U_BOOT_SIZE(512 * 1024)//(252 * 1024)/* Size of RAM U-Boot image   */

#define CONFIG_SYS_NAND_PAGE_SIZE4096//2048

#define CONFIG_SYS_NAND_BLOCK_SIZE(512 * 1024)

#define CONFIG_SYS_NAND_PAGE_COUNT128

#define CONFIG_SYS_NAND_OOBSIZE218//64

二、根据nand命令修改

上一节使用SMDK6410 # nand write 0x50000000 0 0x80000,写成功后重启发现u-boot跑步起来,那就根据这个命令一步步往下修改。从cmd_nand.c开始分析

int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])//在这里面几乎实现了nand的所有命令,这里以分析nand write 为例

if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {//nand write 0x50000000 0 0x80000 

//在下面你会看到很多nand. write.e/write.jffs2之类的,以前总有人问这些命令区别,这里自己分析一下就知道了

ret = nand_write_skip_bad(nand, off, &rwsize,  (u_char *)addr, 0);
rval = nand_write (nand, offset, length, buffer);

ret = nand_do_write_ops(mtd, to, &chip->ops);

ret = chip->write_page(mtd, chip, wbuf, page, cached,
      (ops->mode == MTD_OOB_RAW)); //chip->write_page = nand_write_page;

static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
  const uint8_t *buf, int page, int cached, int raw)

nand write大概流程就这样,下面重点修改代码。其实有个很重要的问题,在s3c6410手册有提到6410中nand里面的最开始的前4页,NAND pagesize刚好2K没关系,如果pagesize大于2K就需要注意,因为前4页不管pagesize多大,每页只能写头2K的数据,意识到这个问题就好改了。下面修改代码drivers/mtd/nand/nand_base.c

在static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,struct mtd_oob_ops *ops)增加如下宏定义

#if defined(CONFIG_NAND_BL1_8BIT_ECC) && (defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430) || defined(CONFIG_S3C2450) || defined(CONFIG_S3C2416))
if (page < 16) {
s3c_nand_read_page_8bit(mtd, chip, bufpoi);
} else {
if (unlikely(ops->mode == MTD_OOB_RAW))
ret = chip->ecc.read_page_raw(mtd, chip, bufpoi);
else
ret = chip->ecc.read_page(mtd, chip, bufpoi);
}
#else
/* Now read the page into the buffer */
if (unlikely(ops->mode == MTD_OOB_RAW))
ret = chip->ecc.read_page_raw(mtd, chip,
     bufpoi, page);
else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
ret = chip->ecc.read_subpage(mtd, chip,
col, bytes, bufpoi);
else{
//printf ("chip->ecc.read_page started:ret = %d page = %d bytes = %dn",ret,page,bytes);//add test
ret = chip->ecc.read_page(mtd, chip, bufpoi,
 page);
//printf ("chip->ecc.read_page finishedn");//add test
}
//printf ("ret value:%dn",ret);//add test
#endif

同时在smdk6410.h38:增加

 #define CONFIG_S3C64101/* in a SAMSUNG S3C6400 SoC     */
 #define CONFIG_SMDK64101/* on a SAMSUNG SMDK6400 Board  */
修改static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,  const uint8_t *buf, int page, int cached, int raw)//增加宏

#if defined(CONFIG_NAND_BL1_8BIT_ECC) && (defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430) || defined(CONFIG_S3C2450) || defined(CONFIG_S3C2416))
memset(chip->oob_poi, 0xff, mtd->oobsize);


if (page < 16) {
s3c_nand_write_page_8bit(mtd, chip, buf);
} else {
if (unlikely(raw))
chip->ecc.write_page_raw(mtd, chip, buf);
else
chip->ecc.write_page(mtd, chip, buf);
}
#else


if (unlikely(raw))
chip->ecc.write_page_raw(mtd, chip, buf);
else
chip->ecc.write_page(mtd, chip, buf);
#endif

接着重点来了修改static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,struct mtd_oob_ops *ops)

if (!writelen)
break; //在后面添加

column = 0;
//buf += bytes;
if (page <4)
{
buf +=(bytes/2);
printf("page = %dn",page);
printf("buf = %dn",buf);
}
else
buf += bytes;
realpage++;
//下面不变
page = realpage & chip->pagemask;
/* Check, if we cross a chip boundary */
if (!page) {
chipnr++;
chip->select_chip(mtd, -1);
chip->select_chip(mtd, chipnr);
}     

先编译试试,不行再修改。

三、编译、测试

change@change:/si/OK6410/u-boot-2012.04.01$ make

编译OK。下面测试程序,还是老方法烧·程序。将上面生成的u-boot.bin拷到sd卡,接着拨到sd卡启动

U-Boot 1.1.6 (Dec 15 2010 - 09:02:39) for SMDK6410


****************************************
**    u-boot 1.1.6                    **
**    Updated for TE6410 Board        **
**    Version 1.0 (10-01-15)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************


CPU:     S3C6410 @532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    128 MB
Flash:   0 kB
NAND:    tmp = 29
select s3c_nand_oob_mlc_128
2048 MB 
SD/MMC:  1904 MB 
*** Warning - bad CRC or moviNAND, using default environment

In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  0 

NAND erase: device 0 whole chip
Skipping bad block at  0x00800000                                            
Skipping bad block at  0x0e400000                                            
Skipping bad block at  0x0e780000                                            
Skipping bad block at  0x13b80000                                            
Skipping bad block at  0x27a80000                                            
Skipping bad block at  0x7e280000                                            
Erasing at 0x7ff80000 -- 100% complete.
OK
reading u-boot.bin

228872 bytes read

NAND write: device 0 offset 0x0, size 0x100000
 1032192 bytes written: OK
reading zImage

** Unable to read "zImage" from mmc 0:1 **

烧写OK,拨到NAND启动,输出如下:

U-Boot 2012.04.01 (Jul 07 2013 - 22:54:07) for SMDK6400
SMDK6410 # 


CPU:     S3C6400@532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode) 
Board:   SMDK6400
DRAM:  128 MiB
WARNING: Caches not enabled
Flash: 0 KB
NAND:  select s3c_nand_oob_mlc_64
NAND_ECC_NONE selected by board driver. This is not recommended !!
2048 MiB
*** Warning - bad CRC, using default environment


In:    serial
Out:   serial
Err:   serial
Net:   dm9000
Hit any key to stop autoboot:  0 


##### Update menu for ok6410 #####
[g] get file, and write to nand flash 0 block
[b] Boot the system
[r] Reset the u-boot
[q] Quit from menu
Enter your selection: q
SMDK6410 # ping 192.168.1.109
dm9000 i/o: 0x18000000, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:0c:29:4d:e4:f4
could not establish link
Using dm9000 device
host 192.168.1.109 is alive
SMDK6410 # tftp 0x50000000 u-boot.bin
dm9000 i/o: 0x18000000, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:0c:29:4d:e4:f4
could not establish link
Using dm9000 device
TFTP from server 192.168.1.109; our IP address is 192.168.1.111
Filename 'u-boot.bin'.
Load address: 0x50000000
Loading: T T T T T 
Abort
SMDK6410 # tftp 0x50000000 u-boot.bin
dm9000 i/o: 0x18000000, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:0c:29:4d:e4:f4
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.109; our IP address is 192.168.1.111
Filename 'u-boot.bin'.
Load address: 0x50000000
Loading: ################
done
Bytes transferred = 228872 (37e08 hex)
SMDK6410 # nand erase 0 0x80000


NAND erase: device 0 offset 0x0, size 0x80000
Erasing at 0x0 -- 100% complete.
OK
SMDK6410 # nand write 0x50000000 0 0x80000


NAND write: device 0 offset 0x0, size 0x80000
page = 0
buf = 1342179328
page = 1
buf = 1342181376
page = 2
buf = 1342183424
page = 3
buf = 1342185472
 524288 bytes written: OK
SMDK6410 # reset
resetting ...


U-Boot 2012.04.01 (Jul 07 2013 - 22:54:07) for SMDK6400


CPU:     S3C6400@532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode) 
Board:   SMDK6400
DRAM:  128 MiB
WARNING: Caches not enabled
Flash: 0 KB
NAND:  select s3c_nand_oob_mlc_64
NAND_ECC_NONE selected by board driver. This is not recommended !!
2048 MiB
*** Warning - bad CRC, using default environment


In:    serial
Out:   serial
Err:   serial
Net:   dm9000
Hit any key to stop autoboot:  0 


##### Update menu for ok6410 #####
[g] get file, and write to nand flash 0 block
[b] Boot the system
[r] Reset the u-boot
[q] Quit from menu
Enter your selection: q
SMDK6410 # 

通过上面测试,将u-boot.bin通过tftp命令tftp 0x50000000 u-boot.bin放到内存,再用nand write 0x50000000 0 0x80000,烧写完毕重启,刚刚烧写的u-boot跑起来了。目的:通过网卡tftp程序到内存,接着通过NAND命令写到NAND实现。现在的u-boot还不够完善,下一步修改环境变量进一步完善移植的u-boot。


关键字:ok6410  u-boot  移植  MLC 引用地址:ok6410 u-boot-2012.04.01移植六完善MLC NAND支持

上一篇:详解NXP Cortex-M3加密设置
下一篇:mixer音量的设置:amixer小工具

推荐阅读最新更新时间:2024-11-02 11:18

RTThread完整版学习之操作系统移植
RTThread的一大特色就是有丰富免费的组件可以用,但是对于我这个初学者来说很难习惯它必须使用它的模板完成任务,而且在stm32也已经放弃了对标准库的支持,这让我这个一直使用标准库的菜鸟感到很是头大。但初学,还就得依葫芦画瓢,待练习的成熟了,再自己开发。本笔记参考参考的教程为bsp制作 第一步:是复制工程模板这 如果感觉这个比较慢可以 将这里面的仓库导入到gitee中,这样就很快了。复制的时候是要将整个工程都复制的。如图所示 标红框框的这几个是比较重要的,主要修改的文件夹是bsp文件夹,在bsp(板级支持包)中RT-Thread已经给我么做了好多的例程,但是有时候需要自己建立一个属于自己的板级支持包,所以过程还是要掌握的。我
[单片机]
RTThread完整版学习之操作系统<font color='red'>移植</font>
移植u-boot 1.1.6到TQ2440开发板-第四阶段
上一阶段完成了对Nor Flash的配置,这一阶段主要完成对Nand Flash的读写驱动 移植u-boot 1.1.6到TQ2440开发板-第四阶段 增加Nand Flash的读写驱动 任务:移植nand- flash 驱动,让u - boot 可以操作读写nand flash 。由于s3c2410 和s3c2440 nand flash 控制器有区别,所以修改以下代码,让u - boot可以操作读写nand flash 。 1、增加nand_flash.c 文件:cpu/arm920t/s3c24x0/nand_flash.c #include #if (CONFIG_COMMANDS & CFG_CMD_
[单片机]
μC/OS-III在S12X架构上的移植
引言 S12X架构是飞思卡尔公司推出的16位CPU,占有一定的单片机应用市场。μC/OS—III是.Micrium公司推出的一款实时操作系统(RTOS),它的前身——μC/OS—II,由于源码公开、实时性好、便于学习等优点,应用非常广泛,并被移植到了几乎所有主流的CPU架构上。但是到目前为止,μC/OS—III在S12X架构上还没有官方的移植版本。 μC/OS-III相比μC/OS—II作了很大的改进,整个内核基本被重写。任务的数量可无限多,只受限于系统存储器的大小;由于支持时间片轮转调度,任务的优先级可以相同;采用了延迟中断处理机制(deferred post),中断服务所要访问的全局变量数变得很少,使得大部分临界代码的
[单片机]
μC/OS-III在S12X架构上的<font color='red'>移植</font>
OK6410光盘里的uboot不能用TFTP下载文件
无论用ping命令还是tftp命令,都显示 CS8900 Ethernet chip not found?! 看了uboot1.1.6/include/configs/smdk6410.h,里面确实是配置为网卡使用CS8900,什么时候发布个配置为DM9000的uboot源码啊?或者发个补丁也行 此问题已解决 方法很简单,给用飞凌S3C6410的朋友一个参考。   a.用\u-boot-1.1.6-TQ6410\drivers\目录下的dm9000x.c和dm9000x.h替换OK6410的u-boot里的同名文件   b.用\u-boot-1.1.6-TQ6410\include\configs\tq6410.h里配置网卡的几行
[单片机]
四大FPGA供应商专家谈FPGA设计诀窍
Actel、Altera、Lattice Semiconductor和Xilinx是目前业界最主要的四大FPGA供应商,为了帮助中国的应用开发工程师更深入地了解FPGA的具体设计诀窍,我们特别邀请到了Altera系统应用工程部总监Greg Steinke、Xilinx综合方法经理Frederic Rivoallon、Xilinx高级技术市场工程师Philippe Garrault、Xilinx产品应用工程部高级经理Chris Stinson、Xilinx IP解决方案工程部总监Mike Frasier、Lattice Semiconductor应用工程部总监Bertrand Leigh和软件产品规划经理Mike Kendrick、A
[嵌入式]
S3C6410嵌入式应用平台构建(六)——linux-3.14.4移植到OK6410-(Yaffs2文件制作)
本文主要讲怎用利用yaffs2工具和busybox制作yaffs2文件系统镜像。大多数都是参照网上的,目的在于记录学习,不做任何用途。 一、制作mkyaffs2image工具 进入yaffs2源码目录下utils目录,修改mkyaff2image.c,做如下修改: // Adjust these to match your NAND LAYOUT: #if 0 #define chunkSize 2048 #define spareSize 64 #define pagesPerBlock 64 #else #define chunkSize 4096 #define spareSize 218 #defin
[单片机]
FreeModbus 移植于STM32 实现Modbus RTU通信
毕业设计自己要做个基于STM32的PLC能直接跑语句表的,现在看来好像没有什么创新的地方,不过实现的方式绝对够创新的了...呵呵。自己写的开题报告中说了要有高级的通信功能。现在做以太网有点来不及了,CAN又感觉不搭调,硬件上也没准备。串口上跑Modbus感觉不错。本来西门子的S7-200就能跑Modbus,STM32-PLC当然也要支持Modbus 什么 组态软件,触摸屏都可以连上,不过FreeModbus只支持从机有点可惜,当然本来协议也不难而且也必要实现全协议栈。 Modbus中文协议.PDF STM32移植FreeModbus的步骤: 首先去 http://www.freemodbus.org 下载文件 一定要是
[单片机]
FreeModbus <font color='red'>移植</font>于STM32 实现Modbus RTU通信
如何才能移植一个AC6例子到STM32CubeIDE
本附录中使用的示例是DataLogTerminal,位于:STM32CubeExpansion_MEMS1_V7.1.0ProjectsSTM32L476RG-NucleoExamplesIKS01A2DataLogTerminal 信息 STM32CubeExpansion_MEMS1_V7.1.0 是X-CUBE-MEMS的摘录。随着时间的推移,可能会从同一链接获得此软件包的更新版本。 警告 建议把包放在C:下,以免后面编译出错(因为路径太长) 2.1硬件说明↑ X-NUCLEO-IKS01A2 [3]是一款用于 STM32 64 引脚 Nucleo 的运动 MEMS 和环境传感器扩展板。它通过 I²C 总线引脚与 N
[单片机]
如何才能<font color='red'>移植</font>一个AC6例子到STM32CubeIDE
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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