当前位置:  技术问答>linux和unix

linux SD卡驱动移植问题

    来源: 互联网  发布时间:2017-01-17

    本文导语:  本帖最后由 prettyboybaoxiaopeng 于 2011-05-17 14:41:39 编辑 我想在博创的平台移植SD卡驱动 Linux-2.6.29的SD卡platform_driver在drivers/mmc/host/sdhci-s3c.c下,在arch/arm/plat-s3c/dev-hsmmc.c中,在arch/arm/mach-s3c6410/mach-smdk6410.c中对&s3c_device_hsmmc0...

本帖最后由 prettyboybaoxiaopeng 于 2011-05-17 14:41:39 编辑
我想在博创的平台移植SD卡驱动

Linux-2.6.29的SD卡platform_driver在drivers/mmc/host/sdhci-s3c.c下,在arch/arm/plat-s3c/dev-hsmmc.c中,在arch/arm/mach-s3c6410/mach-smdk6410.c中对&s3c_device_hsmmc0进行platform_device的注册。

我查看原理图发现SD卡座的CLK接GPG0,CMD接GPG1,DATA0-DATA3接GPG2-GPG5,您说的CD中断信号线接GPG6,于是我的resource为默认

static struct resource s3c_hsmmc_resource[] = {
[0] = {
.start = S3C_PA_HSMMC0,
.end = S3C_PA_HSMMC0 + S3C_SZ_HSMMC - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_HSMMC0,
.end   = IRQ_HSMMC0,
.flags = IORESOURCE_IRQ,
}
};

另外WP引脚接的是GPN9,我认为没有作用,所以没有管它。

内核启动之后显示

sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (24000000 Hz)
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080

插入SD卡后显示

s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080

进入了中断,但没有正确识别SD卡

比较博创linux-2.6.21内核代码,以为是时钟不对。
SD卡的时钟部分我发现在启动时会调用s3c6410_map_io,它又会调用s3c6410_default_sdhci0();

static inline void s3c6410_default_sdhci0(void)
{
s3c_hsmmc0_def_platdata.clocks = s3c6410_hsmmc_clksrcs;
s3c_hsmmc0_def_platdata.cfg_gpio = s3c6410_setup_sdhci0_cfg_gpio;
s3c_hsmmc0_def_platdata.cfg_card = s3c6410_setup_sdhci0_cfg_card;
}
其中s3c6410_hsmmc_clksrcs,s3c6410_setup_sdhci0_cfg_gpio,s3c6410_setup_sdhci0_cfg_card;都在定义在arch/arm/mach-s3c6410/setup-sdhci.c中,s3c6410_hsmmc_clksrcs就给出了时钟源。

于是将博创linux-2.6.21内核arch/arm/mach-s3c6410/clock.c文件中的

static struct clk clk_hsmmc_DOUTmpll_mmc0 = {
.name     = "sclk_DOUTmpll_mmc0",
.id     = -1,
.parent   = &clk_mpll_uart,
.enable   = s3c_clkcon_enable,
.ctrlbit  = S3C_CLKCON_SCLK_MMC0,
.get_rate  = s3c6410_getrate_DOUTmpll_hsmmc_clk,
.usage    = 0,
};

结构体经过一番努力的修改移植到了linux-2.6.29中,后指定s3c6410_hsmmc_clksrc时钟name为sclk_DOUTmpll_mmc0,重新启动后依旧进入中断,但无法识别真确SD卡。

无奈在sdhci-s3c.c的sdhci_s3c_probe()中加入调试代码,

printk(KERN_INFO "[in_probe]: %s.%d: at 0x%p with irq %d. clk src:",pdev->name, pdev->id, host->ioaddr, host->irq);
        for (i=0; iclk_bus[i]))
                        printk(" %s", (sc->clk_bus[i])->name);
        }
        printk("n");
在drivers/mmc/host/sdhci.c的irqreturn_t sdhci_irq函数中加入
printk(KERN_ALERT "in sdhci_irqn");
printk(KERN_ALERT "*** %s got interrupt: 0x%08xn",mmc_hostname(host->mmc), intmask);

调试输出
[in_probe]: s3c-sdhci.0: at 0xc887e000 with irq 88. clk src: hsmmc sclk_DOUTmpll_mmc0
……
插入SD后显示

