s3c2440 移值u-boot-2016.03 第4篇 支持NAND flash 识别
1, /include/configs/smdk2440.h
中添加
#define CONFIG_CMD_NAND
编译
drivers/mtd/nand/built-in.o: In function `nand_init_chip':
/u-boot-2016.03/drivers/mtd/nand/nand.c:76: undefined reference to `board_nand_init'
发现是少了文件
/drivers/mtd/nand/s3c2410_nand.c 复制为
/drivers/mtd/nand/s3c2440_nand.c 打开 里面的 所有 2410 换为 2440
drivers/mtd/nand/Makefile
添加一行
obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
2, 重新编辑
编译通过了,应该是用不上,烧写试机
NAND: 0 MiB 虽然没有报错,但是未实别出来。
3, 修改代码支持 NAND FLASH
2410 和 2440 控制寄存器有些不同,可能是这些原因。
在 nand_scan() 中扫 NAND FLASH ,实别出来容量大小。
/drivers/mtd/nand/nand_base.c
ret = nand_scan_ident(mtd, maxchips, NULL);
if (!ret)
ret = nand_scan_tail(mtd);
return ret;
原理和 NOR FLASH 差不多,实别出来ID 比较就知道大小了
应该是对应 s3c2440_nand.c 里面的
int board_nand_init(struct nand_chip *nand)
{
初始化修改,尽量使用定义的方式,方便 后期修改
//cfg = S3C2440_NFCONF_EN; 取消 15位 用不上 2440 中是保留位
smdk2440.h 中添加定义
#define CONFIG_S3C24XX_CUSTOM_NAND_TIMING
#define CONFIG_S3C24XX_TACLS 1
#define CONFIG_S3C24XX_TWRPH0 2
#define CONFIG_S3C24XX_TWRPH1 1
去掉 硬件 ECC
#define CONFIG_SYS_S3C2440_NAND_HWECC
4, 添加 #define DEBUG 打开调试信息
NAND: board_nand_init()
end of nand_init
hwcontrol(): 0xff 0x83
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x00 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x00 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0x90 0x83
hwcontrol(): 0x40 0x85
hwcontrol(): 0xffffffff 0x81
dev_ready
hwcontrol(): 0xffffffff 0x80
0 MiB
0x81 最后一位是1表示选中
0x83 ..选中
0x85 ..选中
0x80 最后一位是0就是不选中
board_nand_init() 还应该是有问题的。
加上 启用 nfcont 控制器
/* 4 ECC
* 1 CE 先不选中,用的时候在选中
* 0 启动 flash controller
*/
writel(1<<4 | 1<<1 | 1, &nand_reg->nfcont);
修改选中 及 命令 地址 寄存器定义, 注意这里是 ! NCLE
s3c24x0_hwcontrol()
if (!(ctrl & NAND_CLE))
IO_ADDR_W |= S3C2440_ADDR_NCLE;
if (!(ctrl & NAND_ALE))
IO_ADDR_W |= S3C2440_ADDR_NALE;
对比 2410 和 2440 选中控制位不同,进行修改。
if (ctrl & NAND_NCE)
writel(readl(&nand->nfconf) & ~S3C2440_NFCONF_nFCE,
&nand->nfconf);
else
writel(readl(&nand->nfconf) | S3C2440_NFCONF_nFCE,
&nand->nfconf);
修改
#define S3C2440_NFCONF_nFCE (1<<1)
其它的也修改下 参照手册
#define S3C2440_NFCONF_EN (1<<15)
#define S3C2440_NFCONF_512BYTE (1<<14)
#define S3C2440_NFCONF_4STEP (1<<13)
#define S3C2440_NFCONF_INITECC (1<<12)
#define S3C2440_NFCONF_nFCE (1<<1)
#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 8
#define S3C2440_ADDR_NCLE 0xc
nane_base.c
这里看下,默认的 nand_base 中的 取消选中的功能
static void nand_select_chip(struct mtd_info *mtd, int chipnr)
{
struct nand_chip *chip = mtd->priv;
switch (chipnr) {
case -1:
chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
break;
case 0:
break;
default:
BUG();
}
对应的 s3c2440_nand 中的就是 调用这里
writel(readl(&nand->nfcont) | S3C2440_NFCONF_nFCE, &nand->nfcont);
ps: 经过后期 试验,发现,不能 nand write ,改进方法,见 u-boot 最后一篇的 补丁。
s3c2440 移值u-boot-2016.03 第4篇 支持NAND flash 识别的更多相关文章
- s3c2440 移值u-boot-2016.03 第2篇 支持Nand flash启动
1, 要求:在4K 的代码以内,完成 NOR NAND 类型判断,初始化 NAND 复制自身到 SDRAM ,重定向. 2, 在 /arch/arm/cpu/arm920t/ 文件夹里 添加一个 in ...
- s3c2440 移值u-boot-2016.03 第3篇 支持Nor flash 识别
当选择,NOR flash 启用时,才可以访问 NOR FLASH ./common/board_r.c 364 line:initr_flash()flash_size = flash_init() ...
- s3c2440 移值u-boot-2016.03 第1篇 新建单板
目前除RC版外,最新的就是 u-boot-2016.03.tar.bz2 ,大概看了几个年份的u-boot 发现,现在 更像是 linux kernel .有 menuconfig . 对比2012年 ...
- s3c2440 移值u-boot-2016.03 第6篇 支持mtd yaffs 烧写
1, 解决启动时的错误 Warning - bad CRC, using default environment 搜索发现 在 /tools/env/fw_env.c 中 /* 放在NAND FLAS ...
- s3c2440 移值新内核 linux-4.1.36
arm-linuxgcc version 4.3.2 经过试验,最高可以编译到 linux-4.1.36 ,在高的版本会有错误 ,可能是 GCC 编译器版本较低造成. 解压比较麻烦还要装一个 xz x ...
- s3c2440 移值u-boot-2016.03 第5篇 支持dm9000 识别
1, 通过查看 /drivers/net/Makefile 发现想要编译上,需要添加宏 /include/configs/smdk2440.h 中添加 #define CONFIG_DRIVER_DM ...
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...
- “耐撕”团队 2016.03.24 站立会议
时间: 2016.03.22 17:00-17:30 18:30-19:00 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), ...
- 移值UCOS2到M4核与M3核的区别
之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...
随机推荐
- Error #include nested too deeply
转载:http://blog.csdn.net/ysdaniel/article/details/7043395 出现 Error #include nested too deeply 原因是: 头文 ...
- 记录load data infile 的用法
load data local infile 'd:/1.txt' into table tcm.wm_dis_category fields terminated by';' lines termi ...
- php+curl上传文件
因为公司项目用java做的,需要我这边用php上传文件.只给了个接口,参数都不明确,然后这边不提交表单,在生成pdf之后就立马上传.用了php+curl,总是没上传成功,这里看到了篇文章http:// ...
- android之进度条组件ProgressBar
首先是main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- js中cookie
document.cookie='address='+$("#address").val()+';path=/';
- php中英字符串截取
<?php @header('Content-type: text/html; charset=UTF-8'); function Ctruncate($str = '', $len = 0, ...
- Maven学习 (四) 使用Nexus搭建Maven私服
为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...
- 转载:有关qsort的使用方法和注意事项
七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , co ...
- BizTalk开发系列(二十六) 使用Web Service
Web Service是在构建SOA平台中广泛使用的技术.在BizTalk开发过程中使用SOAP适配器接收和发送 Web Services 请求.业务流程可以发布为 Web Services 并使用外 ...
- repeater单双行颜色不同,gridview repeater DataList 鼠标经过改变背景颜色
1.gridview 双击GridView的OnRowDataBound事件: 在后台的GridView1_RowDataBound()方法添加代码,最后代码如下所示: protected void ...