u-boot-1.3.4移植到s3c2440之nand驱动

发布者:WhisperingWaves最新更新时间:2024-07-25 来源: cnblogs关键字:u-boot  移植  s3c2440  nand驱动 手机看文章 扫描二维码
随时随地手机看文章

折腾了两个晚上,终于把s3c2440板子上的nand驱动搞定了,把需要注意的地方记下来,供大家参考。


这次使用的u-boot版本为1.3.4,现在还没有加上从nand启动的部分,现在使用从sdram启动的方式,修改好nand驱动后,现在环境变量可以存放到nand中,具体要修改的地方如下:


1、板子配置头文件

在板子的配置头文件中要加入如下代码:


.......................................................


#define CONFIG_CMD_NAND

#define CFG_ENV_IS_IN_NAND 1

#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */

#define CFG_ENV_OFFSET 0x30000


#define CFG_MAX_NAND_DEVICE 1

#define CFG_NAND_BASE 0x4E000000


..........................................................


2、修改cpu/arm920t/s3c24x0/nand.c文件

2.1、修改寄存器相关宏定义

把该文件的头部定义的一些宏做如下修改:


#define __REGb(x) (*(volatile unsigned char *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x))


#define NF_BASE 0x4e000000

#define NFCONF __REGi(NF_BASE + 0x0)

#define NFCONT __REGi(NF_BASE + 0x04)

#define NFCMD __REGb(NF_BASE + 0x08)

#define NFADDR __REGb(NF_BASE + 0x0C)

#define NFDATA __REGb(NF_BASE + 0x10)

#define NFSTAT __REGb(NF_BASE + 0x20)


#define S3C2410_NFCONF_EN (1<<1)

#define S3C2410_NFCONF_512BYTE (1<<14)

#define S3C2410_NFCONF_4STEP (1<<13)

#define S3C2410_NFCONF_INITECC (1<<12)

#define S3C2410_NFCONF_nFCE (1<<1)

#define S3C2410_NFCONF_TACLS(x) ((x)<<12)

#define S3C2410_NFCONF_TWRPH0(x) ((x)<<8)

#define S3C2410_NFCONF_TWRPH1(x) ((x)<<4)


修改完成后的代码如上。这里主要是由于2440与2410的nand控制器寄存器有一定的区别。

2.2、修改s3c2410_hwcontrol函数

s3c2410_hwcontrol函数修改后的代码如下:



static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd)

{

    struct nand_chip *chip = mtd->priv;


    DEBUGN('hwcontrol(): 0x%02x: ', cmd);


    switch (cmd) {

    case NAND_CTL_SETNCE:

        NFCONT &= ~S3C2410_NFCONF_nFCE;

        DEBUGN('NFCONF=0x%08xn', NFCONF);

        break;


    case NAND_CTL_CLRNCE:

        NFCONT |= S3C2410_NFCONF_nFCE;

        DEBUGN('NFCONF=0x%08xn', NFCONF);

        break;


    case NAND_CTL_SETALE:

        chip->IO_ADDR_W = NF_BASE + 0xc;

        DEBUGN('SETALEn');

        break;


    case NAND_CTL_SETCLE:

        chip->IO_ADDR_W = NF_BASE + 0x8;

        DEBUGN('SETCLEn');

        break;


    default:

        chip->IO_ADDR_W = NF_BASE + 0x10;

        break;

    }

    return;

}


这里做修改也是因为2410与2440的nand控制器寄存器定义存在差别。

2.3、修改board_nand_init函数

这个函数是初始化nand的时候调用,修改后的代码如下:


int board_nand_init(struct nand_chip *nand)

