打印
[技术问答]

I2C bus 添加 设备问题求教

[复制链接]
2352|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lbb121358|  楼主 | 2019-9-16 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前 论坛中有大佬遇到过类似问题

求教

平台nuc970 问题是I2C bus 上面添加设备无效,希望大神来解决,跪谢

I2C 总线0 连接的是音频sgtl5000
往总线0上添加这个设备 arch/arm/mach-nuc970/dev.c

#if defined(CONFIG_I2C_BUS_NUC970_P0) || defined(CONFIG_I2C_BUS_NUC970_P0_MODULE)
// port 0
/* I2C clients */
static struct i2c_board_info __initdata nuc970_i2c_clients0[] =
{
        {I2C_BOARD_INFO("sgtl5000", 0x0a),},
};
static struct resource nuc970_i2c0_resource[] = {
        [0] = {
                .start = NUC970_PA_I2C0,
                .end   = NUC970_PA_I2C0 + NUC970_SZ_I2C0 - 1,
                .flags = IORESOURCE_MEM,
        },
        [1] = {
                .start = IRQ_I2C0,
                .end   = IRQ_I2C0,
                .flags = IORESOURCE_IRQ,
        }
};

static struct nuc970_platform_i2c nuc970_i2c0_data = {
        .bus_num = 0,
        .bus_freq = 100000,
};

struct platform_device nuc970_device_i2c0 = {
        .name                  = "nuc970-i2c0",
        .id                  = -1,
        .num_resources          = ARRAY_SIZE(nuc970_i2c0_resource),
        .resource          = nuc970_i2c0_resource,
                .dev = {
                .platform_data = &nuc970_i2c0_data,
            }
};
#endif

注册client
#if defined(CONFIG_I2C_BUS_NUC970_P0) || defined(CONFIG_I2C_BUS_NUC970_P0_MODULE)
        i2c_register_board_info(0, nuc970_i2c_clients0, sizeof(nuc970_i2c_clients0)/sizeof(struct i2c_board_info));

sgtl5000.c里的driver struct

static struct i2c_driver sgtl5000_i2c_driver = {
        .driver = {
                   .name = "sgtl5000",
                   .owner = THIS_MODULE,
                   .of_match_table = sgtl5000_dt_ids,
                   },
        .probe = sgtl5000_i2c_probe,
        .remove = sgtl5000_i2c_remove,
        .id_table = sgtl5000_id,
};

这里是i2c tools的测试结果
[root@mcuzone two]#./i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          [ 2515.410000] nuc970-i2c0 nuc970-i2c0: cannot get bus (
error -110)


使用特权

评论回复
沙发
Lbb121358|  楼主 | 2019-9-16 17:04 | 只看该作者
[root@mcuzone two]#./i2cdump -f -y 0 0x0a
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcd
ef00: [ 2614.820000] nuc970-i2c0 nuc970-i2c0: cannot get bus (error -11
0)[ 2622.820000] nuc970-i2c0 nuc970-i2c0: cannot get bus (error -110)
XX ^C[ 2630.820000] nuc970-i2c0 nuc970-i2c0: cannot get bus (error -1
10)

使用特权

评论回复
板凳
yiy| | 2019-9-16 18:58 | 只看该作者
去牛卧堂问问看。

使用特权

评论回复
地板
zhuomuniao110| | 2019-9-16 21:37 | 只看该作者
ARM9的没用过

使用特权

评论回复
5
xinpian101| | 2019-9-16 21:44 | 只看该作者
去新唐官方的蜗牛糖看看

使用特权

评论回复
6
Lbb121358|  楼主 | 2019-9-17 17:20 | 只看该作者
[root@mcuzone two]#./i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- UU -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --  

使用特权

评论回复
7
Lbb121358|  楼主 | 2019-9-17 17:21 | 只看该作者
请教各位大佬,已解决的方法,跪求,万分感激

使用特权

评论回复
8
Lbb121358|  楼主 | 2019-9-17 17:21 | 只看该作者
yiy 发表于 2019-9-16 18:58
去牛卧堂问问看。

现在没权限

使用特权

评论回复
9
Lbb121358|  楼主 | 2019-9-17 17:23 | 只看该作者
xinpian101 发表于 2019-9-16 21:44
去新唐官方的蜗牛糖看看

上面没有这个的解决方法,21ic大佬有遇到类似的问题

使用特权

评论回复
10
s2333| | 2019-9-17 22:32 | 只看该作者
这里的nuc970-i2c0 nuc970-i2c0: cannot get bus (error -110)提示,对i2c总线上的设备进行访问时,超时了。

static struct i2c_driver sgtl5000_i2c_driver = {
        .driver = {
                   .name = "sgtl5000",
                   .owner = THIS_MODULE,
                   .of_match_table = sgtl5000_dt_ids,
                   },
        .probe = sgtl5000_i2c_probe,
        .remove = sgtl5000_i2c_remove,
        .id_table = sgtl5000_id,
};
这里的:
sgtl5000_id定义了吗,他的名称要和你写的I2C_BOARD_INFO名称相同;
sgtl5000_i2c_probe和sgtl5000_i2c_remove也不能少;
我大致只能想到这些,希望能帮到你吧

