一种纯粹靠读书学来的真理,与我们的关系,就像假肢、假牙、蜡鼻子甚或人工植皮。而由独立思考获得的真理就如我们天生的四肢:只有它们才属于我们。 —— 叔本华

读书的价值在于认识你自己,而不是用填鸭式的知识来武装自己。今天的主题是sd卡驱动。分为故事描述和总结两部分,第一部分是发现问题到解决问题的过程,第二部分是总结,不想知道过程的可以直接跳到总结。

一 故事是这样的

自从更新博客以来,有不少童鞋通过qq,邮箱来提问,其中有个频率比较高的问题:支不支持emmc启动。很遗憾,由于前期注意力不在Linux上,没有去探究过这方面的问题,今天把sd host驱动编译进了内核,看了下启动日志,发现问题了。

[    0.682835] of_get_named_gpiod_flags: can't parse 'cd-gpios' property of node '/sdhci@12530000[0]'
[    0.682930] s3c-sdhci 12530000.sdhci: clock source 2: mmc_busclk.2 (40000000 Hz)
[    0.689939] s3c-sdhci 12530000.sdhci: GPIO lookup for consumer cd
[    0.689949] s3c-sdhci 12530000.sdhci: using device tree for GPIO lookup
[    0.689959] of_get_named_gpiod_flags: can't parse 'cd-gpios' property of node '/sdhci@12530000[0]'
[    0.689967] of_get_named_gpiod_flags: can't parse 'cd-gpio' property of node '/sdhci@12530000[0]'
[    0.689976] s3c-sdhci 12530000.sdhci: using lookup tables for GPIO lookup
[    0.689986] s3c-sdhci 12530000.sdhci: lookup for GPIO cd failed
[    0.689996] s3c-sdhci 12530000.sdhci: GPIO lookup for consumer wp
[    0.690004] s3c-sdhci 12530000.sdhci: using device tree for GPIO lookup
[    0.690012] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/sdhci@12530000[0]'
[    0.690020] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/sdhci@12530000[0]'
[    0.690028] s3c-sdhci 12530000.sdhci: using lookup tables for GPIO lookup
[    0.690037] s3c-sdhci 12530000.sdhci: lookup for GPIO wp failed
[    0.690312] s3c-sdhci 12530000.sdhci: No vmmc regulator found
[    0.695645] s3c-sdhci 12530000.sdhci: No vqmmc regulator found
[    0.729613] mmc0: SDHCI controller on samsung-hsmmc [12530000.sdhci] using ADMA

log显示找不到需要的cd-gpio和wp-gpio。

什么是cd-gpio和wp-gpio?

参考 mmc设备树介绍

cd-gpios: Specify GPIOs for card detection
wp-gpios: Specify GPIOs for write protection

查看Exynos4412用户手册可以知道:cd-gpio是和gpk2[2]复用的。

sdhci@12530000 {bus-width = <4>;pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;pinctrl-names = "default";status = "okay";cd-gpios = <&gpk2 2 0>;};

启动后找不到cd-gpio的错误没有了,

[    0.795664] mmc0: new high speed SDHC card at address aaaa
[    0.800107] mmcblk0: mmc0:aaaa SU08G 7.40 GiB
[    0.805839]  mmcblk0:

检测到了tf卡,然后来测试一下访问tf卡。

首先通过fdisk对tf卡进行分区,具体怎么用fdisk就不介绍了,但是执行fdisk -l的时候会报超时,再次执行的时候又没有了,有点奇怪,先不管这个。

[root@osee ]#fdisk -l
[ 1961.203023] mmcblk0: error -110 sending status command, retrying
[ 1961.207601] mmcblk0: error -110 sending status command, retrying
[ 1961.213572] mmcblk0: error -110 sending status command, aborting
[ 1961.375122] mmc0: tried to reset card
Disk /dev/mmcblk0: 7580 MB, 7948206080 bytes, 15523840 sectors
242560 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytesDisk /dev/mmcblk0 doesn't contain a valid partition table
[root@osee ]#fdisk -l
Disk /dev/mmcblk0: 7580 MB, 7948206080 bytes, 15523840 sectors
242560 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

分区完之后写个文件,然后再去笔记本上打开,发现正常。

重新拔插一下tf卡,在执行fdisk -l的时候不能识别,报I/O error,而且使能了sdmmc2的INSERT和REMOVAL中断,却没有抓到中断log。

二 总结

如何移植sd卡驱动呢?基本过程其实都是类似的。

2.1 管脚配置

