U-Boot-2011.03移植nandflash到mini2440

发布者:TranquilDreamer最新更新时间:2024-06-24 来源: elecfans关键字:U-Boot  移植  nandflash  mini2440 手机看文章 扫描二维码
随时随地手机看文章

u-boot2011.03支持s3c2440,寄存器在arch/arm/includer/asm/目录下s3c24x0_cpu.h中定义。

代码中包含了s3c2410读写nandflash函数,因此在s3c2410基础上进行修改

U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

建一个s3c2440_nand.c文件

cd   drivers/mtd/nand/
cp     s3c2410_nand.c   s3c2440_nand.c
代码如下
寄存器操作说明:
readl函数原型
#define   readl(addr)       (*(volatile unsigned int*)(addr))
writeb函数原型
#define   writel(b,addr)          ((*(volatile unsigned int *) (addr)) = (b))
 
 
#include
#include
#include
#include
 
#define S3C2440_NFCONT_EN          (1<<0)
#define S3C2440_NFCONT_nFCE        (0<<1)
#define S3C2440_NFCONT_INITECC      (1<<4)
#define S3C2440_NFCONF_TACLS(x)    ((x)<<12)
#define S3C2440_NFCONF_TWRPH0(x)   ((x)<<8)
#define S3C2440_NFCONF_TWRPH1(x)   ((x)<<4)
 
#define S3C2440_ADDR_NALE 0x0c
#define S3C2440_ADDR_NCLE 0x08
 
#ifdef CONFIG_NAND_SPL
 
/* in the early stage of NAND flash booting, printf() is not available */
#define printf(fmt, args...)
 
static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
         int i;
         struct nand_chip *this = mtd->priv;
 
         for (i = 0; i < len; i++)
                   buf[i] = readb(this->IO_ADDR_R);
}
#endif
 
static void s3c2440_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
         struct nand_chip *chip = mtd->priv;
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
 
         debugX(1, 'hwcontrol(): 0x%02x 0x%02xn', cmd, ctrl);
 
         if (ctrl & NAND_CTRL_CHANGE) {
                   ulong IO_ADDR_W = (ulong)nand;
 
                   if (!(ctrl & NAND_CLE))
                            IO_ADDR_W |= S3C2440_ADDR_NALE;
                   if (!(ctrl & NAND_ALE))
                            IO_ADDR_W |= S3C2440_ADDR_NCLE;//特别注意修改
                   chip->IO_ADDR_W = (void *)IO_ADDR_W;
 
                   if (ctrl & NAND_NCE)
                            writel(readl(&nand->nfcont) & (~(1<<1)),
                                   &nand->nfcont);
                   else
                            writel(readl(&nand->nfcont) | (1<<1),
                                   &nand->nfcont);
         }
 
         if (cmd != NAND_CMD_NONE)
                   writeb(cmd, chip->IO_ADDR_W);
}
 
static int s3c2440_dev_ready(struct mtd_info *mtd)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         debugX(1, 'dev_readyn');
         return readl(&nand->nfstat) & 0x01;
}
 
#ifdef CONFIG_S3C2440_NAND_HWECC
void s3c2440_nand_enable_hwecc(struct mtd_info *mtd, int mode)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         debugX(1, 's3c2440_nand_enable_hwecc(%p, %d)n', mtd, mode);
         writel(readl(&nand->nfconf) | S3C2440_NFCONF_INITECC, &nand->nfconf);
}
 
static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         ecc_code[0] = readb(&nand->nfecc);
         ecc_code[1] = readb(&nand->nfecc + 1);
         ecc_code[2] = readb(&nand->nfecc + 2);
         debugX(1, 's3c2440_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02xn',
                mtd , ecc_code[0], ecc_code[1], ecc_code[2]);
 
         return 0;
}
 
