S3C2440 Linux驱动移植——NAND驱动

发布者:自由探索最新更新时间:2016-04-08 来源: eefocus关键字:S3C2440  Linux  驱动移植  NAND驱动 手机看文章 扫描二维码
随时随地手机看文章

1.  修改分区表

打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition结构体数组。

修改后如下:

 

[cpp] view plaincopy
 
  1. static struct mtd_partition smdk_default_nand_part[]  
  2.     [0]  
  3.         .name   "Uboot",  
  4.         .size   0x00040000,  
  5.         .offset 0x00000000,  
  6.     },  
  7.     [1]  
  8.         .name   "Kernel",  
  9.         .offset 0x00200000,  
  10.         .size   0x00300000,  
  11.     },  
  12.     [2]  
  13.         .name   "filesystem",  
  14.         .offset 0x00500000,  
  15.         .size   MTDPART_SIZ_FULL,  
  16.      
[cpp] view plaincopy
 
  1. };  


TQ2440板上的NAND为256M,请根据你的NAND实际大小分配空间。

2. 修改NAND控制器参数

打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改smdk_nand_info结构体。

修改后如下:

[cpp] view plaincopy
 
  1. static struct s3c2410_platform_nand smdk_nand_info  
  2.     .tacls      0, //10,//20,  
  3.     .twrph0     21, //25,//60,  
  4.     .twrph1     5, //10,//20,  
  5.     .nr_sets    ARRAY_SIZE(smdk_nand_sets),  
  6.     .sets       smdk_nand_sets,  
  7. };  


这里的三个参数tacls,twrph0,和twrph1是如何给出的? 我们来分析下。

先看下这个结构体的定义,位于arch/arm/mach-s3c2410/include/mach/nand.h:

[cpp] view plaincopy
 
  1. struct s3c2410_platform_nand  
  2.       
  3.   
  4.     int tacls;    
  5.     int twrph0;   
  6.     int twrph1;   
  7.   
  8.     unsigned int    ignore_unset_ecc:1;  
  9.   
  10.     int         nr_sets;  
  11.     struct s3c2410_nand_set *sets;  
  12.   
  13.     void            (*select_chip)(struct s3c2410_nand_set *,  
  14.                            int chip);  
  15. };  


看到了对这三个参数的说明,这里提到了这三个参数的单位为纳秒,请注意。

那么这三个参数到底从哪来的呢? 它来自于S3C2440 nand 控制器的NFCONF控制器,如下:

 

 既然找到这三个参数的出处了,那么它们究竟是何含义呢?我们里看下:

 

这幅时序图同样来自S3C2440的datasheet。

通过这幅图和struct s3c2410_platform_nand中的注释,我们可以对这3个参数做出如下定义。

TACLS:表示在CLE/ALE拉高后,多少时间以后才允许将nWE拉低。

TWRPH0:表示nWE低电平持续的时间。

TWRPH1:表示nWE变为高电平后,多少时间后允许CLE/ALE拉低。

知道参数的意义后,我们来看下NAND芯片K9F1208U0C的datasheet来确定这3个参数的值。

 

从这个时序图,我们可以直观地看到twp对应着参数twrph0,而tclh对于着参数twrph1。

但是tacls如何得出呢?从图中并不能直接得出该参数的值,需要转个弯,那就是将tcls减去twp,就可以得到tacls了。

综上所述,为了得到nand控制器所需的3个参数,我们需要获得该nand芯片的3个时序参数:twp,tcls和tclh。

通过查找该nand的datasheet,3个时序参数的值如下:

twp=21, tcls=21, tclh=5。

将这3个时序参数转为我们需要的3个参数,单位为纳秒(ns):

tacls = tcls-twp = 21 - 21 = 0 ns

twrph0= twp = 21 ns

twrph1 = tclh = 5 ns

至此,就成功计算出三个参数的值了 

3. 配置内核

4. 验证

  在经过上述步骤后,编译内核并将内核少入nand,启动系统。在Linux的启动信息中,会有如下输出:

......