{

    u_int32_t cfg;

    u_int8_t tacls, twrph0, twrph1;

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();


    DEBUGN('board_nand_init()n');


    clk_power->CLKCON |= (1 << 4);


    /* initialize hardware */

    twrph0 = 7; twrph1 = 7; tacls = 7;


    cfg |= S3C2410_NFCONF_TACLS(tacls);

    cfg |= S3C2410_NFCONF_TWRPH0(twrph0);

    cfg |= S3C2410_NFCONF_TWRPH1(twrph1);


    NFCONF = cfg;

    NFCONT = (1 << 4) | (1 << 0);

    NFSTAT = 6;


    /* initialize nand_chip data structure */

    nand->IO_ADDR_R = nand->IO_ADDR_W = 0x4e000010;


    /* read_buf and write_buf are default */

    /* read_byte and write_byte are default */


    /* hwcontrol always must be implemented */

    nand->hwcontrol = s3c2410_hwcontrol;


    nand->dev_ready = s3c2410_dev_ready;

#ifdef CONFIG_S3C2410_NAND_HWECC

    nand->enable_hwecc = s3c2410_nand_enable_hwecc;

    nand->calculate_ecc = s3c2410_nand_calculate_ecc;

    nand->correct_data = s3c2410_nand_correct_data;

    nand->eccmode = NAND_ECC_HW3_512;

#else

    nand->eccmode = NAND_ECC_SOFT;

#endif


#ifdef CONFIG_S3C2410_NAND_BBT

    nand->options = NAND_USE_FLASH_BBT;

#else

    nand->options = 0;

#endif


    DEBUGN('end of nand_initn');


    return 0;

}


到这里,nand.c文件就修改完成了。

3、修改include/s3c24x0.h文件

该文件中修改S3C2410_NAND结构体定义如下:


typedef struct {

    S3C24X0_REG32 NFCONF;

    S3C24X0_REG32 NFCONT;

    S3C24X0_REG32 NFCMD;

    S3C24X0_REG32 NFADDR;

    S3C24X0_REG32 NFDATA;

    S3C24X0_REG32 NFMECC0;

    S3C24X0_REG32 NFMECC1;

    S3C24X0_REG32 NFSECC;

    S3C24X0_REG32 NFSTAT;

    S3C24X0_REG32 NFESTAT0;

    S3C24X0_REG32 NFESTAT1;

    S3C24X0_REG32 NFECC;

} /*__attribute__((__packed__))*/ S3C2410_NAND;



到此为止,支持nand的代码就修改完成了。


关键字:u-boot  移植  s3c2440  nand驱动 引用地址:u-boot-1.3.4移植到s3c2440之nand驱动

上一篇:S3C2440 初始化时钟
下一篇:有关i2c的问题总结

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

4G无线移植向灵活的下一代高性能无线网络发展
近期,苹果公司iPhone和智能手机等新型移动产品以及低成本笔记本、上网本的推出,大大扩展了无线数据的用途。因此,市场对增强型服务的需求不断攀升,促使大批用户从简单的语音设备需求向丰富媒体和位置感知服务方向转型。 增强型服务的发展为创新技术领先公司和用户都带来了巨大机遇,当然在这些机遇的背后还同时伴随着大量技术挑战。部署和维护基础设施的挑战使资本支出和运营开支不断增加,这会降低运营商的投资回报率。其实,相关技术从2G到3G网络转型时就发生过这种问题,这种情况非常不利于运营商升级基础设施。随着3G向数据传输速率可达到50 Mb/s乃至100 Mb/s的长期演进(LTE)技术转型,上述问题仍将继续存在。因此我们非常有必要
[网络通信]
软体开发者成功将Android 4.0移植到TouchPad
    最近有一个软体开发者成功将 Android 4.0 版(Ice Cream Sandwich),在惠普(HP)已经停产的 TouchPad 平板装置上执行。惠普是在今年夏天宣布停产该款平板装置,并以99美元的超低价出清存货,让有心人动脑筋想把这款装置变身为低价Android平板。     但是要在 TouchPad 上执行 Android 是个大工程,虽然有人开发出CyanogenMod 7 Alphas,也能在该装置上执行,但仍有一些音讯与 Wi-Fi 功能上的问题。最新的成果则是将Android 4.0移植到 TouchPad,虽然执行稳定度不如CyanogenMod 7 Alphas,但却让广大玩家颇感兴奋,各相关技术