static int s3c2440_nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc)
{
         if (read_ecc[0] == calc_ecc[0] &&
             read_ecc[1] == calc_ecc[1] &&
             read_ecc[2] == calc_ecc[2])
                   return 0;
 
         printf('s3c2440_nand_correct_data: not implementedn');
         return -1;
}
#endif
int board_nand_init(struct nand_chip *nand)
{
         u_int32_t cfg;
         u_int8_t tacls, twrph0, twrph1;
         struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
         struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();
         debugX(1, 'board_nand_init()n');
         writel(readl(&clk_power->clkcon) | (1 << 4), &clk_power->clkcon);
         /* 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 = S3C2440_NFCONF_TACLS(tacls - 1);
         cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
         cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
         writel(cfg, &nand_reg->nfconf);
 
         cfg = S3C2440_NFCONT_EN;
         cfg |= S3C2440_NFCONT_nFCE;
         cfg |= S3C2440_NFCONT_INITECC;
         writel(cfg, &nand_reg->nfcont);
         /* initialize nand_chip data structure */
         nand->IO_ADDR_R = (void *)&nand_reg->nfdata;
         nand->IO_ADDR_W = (void *)&nand_reg->nfdata;
 
         nand->select_chip = NULL;
 
         /* read_buf and write_buf are default */
         /* read_byte and write_byte are default */
#ifdef CONFIG_NAND_SPL
         nand->read_buf = nand_read_buf;
#endif
 
         /* hwcontrol always must be implemented */
         nand->cmd_ctrl = s3c2440_hwcontrol;
         nand->dev_ready = s3c2440_dev_ready;
 
#ifdef CONFIG_S3C2440_NAND_HWECC
         nand->ecc.hwctl = s3c2440_nand_enable_hwecc;
         nand->ecc.calculate = s3c2440_nand_calculate_ecc;
         nand->ecc.correct = s3c2440_nand_correct_data;
         nand->ecc.mode = NAND_ECC_HW;
         nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
         nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
#else
         nand->ecc.mode = NAND_ECC_SOFT;
#endif
#ifdef CONFIG_S3C2440_NAND_BBT
         nand->options = NAND_USE_FLASH_BBT;
#else
         nand->options = 0;
#endif
         debugX(1, 'end of nand_initn');
         return 0;
}
再在include/configs/mini2440.h中添加
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE    0x4E000000
#define CONFIG_MTD_DEVICE
#define CONFIG_CMD_NAND
 
 
编译好后使用supervivi   的d命令下载到sdram的0x33f80000地指出执行
U-Boot 2011.03 (Nov 29 2011 - 09:21:34)
DRAM:  64 MiB
Flash:   2 MiB
NAND:  256 MiB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
mini2440 # nand info
Device 0: nand0, sector size 128 KiB
mini2440 #
mini2440已经能够很好的支持nand flash

[1] [2]
关键字:U-Boot  移植  nandflash  mini2440 引用地址:U-Boot-2011.03移植nandflash到mini2440

上一篇:mini2440 驱动ds18b20
下一篇:QT_MPlayer移植到mini2440

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

