主题 : 2.6.24.7 sd有问  问题解决结贴 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 5071
精华: 0
发帖: 50
金钱: 390 两
威望: 297 点
综合积分: 100 分
注册时间: 2009-04-09
最后登录: 2013-12-20
楼主  发表于: 2010-06-09 16:16

 2.6.24.7 sd有问  问题解决结贴

如题在 2.6.24.7上增加sd驱动,源代码均为kernel自带的,修改smd2440.c

增加
static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = {
   .gpio_detect   = S3C2410_GPG8,
   .gpio_wprotect = S3C2410_GPH8,
   .set_power     = NULL,
   .ocr_avail     = MMC_VDD_32_33,
};

static struct platform_device *smdk2440_devices[] __initdata = {
    ……
    &s3c_device_sdi, //增加项
    
}

static void __init smdk2440_map_io(void)
{
    ……
    s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;//增加项
}

并在 make menuconfig 选中sd设备。
编译出来的内核不支持sd的热插拔了,开机前 插上sd,开机就能正常识别到sd,但不能热拔。开机后再插sd,就会报错。碰到这个错误还不知道怎么调,望路过的大侠给点意见。。在此谢过了。


801ba8b0----同一个地址,但是不知道是哪个函数里面有访问

热插
Unable to handle kernel paging request at virtual address 801ba8b0
pgd = c0004000
[801ba8b0] *pgd=00000000
Internal error: Oops: 0 [#1]
Modules linked in:
CPU: 0    Not tainted  (2.6.24.7 #27)
PC is at 0x801ba8b0
LR is at s3cmci_set_ios+0x98/0x1f8
pc : [<801ba8b0>]    lr : [<c01d5194>]    psr: a0000013
sp : c3c75ee8  ip : 00000013  fp : c3c75f14
r10: c3d7d800  r9 : c3d7d800  r8 : c3d7d948
r7 : c3d7d9c0  r6 : 0000014c  r5 : 00000015  r4 : 00000000
r3 : 801ba8b0  r2 : fb000040  r1 : 00000015  r0 : 00000001
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: c000717f  Table: 33e00000  DAC: 00000017
Process kmmcd (pid: 81, stack limit = 0xc3c74268)
Stack: (0xc3c75ee8 to 0xc3c76000)
5ee0:                   c02fc4e4 c004045c 00000000 00000015 0000014c c3c168a0
5f00: c3d7d890 c3d7d948 c3c75f5c c3c75f18 c01cda48 c01d510c 00000001 00000000
5f20: 00000015 00000000 00000000 c003aa90 00100100 c3d7d800 60000013 c3d7d968
5f40: c3c168a0 00000000 00000000 00000000 c3c75f84 c3c75f60 c01ce260 c01cd968
5f60: c0057bd0 c0057b9c 00000000 c3c6b6a0 c3c74000 c01ce1d8 c3c75fa4 c3c75f88
5f80: c004fae8 c01ce1e8 c3c74000 c3c6b6a8 c3c6b6a0 c3c168a0 c3c75fdc c3c75fa8
5fa0: c005013c c004fa3c c3c75fdc 00000000 c3c168a0 c0053ef8 c3c75fb8 c3c75fb8
5fc0: c3c6b6a0 c0050040 00000000 00000000 c3c75ff4 c3c75fe0 c0053a38 c0050050
5fe0: 00000000 00000000 00000000 c3c75ff8 c0042f58 c00539f0 00000000 00000000
Backtrace:
[<c01d50fc>] (s3cmci_set_ios+0x0/0x1f8) from [<c01cda48>] (mmc_power_up+0xf0/0x170)
[<c01cd958>] (mmc_power_up+0x0/0x170) from [<c01ce260>] (mmc_rescan+0x88/0x190)
[<c01ce1d8>] (mmc_rescan+0x0/0x190) from [<c004fae8>] (run_workqueue+0xbc/0x14c)
r6:c01ce1d8 r5:c3c74000 r4:c3c6b6a0
[<c004fa2c>] (run_workqueue+0x0/0x14c) from [<c005013c>] (worker_thread+0xfc/0x110)
r7:c3c168a0 r6:c3c6b6a0 r5:c3c6b6a8 r4:c3c74000
[<c0050040>] (worker_thread+0x0/0x110) from [<c0053a38>] (kthread+0x58/0x80)
r7:00000000 r6:00000000 r5:c0050040 r4:c3c6b6a0
[<c00539e0>] (kthread+0x0/0x80) from [<c0042f58>] (do_exit+0x0/0x6e0)
r5:00000000 r4:00000000
Code: bad PC value.
---[ end trace 188a2929e9158f77 ]---


热拔
Unable to handle kernel paging request at virtual address 801ba8b0
pgd = c0004000
[801ba8b0] *pgd=00000000
Internal error: Oops: 0 [#1]
Modules linked in:
CPU: 0    Not tainted  (2.6.24.7 #27)
PC is at 0x801ba8b0
LR is at s3cmci_set_ios+0xe0/0x1f8
pc : [<801ba8b0>]    lr : [<c01d51dc>]    psr: a0000013
sp : c3c75ed0  ip : 00000013  fp : c3c75efc
r10: c3d75800  r9 : 00000000  r8 : c3d75948
r7 : c3d759c0  r6 : c3d75968  r5 : c3d75800  r4 : 00000001
r3 : 801ba8b0  r2 : fb000040  r1 : 00000000  r0 : 00000000
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: c000717f  Table: 33e48000  DAC: 00000017
Process kmmcd (pid: 81, stack limit = 0xc3c74268)
Stack: (0xc3c75ed0 to 0xc3c76000)
5ec0:                                     c02fc4e4 c004045c 00000000 c3d75800
5ee0: c3d75968 c3c168a0 00000000 00000000 c3c75f2c c3c75f00 c01cd69c c01d510c
5f00: 00000000 00000000 00000000 00000000 00000000 c003aa90 c3d75800 c3d75800
5f20: c3c75f44 c3c75f30 c01cdb70 c01cd61c ffffff92 c3d75800 c3c75f5c c3c75f48
5f40: c01d0da0 c01cdaf8 c3d75800 c3c74000 c3c75f84 c3c75f60 c01ce32c c01d0d38
5f60: c0057bd0 c0057b9c 00000000 c3c6b6a0 c3c74000 c01ce1d8 c3c75fa4 c3c75f88
5f80: c004fae8 c01ce1e8 c3c74000 c3c6b6a8 c3c6b6a0 c3c168a0 c3c75fdc c3c75fa8
5fa0: c005013c c004fa3c c3c75fdc 00000000 c3c168a0 c0053ef8 c3c75fb8 c3c75fb8
5fc0: c3c6b6a0 c0050040 00000000 00000000 c3c75ff4 c3c75fe0 c0053a38 c0050050
5fe0: 00000000 00000000 00000000 c3c75ff8 c0042f58 c00539f0 00000000 00000000
Backtrace:
[<c01d50fc>] (s3cmci_set_ios+0x0/0x1f8) from [<c01cd69c>] (mmc_power_off+0x90/0x9c)
[<c01cd60c>] (mmc_power_off+0x0/0x9c) from [<c01cdb70>] (mmc_detach_bus+0x88/0xd4)
r5:c3d75800 r4:c3d75800
[<c01cdae8>] (mmc_detach_bus+0x0/0xd4) from [<c01d0da0>] (mmc_sd_detect+0x78/0x8c)
r5:c3d75800 r4:ffffff92
[<c01d0d28>] (mmc_sd_detect+0x0/0x8c) from [<c01ce32c>] (mmc_rescan+0x154/0x190)
r5:c3c74000 r4:c3d75800
[<c01ce1d8>] (mmc_rescan+0x0/0x190) from [<c004fae8>] (run_workqueue+0xbc/0x14c)
r6:c01ce1d8 r5:c3c74000 r4:c3c6b6a0
[<c004fa2c>] (run_workqueue+0x0/0x14c) from [<c005013c>] (worker_thread+0xfc/0x110)
r7:c3c168a0 r6:c3c6b6a0 r5:c3c6b6a8 r4:c3c74000
[<c0050040>] (worker_thread+0x0/0x110) from [<c0053a38>] (kthread+0x58/0x80)
r7:00000000 r6:00000000 r5:c0050040 r4:c3c6b6a0
[<c00539e0>] (kthread+0x0/0x80) from [<c0042f58>] (do_exit+0x0/0x6e0)
r5:00000000 r4:00000000
Code: bad PC value.
---[ end trace 1804b8c1796ea306 ]---


根据Backtrace信息,找到出错的地方,将s3cmci_set_ios函数里面的全注释掉,加上一条printk语句,依久出现Unable to handle kernel paging request at virtual address,根据Backtrace找到问题处自:s3cmci_get_ro  ---->调用s32410_gpio_getpin()上,阅读源码发现本意是读取写保护脚的值,记得根据mini的原理图设置的是GPH8,而此时是给s32410_gpio_getpin()传的参不是这个GPH8的值!于是怀疑驱动在获得平台数据的时候出错,更改s3cmci_probe函数,    
host->pdata = pdev->dev.platform_data;
//if (!host->pdata) {
     pdev->dev.platform_data = &s3cmci_def_pdata;
    host->pdata = &s3cmci_def_pdata;
//}注释掉判断,直接给pdev->dev.platform_data ,host->pdata赋值,同时更改static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
    .do_dma        = 0,
    .gpio_detect    = S3C2410_GPG8,
    .gpio_wprotect = S3C2410_GPH8,
    .set_power    = NULL,
    .ocr_avail    = MMC_VDD_32_33,
};
编译测试,问题解决,但是会在初始化sd开的出现错误,driver/mmc/core/sd.c 的mmc_sd_init_card()函数中mmc_read_switch前延时10ms
  mdelay(10);
      err = mmc_read_switch(card);
问题解决。

但是有新的疑问:
在mach-smdk2440.c修改了
static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = {
   .gpio_detect   = S3C2410_GPG8,
   .gpio_wprotect = S3C2410_GPH8,
   .set_power     = NULL,
   .ocr_avail     = MMC_VDD_32_33,
};

static void __init smdk2440_machine_init(void)
{
    s3c24xx_fb_set_platdata(&smdk2440_fb_info);
    set_s3c2410ts_info(&smdk2440_ts_cfg);
    s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
    smdk_machine_init();
}
问题1:此处的值没有给驱动传递过去?
问题2:修改前的驱动加上sd卡开机,能正常使用sd卡,那么驱动执行的代码和开机后热插有区别,具体代码执行步骤得细分析。
问题3:插上sd卡的时候,网络会断掉,接着联上。
[ 此帖被robin在2010-06-11 11:43重新编辑 ]