[手机便携]
基于μc/OS-II的多传感器测控系统研究
1  引言    随着嵌入式系统的广泛应用,原来单一传感器的嵌入式系统逐渐向嵌入式多传感器系统发展。由此提出了多传感器任务调度分配的问题。本文结合红薯保鲜储藏工程涉及到的温度湿度氧浓度等参数要求,采用高性能16位单片机SPCE061A作为控制芯片,移植可裁剪的多任务实时操作系统μc/OS-II管理多任务的处理,选用高精度温度传感器DS18B20、湿度传感器HIH3605、氧浓度传感器DW-02构建了一个高精度高性能高可靠性的多传感器嵌入式测控系统,各个被控参数可调范围宽,较好的满足了工程要求。系统的主要参数:工作温度:10~14℃±0.5℃;工作湿度:80~95%RH±5%;氧浓度:≮4.5%。同时,实现了温湿度数据的显示与保
[嵌入式]
u-boot-2009.08在mini2440上的移植(四)---增加DM9000驱动
移植环境 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 6,参考文章: http://blogold.chinaunix.net/u3/101649/showart.php?id=2105215 http://blog.chinaunix.net/space.php?uid=23787856&do=blog&id=1153
[单片机]
移植Linux-3.4.2到TQ2440上
开发环境 主机开发环境:ubuntu12.04 BootLoader:u-boot-2012.04.01 kernel:linux-3.4.2 CPU:s3c2440 开发板:TQ2440 步骤 之前已经移植过linux-2.6.30.4内核,这次尝试移植更高版本的内核Linux-3.4.2 1、内核源码下载 下载地址:内核下载地址 拷贝到虚拟机里,解压内核 tar -jxvf linux-3.4.2.tar.bz2 2、在系统中添加对ARM的支持 3、修改平台输入时钟 不修改的话会出现启动内核会出现乱码 在内核源码中找到对应的单板文件为archarmmach-s3c24xxmach-smdk2440.c文件,
[单片机]
<font color='red'>移植</font>Linux-3.4.2到TQ2440上
s3c2440裸机-LCD编程(二、LCD控制器)
1.LCD控制器框图 从上图看出,S3C2440 LCD控制器用于传输视频数据并且生成必要的控制信号,如VFRAME,VLINE,VCLK,VM等。除了控制信号,S3C2440还有视频数据端口,即VD 。通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD 数据总线上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。 REGBANK:具有17个可编程寄存器组和256x16调色板存储器,用于配置LCD控制器。 TIMEGEN:产生控制信号,例如 VSYNC、HSYNC、VCLK等信号 LCDCDMA:可以自动从FrameBuff中
[单片机]
<font color='red'>s3c2440</font>裸机-LCD编程(二、LCD控制器)
移植STM32固件库到IAR
作为嵌入式软件工程师应该有良好的习惯,建project应该层次清晰。 1. 建立一个文件夹用于存放工程,命名为GPIO 2. 打开GPIO文件夹,创建一个子文件夹project(用于存放与工程相关的文件),再创建一个readme.txt(用于对工程的说明,比如说硬件环境和功能) 3. 将ST公司提供的固件库:FWLb中library拷贝到GPIO目录中 4. 打开project,再创建一个文件夹EWARM(存放和开发环境密切相关的内容) 5. 打开STM32固件库:STM32F10xFWLib\FWLib\examples\GPIO\Example1(自己到ST官网上下载) 6. 复制
[单片机]
<font color='red'>移植</font>STM32固件库到IAR
S3C2440 Windows CE的RTC模块驱动设计与实现
引言   桌面Windows系统的时间显示功能已为大家所熟知,它是通过BIOS上的时钟模块实现的。用户通过点击桌面系统任务栏右下脚的时间,可以修改当前时间、时区以及实现与Internet时间同步等功能。      目前流行的手机、PDA、HMI(人机接口设备)等嵌入式系统中,都大量移植了微软的Windows CE操作系统。虽然WinCE系统也实现了时间显示,但是在具体的实现中,其原理和方法与桌面系统大不相同,即使是基于不同嵌入式硬件平台的WinCE开发,也有所不同。由于嵌入式系统的复杂性、分散性,目前嵌入式系统的实时时钟RTC功能的实现,大部分是在基于内嵌于SoC处理器的RTC功能IP模块的基础上,通过软件驱动实现的。   
[单片机]
<font color='red'>S3C2440</font> Windows CE的RTC模块<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