文章目录
低版本linux内核中加入EMMC5.1支持
0. 问题描述
需要使用eMMC5.1协议的芯片,但是Linux内核版本较老,无法使用。
提示 unrecognised CSD structure version 3
。
1. 问题原因
当前的Linux内核版本是2.6,不支持新版eMMc,需要对内核进行修改。
2. 修改方式
结合内核中对eMMC的变更可知,需要修改下面三个文件实现对eMMC5.1的支持。
以下路径均以内核根目录为根目录。
2.1 drivers/mmc/core/mmc.c
mmc_decode_csd
函数中做如下修改,通过csd结构体中的structure成员进行判断。
mmc_read_ext_csd
函数中增加对 EXT_CSD_STRUCTURE
字段的分析:
/* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register. Modify By Clair For eMMC4.4 */
if (card->csd.structure == 3) {
int ext_csd_struct = ext_csd[EXT_CSD_STRUCTURE];
if (ext_csd_struct > 2) {
printk(KERN_ERR "%s: unrecognised EXT_CSD structure "
"version %d\n", mmc_hostname(card->host),
ext_csd_struct);
err = -EINVAL;
goto out;
}
}
同时修改对 EXT_CSD_REV
的判断条件
card->ext_csd.rev = ext_csd[EXT_CSD_REV];
if (card->ext_csd.rev > 8) { //原来是3
printk(KERN_ERR "%s: unrecognised EXT_CSD revision %d\n",
mmc_hostname(card->host), card->ext_csd.rev);
err = -EINVAL;
goto out;
}
如下图所示:
2.2 include/linux/mmc/card.h
增加 mmc_csd
结构体中 structure
成员的定义(左边修改前,右边修改后):
2.3 include/linux/mmc/mmc.h
增加常量 EXT_CSD_STRUCTURE
的定义(左边修改前,右边修改后):
完成后保存编译内核即可。
3. 测试
开机启动能正常识别到eMMC芯片:
进入系统能使用fdisk查看mmcblk0的信息,无异常报错即说明修改成功。