S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand: NAND hardware ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 781 at 0x0000061a0000
Bad eraseblock 1113 at 0x000008b20000
Bad eraseblock 1117 at 0x000008ba0000
Bad eraseblock 1481 at 0x00000b920000
Bad eraseblock 1566 at 0x00000c3c0000
Bad eraseblock 1885 at 0x00000eba0000
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "Uboot"
0x000000200000-0x000000500000 : "Kernel"
0x000000500000-0x000010000000 : "filesystem"

......

上述信息表明以成功访问了NAND FLASH。

这里,对第二行的输出进行个说明。

UBOOT启动将S3C2440的工作频率 FCLK:HCLK:PCLK = 8:4 :1,

而FCLK为400Mhz,那么HCLK为100Mhz,根据NFCONF寄存器的说明,寄存器中的这3个参数都跟HCLK有关,必须为1/HCLK的倍数,

也就是1/100MHz=10ns的倍数。

通过上面第二行的输出信息,Twrph0为 30ns而Twrph1为10ns,这是显而意见的。

由于参数必须为10ns的倍数,而且必须大于datasheet给出的值,因此向上取到10的倍数,也即5ns取到10ns,21ns取到30ns。

那么为什么Tacls是10ns呢?明明给出的是0ns,是不是驱动不允许参数为0ns?

在S3C2440的nand驱动中,参数的值是通过如下函数确定的:

[cpp] view plaincopy
 
  1. static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)  
  2.  
  3.     int result;  
  4.   
  5.     result DIV_ROUND_UP((wanted clk), NS_IN_KHZ);  
  6.   
  7.     pr_debug("result %d from %ld, %d\n", result, clk, wanted);  
  8.   
  9.     if (result max)  
  10.         printk("%d ns is too big for current clock rate %ld\n", wanted, clk);  
  11.         return -1;  
  12.      
  13.   
  14.     if (result 1)  
  15.         result 1;  
  16.   
  17.     return result;  
  18.  


参数wanted就是0(ns),而clk即为HCLK/1000。

DIV_ROUND_UP宏将返回0,但是if对result进行了限制,也就是不允许小于0,因此将参数值设置为1,并返回给调用函数。

关键字:S3C2440  Linux  驱动移植  NAND驱动 引用地址:S3C2440 Linux驱动移植——NAND驱动

上一篇:stm32的定时器输入捕获与输出比较
下一篇:关于3C2440 FCLK, HCLK, PCLK的关系

推荐阅读最新更新时间:2024-03-16 14:49

