i.mx53开发的一些问题
i.mx53开发的一些问题
转载于此:http://blog.csdn.net/shell_albert/article/details/8242288
原来i.mx53上4GB的Nand Flash是当做SD卡来使用的啊。恍然大悟,这就解释了为什么我之前使用MFG工具烧录时,老是选择带有NAND选项的,烧写不进去的原因啊。
根据提供的原理图,发现NandFlash: SAMSUNG KLM4G1EEHM-B101只接了10根线,一是时钟CLK,二是CMD,三是SD3_DATA0~SD3_DATA7共8根数据线。
很奇怪啊,这个NandFlash接在了i.mx53的PATA接口上?为什么这样接啊?
Mx53手册上说PATA是Parallel Advanced Technology Attachment并行高级技术附件。
这个问题我觉得应该看一下驱动程序,看驱动是如何工作的就这知道为什么这么接啦。
现在还没有时间看驱动。
先分析一下烧录配置文件吧:
<LIST name="MX53SMD-SD"desc="Choose SD as media">
首先在目标机的RAM中构建一个微小的linux系统。然后利用这套系统中已有Nand Flash驱动来将映像写到NandFlash中。
<CMD type="boot"body="BootStrap" file ="u-boot-mx53-smd.bin" >Read fromDDR script from U-Boot to init DDR Memory.</CMD>
<CMD type="load"file="uImage" address="0x70800000"
loadSection="OTH" setSection="OTH"HasFlashHeader="FALSE" >Doing Kernel.</CMD>
<CMD type="load"file="initramfs.cpio.gz.uboot" address="0x70B00000"
loadSection="OTH" setSection="OTH"HasFlashHeader="FALSE" >Doing Initramfs.</CMD>
<CMD type="jump" > Jumping to OSimage. </CMD>
<CMD type="find"body="Updater" timeout="180"/>
开始在目标机上RAM中的linux系统中创建设备节点,准备访问设备
<CMD type="push" body="mknodblock,mmcblk0,/dev/mmcblk0,block"/>
<CMD type="push" body="$ mknod/dev/zero c 1 5"/>
<CMD type="push"body="send" file="mksdcard.sh.tar">Sending partitionshell</CMD>
<CMD type="push" body="$ tar xf$FILE "> Partitioning...</CMD>
对设备进行分区,这里为什么NandFlash对应于/dev/mmcblk0呢?这也需要查看驱动程序找原因。
<CMD type="push"body="$ sh mksdcard.sh /dev/mmcblk0"> Partitioning...</CMD>
根据手册上讲的,使用sfdisk分区工具主要是为了产生MBR。
Mksdcard.sh中的内容如下:
#!/bin/sh
#partition size in MB
BOOT_ROM_SIZE=10 这里定义的是启动ROM 10MB
ROOT_SYSTEM_SIZE=150 这里定义的是系统大小 150MB
#call sfdisk to create partition table
#destroy the partition table
node=$1
ddif=/dev/zero of=${node} bs=1024 count=1 将前导一个1024字节(1KB)大小的分区零0
sfdisk--force -uM ${node} << EOF SmartFdisk –uM表示以MB为单位生成报告
${BOOT_ROM_SIZE},${ROOT_SYSTEM_SIZE},83 这里是将/dev/mmcblk0分成3个区,一个10MB,一个150MB,一个是83MB ????
EOF
<CMD type="push" body="mknodblock/mmcblk0,mmcblk0p1,/dev/mmcblk0p1,block"/>
<CMD type="push" body="$ ddif=/dev/zero of=/dev/mmcblk0 bs=512 seek=1536 count=16">Clean U-Bootenvironment</CMD>
以512字节为单位进行操作,seek=1536是偏移1536个block,即1536*512=768K,即拷贝16*512=8192/1024=8KB到目标设备从启起位置偏移768K的地址上。
简单的说就是:将mmcblk0空出768KB,然后将接下来的8KB清零。
下面是接收uboot,然后写进设备节点中。
<CMD type="push"body="send" file="files/u-boot-mx53-smd.bin">Sendingu-boot.bin</CMD>
<CMD type="push"body="$ dd if=$FILE of=/dev/mmcblk0 bs=512 seek=2 skip=2">writeU-Boot to sd card</CMD>
输入跳过skip=2*512=1KB个字节,输出跳过2*512=1KB的字节。将uboot写至1KB的地址上。但是把uboot的前1K也跳过了,莫非mx53ROM不需要这些信息?
下面是接收uImage,然后写进设备节点中。,将内核写到512*2048=1MB的地址上。
<CMD type="push"body="send" file="files/uImage">Sending kerneluImage</CMD>
<CMD type="push" body="$ ddif=$FILE of=/dev/mmcblk0 bs=512 seek=2048">write kernel image to sdcard</CMD>
然后是格式分第二个分区,挂载在RAM中的linux目录下,然后将根文件系统解压到里面,完成根文件系统的烧写。
<CMD type="push" body="$mkfs.ext3 -j /dev/mmcblk0p1">Formatting rootfs partition</CMD>
<CMD type="push" body="$ mkdir-p /mnt/mmcblk0p1"/>
<CMD type="push" body="$ mount-t ext3 /dev/mmcblk0p1 /mnt/mmcblk0p1"/>
<CMD type="push" body="pipe tar-jxv -C /mnt/mmcblk0p1" file="files/rootfs.tar.bz2">Sendingand writting rootfs</CMD>
<CMD type="push"body="frf">Finishing rootfs write</CMD>
<CMD type="push" body="$ umount/mnt/mmcblk0p1">Unmounting rootfs partition</CMD>
<!--
Fuse examplesto sense/blown fuses.
Pleasenote blown fuse is OTP. This operation is irreversible. So when you write
thecommand for blown operation, please ensure the accurance of the command line.
Sense: ddif=/dev/mxc_iim of=output bs=1 skip=<fuse address> count=1
Blown:echo "<fuse_address> <fuse_value>" > /dev/mxc_iim
Thefollowing example shows how to create mxc_iim node. Then blown 0xff to fuse
address"0xc30" (MAC_ADDR[23:16]). And sense back fuse value.
-->
<!--
<CMD type="push" body="$ cat/sys/class/misc/mxc_iim/dev"/>
<CMD type="push" body="$ mknod/dev/mxc_iim c 10 63"/>
<CMD type="push" body="$ echo\"0xc30 0xff\" > /dev/mxc_iim "/>
<CMD type="push" body="$ ddif=/dev/mxc_iim of=/dev/temp.txt bs=1 skip=3120 count=1"/>
-->
<CMD type="push" body="$ echoUpdate Complete!">Done</CMD>
</LIST>
现在就是找一下,这个SD设备在内核中的驱动,仔细分析一下,在arch/arm/mach-mx5/mx53_smd.c中发现了如下的东东:
/*Register mmc3(eMMC) first,make it’sdevice number be 0 to
*avoid device number change by hotplug inSD(mmc1) card*/
Mxc_register_device(&mxcsdhc3_device,&mmc3_data);
这里是注册设备驱动,也对啊,辰汉的原理图上的确是挂接在SD3上。
使用grep “mxcsdhc3_device” *在目录下搜索,发现在devices.c中有如下定义:
Struct platform_device mxcsdhc3_device={
.name=”mxsdhci”,
.id=2,
.num_resources=ARRAY_SIZE(mxcsdhc3_resources),
.resource=mxcsdhc3_resources,
};
Static struct resourcemxcsdhc3_resources[]={
{
.start=MMC_SDHC3_BASE_ADDR,
.end=MMC_SDHC3_BASE_ADDR+SZ_4K-1,
.flags=IORESOURCE_MEM,
},
{
.start=MXC_INT_MMC_SDHC3,
.end=MXC_INT_MMC_SDHC3,
.flags=IORESOURCE_IRQ,
},
{
.flags=IORESOURCE_IRQ,
}
};
继续找定义啊,grep “MMC_SDHC3_BASE_ADDR”* -r
在arch/arm/plat-mxc/include/mach/mx5x.h中找到了
#define MMC_SDHC3_BASE_ADDR (SPBA0_BASE_ADDR+0x00020000)
#define SPBA0_BASE_ADDR 0x70000000
这应该是物理地址定义,有时间跟数据手册的比较一下,看是不是一样。验证一下。
因为MMC使用的是平台设备驱动,所以现在最主要的是找到它的注册函数,probe函数。
现在最想知道的是在Document/devices.txt中规定了well-known的设备号,而驱动程序就使用这些设备号,而且名称也规定好了,所以创建设备文件的时候,应该使用这些设备号和设备名称。但是如何在驱动程序中找到这些定义呢?
现在都没有找到!
网上有人说,现在都使用platform_device,platform_driver会自动创建设备文件,不用管设备号。是这样吗?需要再次确认啊!
平台设备自动分配设备号,不用关心,并且自动创建设备文件,不用关心。
创建的设备文件的名字跟在驱动程序中指定的文件名字是一样的。
Mmc write 0 ${loadaddr} 0x800 0x1800
因为SD卡也是块设备,mmc操作是以块为单位的,且块的大小为512字节。
此句的意思是将内存中${loadaddr}的文件烧写到SD卡中0x800*512=0x800*0x200=0x100000的起始地址上,烧写大小为0x1800*512=0x1800*0x200=0x300000。
Name |
Start address |
size |
Partition Table |
0x0~0x3FF |
0x400(1KB) |
Bootloader |
0x400~0xFFFFF |
0xFFBFF(1022KB) |
Kernel |
0x100000 |
0x300000 |
Rootfs |
烧写bootloader
Sudo dd if=u-boot-mx53-smd.bin of=/dev/sdbbs=512 && sync && sync
升级bootloader
Sudo dd if=u-boot.mx53-smd.bin of=/dev/sdbbs=512 seek=2 skip=2 && sync &&sync
为什么要跳过512*2=1KB呢?因为前1KB包含分区表,是不需要再次重写的,所以跳过就可以。也可以重写,但其实不需要。
Sudo if=uImage of=/dev/sdb bs=512 seek=2048&& sync && sync
将内核烧写到起始地址为512*2048=1MB的位置上。
烧写文件系统
1、 创建分区表 sudo fdisk /dev/sdb
2、 第一个分区的偏移量设置在8192处,因为是块设备,所以是8192*512=4MB的地址上。即第一个分区设置在4MB地址上。
3、 格式化分区 mkfs.ext4 /dev/sdb1
4、 拷贝根文件系统到分区上
Mkdir/home/zhangshaoyan/tmp
Sudo mount/dev/sdb1 /home/zhangshaoyan/tmp
Sudo tar jxvfrootfs.tar.bz2 -C /home/zhangshaoyan/tmp
Sudo umount/home/zhangshaoyan/tmp
5、这样根文件系统就算是烧写完成了。
i.mx53开发的一些问题的更多相关文章
- 采用busybox 代替android 自带的shell
折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心.看一下怎么把渺小的toolbox替换成伟大的busybox吧.先大致描述一下Android系统中的she ...
- 几个比較好的IT站和开发库官网
几个比較好的IT站和开发库官网 1.IT技术.项目类站点 (1)首推CodeProject,一个国外的IT站点,官网地址为:http://www.codeproject.com,这个站点为程序开发人员 ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】
[Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...
- 几个比较好的IT站和开发库官网
1.IT技术.项目类网站 (1)首推CodeProject,一个国外的IT网站,官网地址为:http://www.codeproject.com,这个网站为程序开发者提供了很好的代码示例以及讲解,不过 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
随机推荐
- 090 Subsets II 子集 II
给定一个可能包含重复整数的列表,返回所有可能的子集(幂集).注意事项:解决方案集不能包含重复的子集.例如,如果 nums = [1,2,2],答案为:[ [2], [1], [1,2,2], ...
- centos7安装文档
1.当载入安装镜像时,我们会看到如下图中的画面,我们选择第一项,安装centos7 2.选择英语(个人测试环境可以使用中文安装) 3.选择network&hostname配置网络 4.在配置网 ...
- 禁用和关闭ECSHOP缓存
ECSHOP的缓存机制从一定程度上可以减少ECSHOP反复读取数据库的几率,从而一定程度上降低服务器负担,提高访问速度. 但是启用缓存机制,对一些新手站长也有不利的地方.我就遇到很多新手站长经常问,我 ...
- hdu3642Get The Treasury
链接 刚开始看n挺小,以为是二维的线段树,想了一会也没想到怎么解,之后看到z值非常小,想到可以直接枚举z,确定一个坐标,然后把三维转化为二维,把体积转化为面. 枚举z从-500到500,然后用面积并的 ...
- Nginx 配置https 开启ssl 同时支持http
server { listen ; listen 443 ssl; server_name default; index index.html index.php; root /www/html; a ...
- MySQL数据库报错:Too many connection
每次搭建环境运行一段时间,后台就会报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data sourc ...
- spring mvc添加静态资源访问时@Controller无效的解决
web.xml中的url-pattern设置为/,添加mvc:resources访问静态资源时,@Controller无效的问题 web.xml: <servlet> <servle ...
- hihocoder1080 更为复杂的买卖房屋姿势
思路: 线段树区间修改,需要使用两个懒标记set和add.处理好两个标记的优先级即可(set之前的set和add是没有作用的). 实现: #include <bits/stdc++.h> ...
- VC和MATLAB混合开发需要注意的一个问题
作者:朱金灿 来源:http://blog.csdn.net/clever101 如果你的操作系统是64位操作系统,那么直接运行MATLAB的安装文件下的Setup.exe会默认安装的是64位的MAT ...
- linux服务器上的jenkins远程触发构建windows server 2012服务器上的jenkins任务
本文来自:https://blog.csdn.net/huashao0602/article/details/53318295 非常感谢原博主,亲测可行,这是我做CI持续集成试过的第6套方案了! 背 ...