君正x1600平台适配at24cxx-eeprom芯片

君正x1600平台适配at24cxx-eeprom芯片 阿帅 2024-01-11 18:01:10 150

文章目录

概述

一般上,大多数平台适配at24-eeprom,只需要在dts中相应i2c总线下挂载设备信息,并打开at24驱动即可,例如:
dts:

138 &i2c0 {
139     status = "okay";
140     clock-frequency = <100000>;
141     timeout = <1000>;
142     pinctrl-names = "default";
143     pinctrl-0 = <&i2c0_pa>;
144 
145     at24c16: at24c16@57 {
146         compatible = "atmel,at24";
147         status = "okay";
148         reg = <0x57>;
149     };
150 };

config:

CONFIG_EEPROM_AT24=y

但是基于君正sdk开发时,采用上述方法,将不再适用,因为君正sdk中将所有驱动(除了时钟等内核启动时需要的驱动模块外),放在kernel外部,便于根据产品自定义外设驱动,同时设备信息不再通过dts维护,而在外设驱动中将设备信息输出给内核。

构建device信息

即填充i2c_board_info结构体
其中type用于和driver.name匹配
addr: 通过硬件原理图确定。
AT24Cxx设备地址有7位,前4位不变,为:1010, 后3位需要看A2-A0的硬件接线。

原理图中A2-A0上拉为高电平,故设备地址为0x57。

static struct i2c_board_info at24_device = {
    .type = "at24",
    .addr = I2C_ADDR,
};

移植at24驱动

(非必须步骤)将kernel/driver/misc/eeprom/at24.c拷贝到module_driver中,在外部维护,不污染kernel源码
1、在init中注册i2c设备

    i2c_client = i2c_register_device(&at24_device, i2c_bus_num);
    if (i2c_client == NULL) {
        printk(KERN_ERR "at24: failed to register i2c device\n");
        i2c_del_driver(&at24_driver);
        return -EINVAL;
    }

2、编译烧录镜像
dmesg可以看到,能够进入probe了,但probe会异常退出
定位原因是,i2c_device_id.driver_data为空。需经过如下修改:
i2c probe接口的struct i2c_device_id,即通过MODULE_DEVICE_TABLE(i2c, at24_ids)注册的id号
在probe中,将比较i2c_board_info.type和i2c_device_id.name,如果一致的话会判断i2c_device_id.driver_data是否为空,为空则异常
修改at24_ids表即可:

static const struct i2c_device_id at24_ids[] = {
    /* needs 8 addresses as A0-A2 are ignored */
    { "24c00", AT24_DEVICE_MAGIC(128 / 8, AT24_FLAG_TAKE8ADDR) },
    /* old variants can't be handled with this generic entry! */
    { "24c01", AT24_DEVICE_MAGIC(1024 / 8, 0) },
    { "24c02", AT24_DEVICE_MAGIC(2048 / 8, 0) },
    /* spd is a 24c02 in memory DIMMs */
    { "spd", AT24_DEVICE_MAGIC(2048 / 8,
        AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },
    { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },
    /* 24rf08 quirk is handled at i2c-core */
    { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) },
    { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) },
    { "24c32", AT24_DEVICE_MAGIC(32768 / 8, AT24_FLAG_ADDR16) },
    { "24c64", AT24_DEVICE_MAGIC(65536 / 8, AT24_FLAG_ADDR16) },
    { "24c128", AT24_DEVICE_MAGIC(131072 / 8, AT24_FLAG_ADDR16) },
    { "24c256", AT24_DEVICE_MAGIC(262144 / 8, AT24_FLAG_ADDR16) },
    { "24c512", AT24_DEVICE_MAGIC(524288 / 8, AT24_FLAG_ADDR16) },
    { "24c1024", AT24_DEVICE_MAGIC(1048576 / 8, AT24_FLAG_ADDR16) },
    { "at24", AT24_DEVICE_MAGIC(16384 / 8, 0) },
    { /* END OF LIST */ }
};

验证

安装驱动,适用i2ctool读写芯片

# i2cget -y -f 0 0x57 0
0xff
# i2cset -y -f 0 0x57 0 0x0
# i2cget -y -f 0 0x57 0
0x00

验证成功

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
阿帅
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
阿帅
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区