s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
in sdhci_irq
*** mmc0 got interrupt: 0x00000001
s3c6410_setup_sdhci0_cfg_card: CTRL 2=c0004100, 3=80808080
in sdhci_irq
*** mmc0 got interrupt: 0x00018001
in sdhci_irq
*** mmc0 got interrupt: 0x00018001
in sdhci_irq
*** mmc0 got interrupt: 0x00018001
in sdhci_irq
*** mmc0 got interrupt: 0x00018001
in sdhci_irq
……

查阅s3c6410数据手册,NORINTSTS0的定义
 
0x8001的第15位为1,说明发生了错误,但我不知道错误在哪里?

注:后来我将driver下mmc整个文件夹删除,从linux-2.6.21下的mmc拷贝过来,将有关的的头文件,一并拷贝过来,经过一番修改,加入调试代码,驱动顺利加载,但却出现了同样的现象,能进入中断,但读取NORINTSTS0时的第15位都为1。

|
内核中的sdhci-s3c.c很强壮的。
可能的原因:如果是6410,GPG6不能同时做为MMC0与MMC1的CD线的。如果你板子中使用的s3c_device_hsmmc1,那GPG6是配置成MMC1的CD线的。

|
崩提了,我调了两个星期,一张SD卡可以正常启动,两张就不行了,也就是只添加一个设备可以,你试试删掉一个试备。

    
 
 

您可能感兴趣的文章:

  • LINUX 下网卡驱动
  • Linux无线网卡驱动 MADWIFI
  • linux-2.6.32.16内核下SD卡驱动的移植需要打补丁不?
  • 联想ThinkPad E520求Linux版的无线网卡驱动
  • 请问linux中如何跟踪调试USB无线网卡驱动
  • Linux下笔记本broadcom无线网卡驱动的安装?
  • linux-2.6.2x内核的SD卡驱动移植问题
  • Linux有声卡驱动,有设备文件,没声音?
  • [求助]Linux下dell的无线网卡驱动的安装
  • linux2.6.8内核装intel wifi link 5100无线网卡驱动的问题?
  • 毫无疑问龙芯电脑的出世是我国的一件大事,不知从哪一版的Linux移植过去的?移植Linux复杂吗?
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • mx27开发板Linux移植问题请教
  • 关于在2440上移植linux的问题
  • WINDOWS GDI程序如何移植到LINUX下?望高手们赐教!!!
  • linux上的c程序移植到solaris 10 需要作哪些工作
  • 请教:软件从VxWorks移植到Linux
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • 关于windows代码向linux移植的问题
  • 如何将lwIP移植到linux中?
  • 急!--请教移植linux内核!
  • 征将linux 的程序移植到 windows的方案
  • 为什么ARM下linux移植那么多,但是手机却没有用linux操作系统?
  • linux下移植KVM的问题
  • 如何把dos下的一个画图程序移植到linux下
  • arm-linux下移植sqlite
  • vc程序怎样移植到Linux下????(在线等待特急)
  • 请大家帮忙提供资料:如何将windows系统服务程序移植为linux系统服务?
  • linux 程序移植到windwos下
  • Windows -> Linux 移植问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • linux 繁体 汉字输入法 问题 linux 繁体 汉字输入法 问题
  • Linux 下c++开发error while loading shared libraries问题解决
  • 先安装linux,后安装winxp,能否解决正常启动linux的问题不?(初学者问题,很容易回答)
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • Linux新手问,Linux安装问题。
  • linux下游戏问题。(菜鸟问题)
  • 初学Linux,发现Linux下的版本问题很头痛。【系列问题】
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • 一个很菜的问题,关ARM与linux内核裁剪的问题!
  • vmware装的linux,通过win2000访问linux的web服务器有问题
  • 初次接触linux,关于linux 用户权限问题请教!
  • Linux下是否存在磁盘碎片问题和内存碎片问题?
  • linux开发的应用程序部署到其他linux的问题
  • vmware上装LINUX的问题,WIN7可以拼的通linux的IP,linux拼不通win7的IP
  • Linux互ping在局域网内大量丢包,但是linux和windows互ping就没问题。
  • 最菜的问题—关于linux“动态库”的问题
  • linux下挂载linux分区的问题
  • 一个小问题。Linux下编程语言的问题。
  • linux问题 secureCRT连接的问题 在线等急!~~
  • Linux下环境变量问题以及FLEX安装问题
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3