各位工程师,你们好,我是alan,今天就瑞芯微平台和北京君正平台下的linux系统中关于SD
NAND的使用做一些经验的分享,如有不正,请联系我们批评指正;
采用的开发板是RK3568和x2600e,ubuntu版本是20.04,交叉编译工具链是aarch64-linux-gnu-和mips-linux-gnu-;
下面将从五个板块来进行介绍,分别是操作SD NAND的常用命令、SD底层协议简要介绍、对SD
NAND进行读写操作的三大方式、SD的驱动框架介绍以及SD
NAND启动,前三个板块没有瑞芯微和君正平台之分,只要是跑linux系统,差别不大,第四块以RK平台为例,第五块同时以君正平台和RK平台为例。
一:操作SD NAND的常用命令
1.查看SD设备:lsblk或fdisk
-l,设备节点一般为/dev/mmcblkX或/dev/sdX,eg:mmcblk0;
2.挂载分区:mount 设备分区 挂载点 eg:mount /dev/mmcblk0p1
/mnt/sdcard
3.卸载分区:umount 设备分区/挂载点 eg:umount /dev/mmcblk0p1 或 umount
/mnt/sdcard
4.分区管理:fdisk 设备节点eg:fdisk /dev/mmcblk0
进入交互页面后常用命令:
p 打印分区表
n 创建新分区
d 删除分区
t 更改分区类型
w 将更改写入磁盘并退出
q 不保存更改退出
m 显示帮助菜单
l 列出已知的分区类型
v 验证分区表
g 创建新的空GPT分区表
o 创建新的空DOS分区表
在进行分区管理前请务必备份重要数据,因为在更改生效后会丢失原来数据;
5.格式化分区:
格式化为FAT32:mkfs.vfat 设备分区;eg: mkfs.vfat
/dev/mmcblk0p1
格式化为ext4:mkfs.ext4 设备分区;eg:mkfs.ext4
/dev/mmcblk0p2
6.简单读写:cp,cat,echo等命令
eg:cp /usr/data/1.txt /mnt/sdcard/2.txt
cat /mnt/sdcard/test.c
echo "测试内容" >
/mnt/sdcard/test.txt
二:SD底层协议简要介绍(由于SD
NAND和SD卡遵守相同协议,并且标准协议中使用SD卡来描述,因此以下用词使用SD卡代替SD
NAND)
此处是为下面介绍读写方式准备协议的理论知识,仅做简要介绍以及提醒一些需要注意的点,完整的协议内容较多,详细请参考SD2.0协议标准完整版(参考附件);
SD驱动中最重要的部分就是初始化,这里描述一下初始化流程,(需要区别四类卡,SDHC卡,SDSC卡,SD1.X卡,mmc卡)先是给SD卡上电,通常这一步在将卡插入卡槽就会自动完成,然后是发送CMD0进行软复位,进入空闲模式,再发送CMD8,主机询问SD卡是否支持电压范围,(SD1.X和mmc卡不会对CMD8产生响应,只有SDHC和SDSC卡会对CMD8回复R1响应);如果不响应再区分SD1.X和mmc卡,发送ACMD41(先发送CMD55告诉SD卡接下来发送的是应用命令),如果不响应就说明是mmc卡(此时发送CMD1激活mmc卡,mmc卡响应后即完成mmc卡的初始化),如果回复R1相应就说明是V1.X卡;
收到R1响应再区分SDHC和SDSC,然后发送ACMD41,主机告诉SD卡支持高容量,根据返回的R3响应中的OCR寄存器来判断是标准还是高容量,只有当busy位置1时CCS位才有效,CCS位为1是高容量V2.0卡(即SDHC卡),CCS位为0是标准V2.0卡(即SDSC卡),至此区分出了V1.X,标准V2.0,高容量V2.0卡,这三种卡接下来的步骤一致:
发送CMD2获取CID寄存器的值,SD卡会回复R2响应,再发送CMD3,SD卡获得相对地址,流程图如下图所示:
然后是数据传输模式,初始化完成后进行数据传输就相对简单了,只需要发送对应的命令即可,流程图如下:
下面附上常用命令以及响应的图:
最后提醒几个需要注意的点:
第一是上电之后有一个时间段叫“供电上升时间”,这个是电压上升到操作的总线电平以及等到能发送第一条命令的时间,这个时间需要在1ms,74个时钟周期以及供电上升时间这三者中取最大值,其实这点在驱动源码中也有体现,在mmc_power_up函数(drivers/mmc/core/core.c)如下图所示,同时在协议的6.4.1章节也有说明,这个时间如果没有等待而直接开始发送命令进行初始化,可能也能通过初始化,但是在后面的数据传输阶段就有概率会出现问题了,如果没有注意到这个供电上升时间,那么其实出现了异常是很难定位问题的;
第二是SD卡的两种数据包格式,分别是常规数据和宽位数据,常规数据是指普通的8bit字节数据,发送规则是先发低字节再发高字节,每个字节是先发高位后发低位;而宽位数据一般指SD卡存储寄存器,规则是先发高位,后发低位,
这点在解析SD卡寄存器时需要格外注意,否则就会发现解析的数据明显不符规范;
三:对SD NAND进行读写操作的三大方式
SD NAND作为一种存储设备,不外乎就是读和写,同时这也是最重要的,熟悉读写方式对于使用SD
NAND开发非常有帮助,因此在这一块会详细介绍;
亲爱的卡友们,欢迎光临深圳市雷龙发展有限公司官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们。
CS创世SDNAND在北京君正平台和瑞芯微RK平台的应用
各位工程师,你们好,我是alan,今天就瑞芯微平台和北京君正平台下的linux系统中关于SD NAND的使用做一些经验的分享,如有不正,请联系我们批评指正;
采用的开发板是RK3568和x2600e,ubuntu版本是20.04,交叉编译工具链是aarch64-linux-gnu-和mips-linux-gnu-;
下面将从五个板块来进行介绍,分别是操作SD NAND的常用命令、SD底层协议简要介绍、对SD NAND进行读写操作的三大方式、SD的驱动框架介绍以及SD NAND启动,前三个板块没有瑞芯微和君正平台之分,只要是跑linux系统,差别不大,第四块以RK平台为例,第五块同时以君正平台和RK平台为例。
一:操作SD NAND的常用命令
1.查看SD设备:lsblk或fdisk -l,设备节点一般为/dev/mmcblkX或/dev/sdX,eg:mmcblk0;
2.挂载分区:mount 设备分区 挂载点 eg:mount /dev/mmcblk0p1 /mnt/sdcard
3.卸载分区:umount 设备分区/挂载点 eg:umount /dev/mmcblk0p1 或 umount /mnt/sdcard
4.分区管理:fdisk 设备节点eg:fdisk /dev/mmcblk0
进入交互页面后常用命令:
p 打印分区表
n 创建新分区
d 删除分区
t 更改分区类型
w 将更改写入磁盘并退出
q 不保存更改退出
m 显示帮助菜单
l 列出已知的分区类型
v 验证分区表
g 创建新的空GPT分区表
o 创建新的空DOS分区表
在进行分区管理前请务必备份重要数据,因为在更改生效后会丢失原来数据;
5.格式化分区:
格式化为FAT32:mkfs.vfat 设备分区;eg: mkfs.vfat /dev/mmcblk0p1
格式化为ext4:mkfs.ext4 设备分区;eg:mkfs.ext4 /dev/mmcblk0p2
6.简单读写:cp,cat,echo等命令
eg:cp /usr/data/1.txt /mnt/sdcard/2.txt
cat /mnt/sdcard/test.c
echo "测试内容" > /mnt/sdcard/test.txt
二:SD底层协议简要介绍(由于SD NAND和SD卡遵守相同协议,并且标准协议中使用SD卡来描述,因此以下用词使用SD卡代替SD NAND)
此处是为下面介绍读写方式准备协议的理论知识,仅做简要介绍以及提醒一些需要注意的点,完整的协议内容较多,详细请参考SD2.0协议标准完整版(参考附件);
SD驱动中最重要的部分就是初始化,这里描述一下初始化流程,(需要区别四类卡,SDHC卡,SDSC卡,SD1.X卡,mmc卡)先是给SD卡上电,通常这一步在将卡插入卡槽就会自动完成,然后是发送CMD0进行软复位,进入空闲模式,再发送CMD8,主机询问SD卡是否支持电压范围,(SD1.X和mmc卡不会对CMD8产生响应,只有SDHC和SDSC卡会对CMD8回复R1响应);如果不响应再区分SD1.X和mmc卡,发送ACMD41(先发送CMD55告诉SD卡接下来发送的是应用命令),如果不响应就说明是mmc卡(此时发送CMD1激活mmc卡,mmc卡响应后即完成mmc卡的初始化),如果回复R1相应就说明是V1.X卡;
收到R1响应再区分SDHC和SDSC,然后发送ACMD41,主机告诉SD卡支持高容量,根据返回的R3响应中的OCR寄存器来判断是标准还是高容量,只有当busy位置1时CCS位才有效,CCS位为1是高容量V2.0卡(即SDHC卡),CCS位为0是标准V2.0卡(即SDSC卡),至此区分出了V1.X,标准V2.0,高容量V2.0卡,这三种卡接下来的步骤一致:
发送CMD2获取CID寄存器的值,SD卡会回复R2响应,再发送CMD3,SD卡获得相对地址,流程图如下图所示:
然后是数据传输模式,初始化完成后进行数据传输就相对简单了,只需要发送对应的命令即可,流程图如下:
下面附上常用命令以及响应的图:
最后提醒几个需要注意的点:
第一是上电之后有一个时间段叫“供电上升时间”,这个是电压上升到操作的总线电平以及等到能发送第一条命令的时间,这个时间需要在1ms,74个时钟周期以及供电上升时间这三者中取最大值,其实这点在驱动源码中也有体现,在mmc_power_up函数(drivers/mmc/core/core.c)如下图所示,同时在协议的6.4.1章节也有说明,这个时间如果没有等待而直接开始发送命令进行初始化,可能也能通过初始化,但是在后面的数据传输阶段就有概率会出现问题了,如果没有注意到这个供电上升时间,那么其实出现了异常是很难定位问题的;
第二是SD卡的两种数据包格式,分别是常规数据和宽位数据,常规数据是指普通的8bit字节数据,发送规则是先发低字节再发高字节,每个字节是先发高位后发低位;而宽位数据一般指SD卡存储寄存器,规则是先发高位,后发低位, 这点在解析SD卡寄存器时需要格外注意,否则就会发现解析的数据明显不符规范;
三:对SD NAND进行读写操作的三大方式
SD NAND作为一种存储设备,不外乎就是读和写,同时这也是最重要的,熟悉读写方式对于使用SD NAND开发非常有帮助,因此在这一块会详细介绍;
亲爱的卡友们,欢迎光临深圳市雷龙发展有限公司官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们。