μC/OS-Ⅱ在微处理器LH79520上的移植方案
随着科技的发展,嵌入式系统的应用越来越广泛,为了进行射频功率校准系统的嵌入式软件开发,需要将嵌入式实时操作系统μC/OS -Ⅱ移植到sharp lh79520 微处理器 上。分析了嵌入式实时操作系统μC/OS-Ⅱ的代码结构,接着,对目前流行的嵌入式微处理器sharp lh795 20的特点进行了说明,详细介绍了μC/OS-Ⅱ在sharp lh79520处理器上的移植过程,特别对OS_CPU_A.ASM文件的修改给出了详细的移植代码,最后对移植的代码进行了严格的测试,结果表明移植后的μC/OS-Ⅱ操作系统内核运行稳定可靠,验证了移植的成功。 在嵌入式操作系统领域,Jean J.Labrosse开发的μC/OS,由于开放源
[单片机]
μC/OS-Ⅱ在微处理器LH79520上的<font color='red'>移植</font>方案
U-Boot移植(2)修改SDRAM的配置
接着上面的。。 5、从查资料后,可知,BANK6的设置:位宽为32,宏B6_BWSCON刚好为DW32,无需改变。 由于我所用的开发板的HCLK都设为100MHZ,需要根据SDRAM芯片的具体参数重新计算REFCNT寄存器的值。 BANK6对应SDRAM B6_BWSCON 可以看到我已经修改成新的值。。。 对于其它的BANK,比如网卡芯片DM9000所在的BANK4,原来设置刚好匹配,无需更改; 而对于其它的BANK1,BANK2,BANK3,BANK5,BANK7,在U-Boot中并没有使用到它们外接设备,也无需理会。
[单片机]
<font color='red'>U-Boot</font><font color='red'>移植</font>(2)修改SDRAM的配置
uCosII移植到STM32触发中断、任务切换的汇编学习
STM32汇编关键字含义: IMPORT OSxx ;//IMPORT声明了OSxx在外文件定义 EXPORT OSxx ;//EXPORT声明OSxx可以被外文件使用,相当于全局性声明 LDR R0,=label ;//这是ARM的RISC指令下一个用于内存和CPU寄存器交换数据的指令,用法比较复杂。具体百度。 ;//这里的含义就是把label的地址值赋值给R0,和 LDR R0,label 不同,没有'='的是取其地址的值传递给R0 ;// LDR R0,label ;//取label其地址的值传递给R0 LDR?R0,0x12345678 ;//就是把0x12345678这个地址中的值存放到r0
[单片机]
U-Boot-1.1.6移植MINI2440开发板(2) —— S3C2440相关修改
前面已经大致了解了U-Boot的编译流程,下面开始移植。 (没有找到知乎的代码高亮功能。。。) 开始移植: 首先修改顶层Makefile: 添加u-boot.dis的支持,有助于后续的分析(添加$(obj)u-boot.dis): ------- Makefile------- 239 ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $(U_BOOT_NAND) 添加mini2440_config: ------- Makefile------- 1882 mini2440_config : uncon
[单片机]
嵌入式实时操作系统Nucleus PLUS在S3C2410A上移植的实现
引言 Nucleus PLUS是美国ATI 公司为实时性要求较高的嵌入式系统应用设计的操作系统内核。约95%的Nucleus PLUS代码用ANSI C语言编写,因此,非常便于移植并能够支持大多数类型的微处理器,如X86、68K、PowerPC、MIPS、ARM等。经过截减编译后,Nucleus PLUS 核心代码区一般不超过20KB大小。 同时提供TCP/IP网络、图形界面Grafix、文件系统File等模块。还有一个特点就是免费提供源代码,有利于节省开发费用。 S3C2410A是三星公司推出的基于ARM920T内核高性能低功耗16/32位RISC微控制器,内部集成了丰富的系统外围控制器。配合Nucleus PLUS操作系统可
[应用]
OK6410A 开发板 (八) 7 linux-5.11 OK6410A usb camera移植
代码 : https://github.com/lisider/linux/tree/ok6410a-linux-5.11 提交id : 0cf53aa024fbd417f0796a77ff7f9b891680dac8 defconfig : arch/arm/configs/ok6410A_sdboot_mini_net_lcd_x11_usb_debug_uvc_defconfig 用户空间代码 uvc_cam_test Makefile CROSS_COMPILE =arm-none-linux-gnueabi- KERNELDIR = CFLAGS = -I$(KERNELDIR)/include -O -Wa
[单片机]
OK6410A 开发板 (三) 20 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 system clock
system clock 的设置 主要参与的寄存器 归属 3 SYSTEM CONTROLLER 范围 0x7E00_F000 0x7E00_FFFF S3C6410的时钟 |---APLL---------ARMCLK --- 用于 CPU | 外部晶振(XTIPLL)+内部的OSC(振荡器) | 0 | |----HCLK --- 用于 AXI/AHB 总线外设 |---OM --- 主时钟 ---- |---MPLL----| 外部时钟(EXTCLK) | 1 | |----PCLK --- 用于 APB 总线外设
[单片机]
OK6410A 开发板 (三) 20 u-boot-2021.01 boot 解析 <font color='red'>U-boot</font> 镜像运行部分 system clock
015_STM32程序移植之_NRF24L01模块
引脚接线图如下所示 STM32引脚 NRF24L01引脚 功能 GND GND 3.3V 3.3V PB8 CE PB9 CSN PB13 SCK PB15 MOSI PB14 MISO PB12 IRQ STM32引脚 CH340引脚 GND GND 3.3V 3.3V TXD RXD RXD TXD NRF24L01分为主从,就是一个发送一个接受,两个的接线图都是按照上面的来进行接线 移植程序 移植成功发送程序之后进行复制成为接受程序,并更改main.C就行了 将
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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