首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>其他编程>正文

把Linux下nand读操作搞定了

http://www.oklinux.cn  2008-09-19  linuxidc   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

最后还是用了实地址和虚地址转换的函数,正确读出了写入的信息,挂载了cramfs分区

终于在最后一天晚上吧nand驱动的读取部分做好了,现在可以从cramfs启动文件系统,write应该也快了吧,ECC校验和yaffs还需要时间。简单记录下这几天和LM兄调试nand的痛苦经历。

我加入Linux项目组时LM兄已经开始着手看nand驱动的相关内容,所以主要程序都是他写的,我只是一起开发,解决问题。一开始是串口不能输出和2.6不能启动这些历史遗留问题,不再赘述。记得遇到了以下问题:

(1)DMA操作一定要对实地址进行操作,我们刚开始不懂,填虚地址,导致最简单的DMA程序都跑不了,幸亏张师兄提醒才恍然大悟。

(2)编译NAND驱动后,proc目录里没有和mtd和mtdblock,这个很傻的问题我们排查了一整天,包括按照三星2410的方法重新注册驱动,结果发现Make menuconfig时有一些MTD选项没有选,傻ToT

(3)写write指令,检测nand控制器,始终为0(忙)。按常理nand写完了就应当空闲才对,我们去读取却发现始终为忙。最后发现没有重载nand_base.c里面的write_byte函数,导致给32位寄存器的最低位赋值80时,赋值结果成了80808080,而nand控制器启动命令为80000080,也就是我们在写命令时就启动了nand控制器,导致nand控制器一直为忙。

(4)linux的MTD层读写NAND一般都是读512B和读16B的OOB区,我们的nand控制器特别特殊,必须一次读取528B的内容或者16B的OOB,一次写入528B的内容。导致调用write_buf(512)函数时,我们也得读528B,写512时,可能还得读取16B的OOB再写入528,写入暂时还没有完成。

(5) 对DMA读写,我们一直采用的方法是在内存最开始开辟一片区域,从dma中读出数据到这,linux再用实地址 0x90000000的虚地址去取。但是这样总是读的不正确,刚开始我以为是延时不够,加了很长的延时,好多了,但还是会有错误,于是不停读一块区域的oob区来测试,发现大概有15%的概率读成坏块,读错的概率更大吧。最后还是用了dma_alloc_coherent()来解决虚拟地址和实际地址映射的问题,终于全部读取正确,能够挂载cramfs文件系统了。

其实很多麻烦都是由我们这款nand控制器一定要采用DMA读写导致的,别人很简单的read_buf函数,到我们这里变得异常复杂ToT,第一次接触4020这款处理器非常不熟悉,导致出了很多问题,要继续努力!


上一篇:Linux\Unix 系统编程 -- 关于缓冲设置时容易出现的错误   下一篇:菜鸟课堂 教你打造个人无敌系统全攻略

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·菜鸟课堂 教你打造个人无敌系统全攻略
·Linux\Unix 系统编程 -- 关于缓冲设置时容易出现的错
·不安装Linux也可学习Linux命令的方法
·Linux添加路径到PATH
·Linux Shell位置参数
·关于Linux fork()函数的工作机制
·Linux内存泄漏的检查方法
·初识Linux脚本编程(shell)
·Linux shell 检查进程PID
·Ubuntu 8.04下的嵌入式开发环境建立
·Linux内核中Kconfig文档的作用
·Linux下线程调用sleep,进程挂起
·开发环境:从Windows到Linux
·创建XWindow全屏窗口(Linux可视化编程)
·红旗Linux内核与系统性能
·Linux下一类通用错误的解决方法
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·菜鸟课堂 教你打造个人无敌系统全攻略
·Linux\Unix 系统编程 -- 关于缓冲设置
·不安装Linux也可学习Linux命令的方法
·Linux添加路径到PATH
·Linux Shell位置参数
·关于Linux fork()函数的工作机制
·Linux内存泄漏的检查方法
·初识Linux脚本编程(shell)
·Linux shell 检查进程PID
·Ubuntu 8.04下的嵌入式开发环境建立
·Linux内核中Kconfig文档的作用
·Linux下线程调用sleep,进程挂起
  阅读排行
·Linux下Qtopia Core 4.3(QT/E)交叉编译
·开源空间 网络安全工具开发函数库Libne
·Linux编程时获取当前时间实例解析
·Linux环境下OpenGL编程学习
·Linux socket编程实例:echo服务器程序
·Linux中断处理学习笔记
·升级Redhat Linux 9.0内核有感
·GNU/Linux应用程序编程:用管道进行编
·Linux环境下重新编译GCC-4.3.0
·Linux系统中限制用户进程CPU及内存占用
·Linux下安装g77 fortran complier过程
·解决Linux中Matlab中文乱码问题
·Linux环境下Wine的中文显示以及freetyp
·Linux多线程编程学习之线程同步
·SUSE Linux中安装Quartus 7.2过程笔记
网摘收藏: