Linux内核移植 part3:sdmmc驱动
一种纯粹靠读书学来的真理,与我们的关系,就像假肢、假牙、蜡鼻子甚或人工植皮。而由独立思考获得的真理就如我们天生的四肢:只有它们才属于我们。 —— 叔本华
读书的价值在于认识你自己,而不是用填鸭式的知识来武装自己。今天的主题是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驱动相关推荐
- linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx
Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...
- linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...
- 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 6410 linux内核移植
linux内核移植(6410) linux内核移植一,硬件环境:友善之臂 tiny6410 开发板开发主机Linux系统:fedora 10 编译器:arm-linux-gcc-4.5.1 二,内核实 ...
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- Linux内核移植漫谈——你不是第一个想移植Linux内核的人
Jack:在读大学的时候我想过移植Linux操作系统. 我:现在呢? Jack:我还是想移植Linux操作系统.你教我移植吧. 我:你知道什么是"Linux内核移植"吗? Jack ...
- 支持v4l2 linux内核选项 s3c2440,linux内核移植-移植2.6.35.4内核到s3c2440
原标题:linux内核移植-移植2.6.35.4内核到s3c2440 硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器: - -gcc 4.3.2 原创作品,转载请标明出处htt ...
- Linux内核移植和根文件系统制作(详细步骤精讲)
第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...
- uboot和Linux内核移植
这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文. 请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接. 这篇 ...
最新文章
- 【Android】Activity生命周期(亲测)
- IT 往事录:苹果 Mac 之父,却在 Mac 问世前黯然退场
- 微信服务号 微信支付开发
- NYOJ 267 郁闷的C小加(二)
- spring中的aop术语和细节
- python中两个集合的运算并交补_三种方式实现 Python 中的集合的交、并、补运算...
- UITextField 和 UITextView实现字数限制 输入若干字以后就无法继续输入的功能
- python主要功能_Python主要功能
- 解决oracle客户端可以连接11g rac vip,但是不能连接scan ip问题
- 短语wipe the slate clean
- 卸载不了mysql2008_卸载SQL2008遇到的问题及解决办法
- 渝粤题库 陕西师范大学 《文学概论》作业
- unity打箱子小游戏demo
- 毕业论文开题报告撰写指南-宾夕法尼亚州立大学研究生写作中心
- 跑跑卡丁车rush服务器维护,跑跑卡丁车rush+每日必做事情整理得丰富奖励
- 游戏中的镜头语言和应用
- sqlzoo错题总结-1
- wxPython 4.2.0 发布
- 丑数(输出第n个丑数)
- 用 MQL5 向导创建您自己的 EA 交易
热门文章
- 微信小程序关于键盘行为的探索
- 通信的基本概念与通信系统的组成
- 【Uniapp 原生插件】商米内置打印机插件
- 【MAC使用技巧】打不开xxx.pkg,因为它来自身份不明的开发者
- SQLSever期末考试作业复习卷一
- 初步了解3d max 渲染器
- 成都理工大学计算机组成原理考试,计算机组成原理试题-20210320185321.doc-原创力文档...
- webstorm,phpstorm无法打开设置的问题
- 完美型性格的优势和不足,完美型人格的职业发展
- good 第一篇、教你学会看电路图轻松修手机