i.mx53开发的一些问题

2023-11-28 07:08
文章标签 问题 开发 mx53

本文主要是介绍i.mx53开发的一些问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原来i.mx534GBNand Flash是当做SD卡来使用的啊。恍然大悟,这就解释了为什么我之前使用MFG工具烧录时,老是选择带有NAND选项的,烧写不进去的原因啊。

根据提供的原理图,发现NandFlash: SAMSUNG KLM4G1EEHM-B101只接了10根线,一是时钟CLK,二是CMD,三是SD3_DATA0~SD3_DATA78根数据线。

很奇怪啊,这个NandFlash接在了i.mx53PATA接口上?为什么这样接啊?

Mx53手册上说PATAParallel 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开发的一些问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429261

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地