嵌入式操作系统休眠唤醒后自动运行程序的方法
为了提高系统的启动速度,通常采用基于休眠技术的方式来实现嵌入式系统的快速启动。例如,在一些数字电视中,采用休眠技术以后的启动时间要比原来的启动时间约快1/3。但基于休眠技术的启动方法有其不足之处:在保存内存内容时只能把内存中的信息以快照的形式保存到磁盘或其他外部存储设备,原来系统内某些正在运行的动态进程及进程本身的执行过程不能被完全保存下来,从而导致系统重新启动后此部分进程不能正常运行;基于休眠技术的启动方式一旦以快照的形式保存后其里面的内容将无法改动。基于此,本文运用一种新方法,实现了基于休眠的嵌入式操作系统启动后,可自动运行任何形式的目标脚本和应用程序。 1 休眠唤醒后程序自动运行的方法 最新的Linux2.6内核都支
[嵌入式]
嵌入式Linux下IC卡接口设计与驱动开发
引 言 随着现代工业社会逐步向信息社会的过渡,信息将扮演愈来愈重要的角色,成为现代经济生活中的成功要素。IC卡作为卡基应用系统中的一种卡型,是利用安装在卡中的集成电路(IC)来记录和传递信息的;具有存储量大、数据保密性好、抗干扰能力强、存储可靠、读写设备简单、操作速度快、脱机工作能力强等优点,其应用范围极为广泛。 我们基于公用电话IC卡的应用,开发了多媒体信息终端产品,在传统公用IC卡电话功能的基础上增加了上网、邮件、电子支付、信息浏览等各种多媒体功能,统一采用公用电话IC卡进行收费。目前设计的IC卡读写器和驱动软件已经应用于我们的多媒体终端产品中。 1 嵌入式Linux下设备驱动模块简介 Linux系统将设备分成三种
[嵌入式]
基于嵌入式CPU S3C2440的VGA显示系统设计
目前很多SOC厂商的微处理器芯片都集成了LCD控制器,如三星公司的S3C2410.S3C2440,Intel的Xscale系列等。大多数嵌入式系统也采用流行的LCD显示技术。但是在需要大屏幕显示、对分辨率要求不高的场合,如车间、厂房,采用大屏幕LCD则成本过高。另一方面,VGA显示技术因为技术发展成熟,成本低廉,仍在被大量使用,直到今天它仍是所有显示终端最为成熟的标准接口。如果让嵌入式处理器直接支持VGA显示器,则能很大地利用现有资源,节约系统成本。 1 基于S3C2440的VGA显示技术分析 通过分析VGA显示技术的时序逻辑与S3C2440内部集成LCD控制器驱动TFT LCD的时序逻辑,找出它们的共同点,分析在S3C244
[单片机]
基于嵌入式CPU <font color='red'>S3C2440</font>的VGA显示系统设计
linux内核中的GPIO系统之(2):pin control subsystem
一、前言 在linux2.6内核上工作的嵌入式软件工程师在pin control上都会遇到这样的状况: (1)启动一个新的项目后,需要根据硬件平台的设定进行pin control相关的编码。例如:在bootloader中建立一个大的table,描述各个引脚的配置和缺省状态。此外,由于SOC的引脚是可以复用的,因此在各个具体的driver中,也可能会对引脚进行的配置。这些工作都是比较繁琐的工作,需要极大的耐心和细致度。 (2)发现某个driver不能正常工作,辛辛苦苦debug后发现仅仅是因为其他的driver在初始化的过程中修改了引脚的配置,导致自己的driver无法正常工作 (3)即便是主CPU是一样的项目,但是由于外设的不同,
[单片机]
<font color='red'>linux</font>内核中的GPIO系统之(2):pin control subsystem
ARM Linux中断机制之中断的初始化
一,认识几个重要结构体: 1.中断描述符 对于每一条中断线都由一个irq_desc结构来描述。 //在include/linux/irq.h中 struct irq_desc { unsigned int irq;//中断号 struct timer_rand_state *timer_rand_state; unsigned int *kstat_irqs; #ifdef CONFIG_INTR_REMAP struct irq_2_iommu *irq_2_iommu; #endif /* 在kernel/irq/chip.c中实现了5个函数:handle_simple_irq(),handle_
[单片机]
ARM <font color='red'>Linux</font>中断机制之中断的初始化
基于s3c2440实现的裸机数码相框
实现数码相框之前,要将图片转换为二进制数组,用的是Image2Lcd这个软件。将软件各选项与自己的开发板、寄存器中像素设置等设置成相同。如下图: 具体程序实现如下: #define U32 unsigned int #include gImage_xiaogou.h #include ningbo.h #include tushu.h #include bailu.h #include yejing.h #define M5D(n) ((n) & 0x1fffff) /*用于设置显示缓存区时,取低21位地址*/ #define rGPCCON (*(volatile unsigne
[单片机]
基于<font color='red'>s3c2440</font>实现的裸机数码相框
S3C2440裸机------LCD_LCD硬件原理
1.LCD的连接图 2.LCD时序图
[单片机]
<font color='red'>S3C2440</font>裸机------LCD_LCD硬件原理
OK6410A 开发板 (八) 16 linux-5.11 OK6410A start_kernel 打印角度 第二阶段 do_initcalls
log // init_jiffies_clocksource- ... - __clocksource_register_scale clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns // futex_init futex hash table entries: 256 (order: -1, 3072 bytes, linear) // netlink_proto_init NET: Registered protocol family 16 // atomic_pool_
[单片机]
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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