regulators {compatible = "simple-bus";#address-cells = <1>;#size-cells = <0>;mmc_reg: regulator@0 {compatible = "regulator-fixed";reg = <0>;regulator-name = "VMEM_VDD_2.8V";regulator-min-microvolt = <2800000>;regulator-max-microvolt = <2800000>;};
};
...
sdhci@12530000 {bus-width = <4>;pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;cd-gpios = <&gpk2 2 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";vmmc-supply = <&mmc_reg>;status = "okay";};

2.2 驱动配置

在sd初始化的时候使能了INSERET和REMOVAL中断,但是没有反应,还不知道为什么。

static void sdhci_init(struct sdhci_host *host, int soft)
{if (soft)sdhci_do_reset(host, SDHCI_RESET_CMD|SDHCI_RESET_DATA);elsesdhci_do_reset(host, SDHCI_RESET_ALL);host->ier = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT |SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT |SDHCI_INT_INDEX | SDHCI_INT_END_BIT | SDHCI_INT_CRC |SDHCI_INT_TIMEOUT | SDHCI_INT_DATA_END |SDHCI_INT_RESPONSE | SDHCI_INT_CARD_INSERT |SDHCI_INT_CARD_REMOVE;sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);if (soft) {/* force clock reconfiguration */host->clock = 0;sdhci_set_ios(host->mmc, &host->mmc->ios);}
}

查看系统中断的时候,可以发现是有sd中断的,所以gic配置是没问题的。也许是控制器有问题?要探究一下sd卡插入中断是如何产生的才行。

[root@osee ]#cat /proc/interrupts CPU0       CPU1       CPU2       CPU3       36:          0          0          0          0       GIC  89 Edge      mct_comp_irq37:      45888       5049       3401       1244       GIC  28 Edge      MCT44:         36          0          0          0       GIC 107 Edge      mmc0

Linux内核移植 part3:sdmmc驱动相关推荐

  1. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  2. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

    linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...

  3. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. 6410 linux内核移植

    linux内核移植(6410) linux内核移植一,硬件环境:友善之臂 tiny6410 开发板开发主机Linux系统:fedora 10 编译器:arm-linux-gcc-4.5.1 二,内核实 ...

  5. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  6. Linux内核移植漫谈——你不是第一个想移植Linux内核的人

    Jack:在读大学的时候我想过移植Linux操作系统. 我:现在呢? Jack:我还是想移植Linux操作系统.你教我移植吧. 我:你知道什么是"Linux内核移植"吗? Jack ...

  7. 支持v4l2 linux内核选项 s3c2440,linux内核移植-移植2.6.35.4内核到s3c2440

    原标题:linux内核移植-移植2.6.35.4内核到s3c2440 硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器: - -gcc 4.3.2 原创作品,转载请标明出处htt ...

  8. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  9. uboot和Linux内核移植

    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文. 请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接. 这篇 ...

最新文章

  1. 【Android】Activity生命周期(亲测)
  2. IT 往事录:苹果 Mac 之父,却在 Mac 问世前黯然退场
  3. 微信服务号 微信支付开发
  4. NYOJ 267 郁闷的C小加(二)
  5. spring中的aop术语和细节
  6. python中两个集合的运算并交补_三种方式实现 Python 中的集合的交、并、补运算...
  7. UITextField 和 UITextView实现字数限制 输入若干字以后就无法继续输入的功能
  8. python主要功能_Python主要功能
  9. 解决oracle客户端可以连接11g rac vip,但是不能连接scan ip问题
  10. 短语wipe the slate clean
  11. 卸载不了mysql2008_卸载SQL2008遇到的问题及解决办法
  12. 渝粤题库 陕西师范大学 《文学概论》作业
  13. unity打箱子小游戏demo
  14. 毕业论文开题报告撰写指南-宾夕法尼亚州立大学研究生写作中心
  15. 跑跑卡丁车rush服务器维护,跑跑卡丁车rush+每日必做事情整理得丰富奖励
  16. 游戏中的镜头语言和应用
  17. sqlzoo错题总结-1
  18. wxPython 4.2.0 发布
  19. 丑数(输出第n个丑数)
  20. 用 MQL5 向导创建您自己的 EA 交易

热门文章

  1. 微信小程序关于键盘行为的探索
  2. 通信的基本概念与通信系统的组成
  3. 【Uniapp 原生插件】商米内置打印机插件
  4. 【MAC使用技巧】打不开xxx.pkg,因为它来自身份不明的开发者
  5. SQLSever期末考试作业复习卷一
  6. 初步了解3d max 渲染器
  7. 成都理工大学计算机组成原理考试,计算机组成原理试题-20210320185321.doc-原创力文档...
  8. webstorm,phpstorm无法打开设置的问题
  9. 完美型性格的优势和不足,完美型人格的职业发展
  10. good 第一篇、教你学会看电路图轻松修手机