使用特权

评论回复
11
Lbb121358|  楼主 | 2019-9-19 11:14 | 只看该作者
s2333 发表于 2019-9-17 22:32
这里的nuc970-i2c0 nuc970-i2c0: cannot get bus (error -110)提示,对i2c总线上的设备进行访问时,超时了 ...

定义了 sqtl5000_id

static const struct i2c_device_id sgtl5000_id[] = {
        {"sgtl5000", 0},
        {},
};

使用特权

评论回复
12
Lbb121358|  楼主 | 2019-9-19 11:16 | 只看该作者
Lbb121358 发表于 2019-9-19 11:14
定义了 sqtl5000_id

static const struct i2c_device_id sgtl5000_id[] = {

与I2C_BOARD_INFO相同

static struct i2c_board_info __initdata nuc970_i2c_clients0[] =
{
        {I2C_BOARD_INFO("sgtl5000", 0x0a),},
};

使用特权

评论回复
13
Lbb121358|  楼主 | 2019-9-19 11:17 | 只看该作者
Lbb121358 发表于 2019-9-19 11:16
与I2C_BOARD_INFO相同

static struct i2c_board_info __initdata nuc970_i2c_clients0[] =

static int sgtl5000_i2c_probe(struct i2c_client *client,
                              const struct i2c_device_id *id)
{
        struct sgtl5000_priv *sgtl5000;
        int ret;

        sgtl5000 = devm_kzalloc(&client->dev, sizeof(struct sgtl5000_priv),
                                                                GFP_KERNEL);
        if (!sgtl5000)
                return -ENOMEM;

        i2c_set_clientdata(client, sgtl5000);
        printk("start codec register in %s\n", __FUNCTION__);

        ret = snd_soc_register_codec(&client->dev,
                        &sgtl5000_driver, &sgtl5000_dai, 1);
        return ret;
}

static int sgtl5000_i2c_remove(struct i2c_client *client)
{
        snd_soc_unregister_codec(&client->dev);

        return 0;
}

使用特权

评论回复
14
s2333| | 2019-9-19 15:32 | 只看该作者
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_name        = "sgtl5000.0-000a",   试试看,你的sgtl5000放在总线0上了...

使用特权

评论回复
15
Lbb121358|  楼主 | 2019-9-19 16:58 | 只看该作者
s2333 发表于 2019-9-19 15:32
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_n ...

D:\1

使用特权

评论回复
16
Lbb121358|  楼主 | 2019-9-19 17:03 | 只看该作者
s2333 发表于 2019-9-19 15:32
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_n ...

修改之后,是这样


static struct snd_soc_dai_link nuc970evb_i2s_dai = {
                .name       = "IIS",
                .stream_name    = "IIS HiFi",
                .cpu_dai_name   = "nuc970-audio-i2s",
                .codec_dai_name = "sgtl5000",
                .codec_name     = "sgtl5000.0-000a",
                .ops        = &nuc970_audio_ops,
                .platform_name = "nuc970-audio-pcm.0",
};

使用特权

评论回复
评论
s2333 2019-9-19 21:53 回复TA
ret = snd_soc_register_codec(&client->dev, &sgtl5000_driver, &sgtl5000_dai, 1); 是上面对应注册驱动的dai,我不知道你这里具体是对应的哪个; 先试试吧,不行的话我也没辙了; 实在不行就只能在程序里多放几个printfk()来输出标记,然后运行查看到哪里出现问题停止了。 
17
Lbb121358|  楼主 | 2019-9-20 11:12 | 只看该作者
s2333 发表于 2019-9-19 15:32
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_n ...

16楼
是目录sound\soc\nuc970下的 nuc970-audio.c

使用特权

评论回复
18
Lbb121358|  楼主 | 2019-9-23 13:32 | 只看该作者
s2333 发表于 2019-9-17 22:32
这里的nuc970-i2c0 nuc970-i2c0: cannot get bus (error -110)提示,对i2c总线上的设备进行访问时,超时了 ...

大神,我已经找到原因了

使用特权

评论回复
19
Lbb121358|  楼主 | 2019-9-23 13:42 | 只看该作者
s2333 发表于 2019-9-19 15:32
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_n ...

linux-3.10.x\sound\soc\codecs\sgtl5000.c 这个文件 不相同的原因

使用特权

评论回复
20
Lbb121358|  楼主 | 2019-9-23 13:43 | 只看该作者
s2333 发表于 2019-9-19 15:32
你的sgtl5000.c中,有没有xxx_sgtl5000_dai[],它里面  .codec_name        = "sgtl5000.1-000a",这个改为 .codec_n ...

主要在怎么修改?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

31

帖子

0

粉丝