免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3127 | 回复: 1
打印 上一主题 下一主题

[驱动] 2.6.36.2内核里的i2c_client怎么使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-29 14:56 |只看该作者 |倒序浏览
2.6.36.2内核里的i2c_client怎么使用
最近在弄ok6410开发板,把以前在mini2440板子上能跑起来的fm驱动植入ok6410,但是出了问题,特来求救。。。
先说明一下,mini2440使用的内核是2.6.32.2,而ok6410的内核是2.6.36.2,
我把驱动的关键部分贴出来,给大家看看,出问题的地方就在i2c_fm_write函数里面的这句话上面:adap = fm->client->adapter;
我知道32和36内核关于i2c_adapter的定义是有区别的,但是关于这些没经验啊,不知道如何修改才能是驱动在36内核里跑起来,希望有过经验或是懂的能给点指导,非常感激了!
关键代码如下:
static struct fm_tea5767hn {
       struct i2c_client *client;
} *fm;

static int fm_probe(struct i2c_client *client,const struct i2c_device_id *id)
{              
        printk("FM probe\n");        

        struct device *dev = &client->dev;

        fm = kzalloc(sizeof(struct fm_tea5767hn), GFP_KERNEL);
        if (fm == NULL) {
                   dev_err(dev, "failed to create our fm/n");
                   return -ENOMEM;
        }

        fm->client = client;
        i2c_set_clientdata(client, fm);

        dev_info(dev, "my fm client created/n");

        return 0;
}

static int __devexit fm_remove(struct i2c_client *client)
{        
    printk(KERN_ALERT "FM removes\n");        

    fm = i2c_get_clientdata(client);

    kfree(fm);

    return 0;
}

static struct i2c_device_id fm_idtable[] = {
    { "fm", 0 },
    { }
};

static struct i2c_driver i2c_fm_driver = {

    .driver = {
                .name = "fm_driver",
                .owner = THIS_MODULE,
        },
    .id_table        =        fm_idtable,
    .probe           =        fm_probe,
    .remove          =        fm_remove,     

};

static void i2c_fm_init (void)

{
             printk("I2C addr driver ready!\n");
       
        if ((i2c_add_driver( &i2c_fm_driver )))

        {

                printk("I2C addr driver failed\n");

                return;

        }

}

static int i2c_fm_read(u8 *data)

{

        struct i2c_msg msg;
            struct i2c_adapter *adap;

        char buf[5];

        int i, ret;



        for (i=0; i<5; i++)

                buf[i]=0;



         //initialize the message structure

         

        msg.addr = I2C_ADDR_TEA5767HN;   //i2c_fm_client.addr;

        msg.flags = I2C_M_RD;

        msg.len = 5;

        msg.buf = buf;

            adap = fm->client->adapter;       

            ret = i2c_transfer(adap, &msg, 1);

       

        for (i=0; i<5; i++){

                *data++ = buf[i];     //*p++ = buf[i];
        }



              //printk("read ret = %d \n",ret);
            return ret;

}

static int i2c_fm_write (u8 *data)

{



        struct i2c_msg msg;
            struct i2c_adapter *adap;      

        char buf[5];

        int i, ret;

               

        for(i=0;i<5;i++){

                buf[i] = *data++;   

        }   

        //initialize the message structure

       

        msg.addr = I2C_ADDR_TEA5767HN;

        msg.flags = 0;

        msg.len = 5;

        msg.buf = buf;
            printk("msg is right! \n");

            adap = fm->client->adapter;
            printk("adapter is right! \n");        
      

        ret = i2c_transfer(adap, &msg, 1);
            printk("write ret = %d \n",ret);



        return ret;

}

论坛徽章:
0
2 [报告]
发表于 2011-12-29 15:06 |只看该作者
哦,对了,我把错误也贴出来:

FM Radio TEA5767HN driver for i.MX21, Gary.
I2C addr driver ready!
FM Radio TEA5767HN is ready!
register chardev is ok!
msg is right!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = cdd70000
[00000000] *pgd=5dd4b031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
last sysfs file: /sys/class/graphics/fb0/virtual_size
Modules linked in: OK6410_fm(+)
CPU: 0    Not tainted  (2.6.36.2 #383)
PC is at i2c_fm_write+0x60/0xa8 [OK6410_fm]
LR is at release_console_sem+0x1a8/0x1f8
pc : [<bf00011c>]    lr : [<c004dcbc>]    psr: 60000113
sp : cdd47df0  ip : c0735230  fp : cdd47e1c
r10: c0735230  r9 : bf004000  r8 : cdd46000
r7 : 00000000  r6 : 00000000  r5 : bf001044  r4 : 00000000
r3 : bf0011c0  r2 : 00000000  r1 : 0000e631  r0 : bf000afc
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5dd70008  DAC: 00000015
Process modprobe (pid: 123, stack limit = 0xcdd4626
Stack: (0xcdd47df0 to 0xcdd48000)
7de0:                                     00000000 00000060 bf000005 cdd47e03
7de0:                                     00000000 00000060 bf000005 cdd47e03
7e20: bf004050 912ae434 cdd47e4c cdd47e38 bf004094 bf000170 c006d898 00000000
7e40: cdd47e94 cdd47e50 c003247c bf00400c 00000000 c00d2b24 00000000 00000000
7e60: bf001044 00000000 00000000 00000000 bf001044 00000000 00000000 bf001040
7e80: 00000028 c0735230 cdd47fa4 cdd47e98 c007cd1c c003234c 00000000 00000000
7ea0: 00000000 cdd46000 bf00104c 00000000 0000007a bf0040f4 d08589f4 bf004884
7ec0: c04acef4 0000007a 00000000 d0845000 0001a1ce d085824c d085803e d085ee94
7ee0: cdd94800 000011c4 000015a4 00000000 00000000 00000031 00000032 0000001b
7f00: 00000018 00000017 00000000 00000000 00000000 00000000 00000000 00000000
7f20: 00000000 00000000 00000000 00000000 00000000 00000000 6e72656b 00006c65
7f40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
7f60: 00000000 00000000 00000000 00000000 00000000 590e45f9 cdd94d80 010841a8
7f80: 010901e0 00000000 00000080 c0032b68 cdd46000 00000000 00000000 cdd47fa8
7fa0: c00329c0 c007cbe8 010841a8 010901e0 010901e0 0001a1ce 000d5bf9 ffff5f01
7fc0: 010841a8 010901e0 00000000 00000080 01084028 00000000 00000000 bee77e78
7fe0: 010841c0 bee77adc 0002120c 40228d74 60000010 010901e0 00000000 00000000
[<bf00011c>] (i2c_fm_write+0x60/0xa8 [OK6410_fm]) from [<bf0001b8>] (set_search)
[<bf0001b8>] (set_searched_station+0x54/0x60 [OK6410_fm]) from [<bf004094>] (te)
[<bf004094>] (tea5767hn_init+0x94/0xf4 [OK6410_fm]) from [<c003247c>] (do_one_i)
[<c003247c>] (do_one_initcall+0x13c/0x194) from [<c007cd1c>] (sys_init_module+0)
[<c007cd1c>] (sys_init_module+0x140/0xf94) from [<c00329c0>] (ret_fast_syscall+)
Code: eb4138c4 e59f3040 e59f0040 e5932000 (e5921000)
---[ end trace 31633a208198f998 ]---
Segmentation fault
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP