如何注册管理I2C设备

方法一:静态声明 I2C 设备

I2C总线事先已知设备的编号,用于预先声明总线上的I2C器件。此信息在不同的体系结构上以不同的方式提供给内核:设备树、ACPI 或主板文件。当有问题的I2C总线被注册时,I2C器件将由i2c内核自动实例化。当设备所在的 I2C 总线消失(如果有)时,设备将自动解除绑定并销毁。

  • 设备树声明I2C设备

i2c1: i2c@400a0000 {
        /* ... master properties skipped ... */
        clock-frequency = <100000>;

        flash@50 {
                compatible = "atmel,24c256";
                reg = <0x50>;
        };

        pca9532: gpio@60 {
                compatible = "nxp,pca9532";
                gpio-controller;
                #gpio-cells = <2>;
                reg = <0x60>;
        };
};

  • 板级声明I2C设备                                                                                                 

通过电路板文件实例化 I2C 器件是通过调用 i2c_register_board_info()来注册的结构i2c_board_info阵列完成的。

eg:

static struct i2c_board_info h4_i2c_board_info[] __initdata = {
      {
              I2C_BOARD_INFO("isp1301_omap", 0x2d),
              .irq            = OMAP_GPIO_IRQ(125),
      },
      {       /* EEPROM on mainboard */
              I2C_BOARD_INFO("24c01", 0x52),
              .platform_data  = &m24c01,
      },
      {       /* EEPROM on cpu card */
              I2C_BOARD_INFO("24c01", 0x57),
              .platform_data  = &m24c01,
      },
};

static void __init omap_h4_init(void)
{
      (...)
      i2c_register_board_info(1, h4_i2c_board_info,
                      ARRAY_SIZE(h4_i2c_board_info));
      (...)
}

方法二:显式实例化设备

一个典型的例子是电视适配器。这些可以视频解码器,音频解码器等,通常通过I2C总线连接到主芯片。您事先不知道 I2C 总线的编号,因此无法使用上述方法 一。相反,您可以显式实例化 I2C 设备。这是通过填充结构i2c_board_info并调用 i2c_new_client_device() 来完成的

eg:

static struct i2c_board_info sfe4001_hwmon_info = {
      I2C_BOARD_INFO("max6647", 0x4e),
};

int sfe4001_init(struct efx_nic *efx)
{
      (...)
      efx->board_info.hwmon_client =
              i2c_new_client_device(&efx->i2c_adap, &sfe4001_hwmon_info);

      (...)
}

这种情况的变体是当您不确定是否存在I2C设备时,或者它可能由于厂商配置具有不同的地址。在这种情况下,您可以调用 i2c_new_scanned_device() 而不是 i2c_new_client_device()。 

eg:

static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };

static int usb_hcd_nxp_probe(struct platform_device *pdev)
{
      (...)
      struct i2c_adapter *i2c_adap;
      struct i2c_board_info i2c_info;

      (...)
      i2c_adap = i2c_get_adapter(2);
      memset(&i2c_info, 0, sizeof(struct i2c_board_info));
      strscpy(i2c_info.type, "isp1301_nxp", sizeof(i2c_info.type));
      isp1301_i2c_client = i2c_new_scanned_device(i2c_adap, &i2c_info,
                                                  normal_i2c, NULL);
      i2c_put_adapter(i2c_adap);
      (...)
}

备注:

1. i2c_new_client_device() 或 i2c_new_scanned_device()获取client

2.  i2c_unregister_device()注销client设备

方法三:探测某些设备的I2C总线

方法四:从用户空间实例化

在开发的过程中,对于不开源的操作系统,不能通过设备树去添加管理设备,我们就可以通过用户层去手动添加注册和移除设备(new_device和delete_device)

eg:

# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

虽然此接口应仅在无法执行内核内设备声明时使用,但在很多情况下,它都会有所帮助:

  • I2C 驱动程序通常检测设备(上面的方法 3),但设备所在的总线段没有设置正确的类位,因此不会触发检测。

  • I2C 驱动程序通常会检测设备,但设备位于意外的地址。

  • I2C 驱动程序通常会检测设备,但未检测到您的设备,因为检测例程过于严格,或者因为您的设备尚未正式受支持,但您知道它是兼容的。

  • 您正在测试板上开发驱动程序,您自己焊接了I2C器件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 简介  1.1 选择iphone版cocos2d的理由   1.1.1 免费   1.1.2 开源   1.1.3 objective-c   1.1.4 2d游戏引擎   1.1.5 物理引擎   1.1.6 技术难度较低   1.1.7 依然需要编程   1.1.8 超棒的cocos2d社区  1.2 注意事项   1.2.1 section 3.3.1   1.2.2 平台移植  1.3 本书读者对象  1.4 阅读前提   1.4.1 编程经验   1.4.2 objective-c  1.5 本书内容   1.5.1 ios游戏开发新手将学会什么   1.5.2 iphone应用程序开发者将学会什么   1.5.3 cocos2d开发者将学会什么  1.6 章节介绍  1.7 问题和反馈 第2章 入门  2.1 准备工作   2.1.1 系统要求   2.1.2 注册成为ios开发者   2.1.3 证书和授权文件   2.1.4 下载并安装iphone sdk   2.1.5 下载并安装cocos2d  2.2 helloworld应用程序   2.2.1 helloworld文件在项目中的位置   2.2.2 资源   2.2.3 其他资源   2.2.4 类  2.3 cocos2d中的内存管理问题  2.4 改变世界  2.5 你还应该知道的   2.5.1 ios设备   2.5.2 关于内存的使用   2.5.3 模拟器   2.5.4 关于日志  2.6 本章小结 第3章 基础知识  3.1 cocos2d中的单件类  3.2 director类  3.3 场景图  3.4 ccnode类层次体系  3.5 ccnode类   3.5.1 节点的处理方式   3.5.2 动作的处理方式   3.5.3 消息调度  3.6 场景和层   3.6.1 ccscene   3.6.2 场景和内存   3.6.3 推进和弹出场景   3.6.4 cctransitionscene   3.6.5 cclayer  3.7 ccsprite类   3.7.1 定位点揭秘   3.7.2 纹理大小  3.8 cclabel类  3.9 菜单  3.10 动作   3.10.1 重复动作   3.10.2 流畅动作   3.10.3 动作序列   3.10.4 瞬时动作  3.11 cocos2d测试案例  3.12 本章小结 第4章 你的第一个游戏  4.1 按部就班地创建项目  4.2 添加player sprite  4.3 加速计输入  4.4 首次测试运行  4.5 玩家速度  4.6 添加障碍物  4.7 碰撞检测  4.8 得分标签  4.9 ccbitmapfontatlas与hiero简介  4.10 添加音频  4.11 移植到ipad  4.12 本章小结 第5章 游戏组件  5.1 使用多个场景   5.1.1 添加多个场景   5.1.2 正在加载下一段,请做好准备  5.2 使用多个层   5.2.1 实现关卡的最佳方法   5.2.2 cccolorlayer  5.3 从ccsprite类继承游戏对象  5.4 使用ccsprite复合游戏对象  5.5 奇妙的ccnode派生类   5.5.1 ccprogresstimer   5.5.2 ccparallaxnode   5.5.3 ccribbon   5.5.4 ccmotionstreak  5.6 本章小结 第6章 深入了解精灵  6.1 ccspritebatchnode   6.1.1 何时使用ccspritebatchnode   6.1.2 示例项目  6.2 精灵动画初体验  6.3 用于创建动画的辅助类别  6.4 使用纹理图册   6.4.1 何为纹理图册   6.4.2 zwoptex工具介绍   6.4.3 使用zwoptex桌面版创建纹理图册   6.4.4 在cocos2d中使用纹理图册   6.4.5 改进ccanimation辅助类别   6.4.6 将所有图像都放入一个纹理图册中  6.5 自己动手  6.6 本章小结 第7章 滚屏射击游戏(上)  7.1 高级视差滚屏   7.1.1 将背景创建为底纹   7.1.2 在代码中重建背景   7.1.3 移动parallaxbackground   7.1.4 视差滚动的速度因素   7.1.5 实现背景的无限滚动   7.1.6 消除闪烁   7.1.7 重复贴图  7.2 虚拟手柄   7.2.1 引入sneakyinput   7.2.2 集成sneakyinput   7.2.3 触摸按钮产生射击   7.2.4 为按钮添加皮肤   7.2.5 控制动作   7.2.6 数字控制   7.2.7 另一个选择:gpjoystick  7.3 本章小结 第8章 滚屏射击游戏(下)   8.1 添加bulletcache类   8.2 关于敌人   8.3 entity类的继承体系   8.3.1 enemyentity类   8.3.2 enemycache类   8.3.3 组件类   8.4 射击开火   8.5 大怪物的生命条   8.6 本章小结 第9章 粒子效果  9.1 粒子效果实例  9.2 用复杂方法创建粒子效果   9.2.1 变化度属性   9.2.2 粒子数量   9.2.3 发射器持续时间   9.2.4 发射器模式   9.2.5 粒子位置   9.2.6 粒子大小   9.2.7 粒子方向   9.2.8 粒子生存期   9.2.9 粒子颜色   9.2.10 粒子混合模式   9.2.11 粒子贴图  9.3 particle designer介绍   9.3.1 使用particle designer生成的粒子效果   9.3.2 分享粒子效果  9.4 在射击游戏中添加粒子效果  9.5 本章小结 第10章 瓦片地图  10.1 瓦片地图简介  10.2 使用zwoptex处理图片  10.3 tiled地图编辑器   10.3.1 创建新的瓦片地图   10.3.2 设计瓦片地图  10.4 在cocos2d中使用直角瓦片地图   10.4.1 定位被触摸的瓦片   10.4.2 提高性能和可读性   10.4.3 使用对象层   10.4.4 绘制对象层矩形   10.4.5 滚动瓦片地图  10.5 本章小结 第11章 斜角瓦片地图  11.1 设计斜角瓦片地图图形  11.2 使用tiled编辑斜角瓦片地图   11.2.1 新建一个斜角瓦片地图   11.2.2 创建新的斜角瓦片集   11.2.3 设计斜角瓦片地图的基本规则  11.3 将斜角瓦片地图应用到游戏编程中   11.3.1 在cocos2d中加载斜角瓦片地图   11.3.2 在cocos2d中设置斜角瓦片地图   11.3.3 定位一个斜角瓦片   11.3.4 滚动斜角瓦片地图   11.3.5 斜角瓦片地图的边界问题   11.3.6 增加一个可移动的玩家角色  11.4 在游戏中加入更多内容  11.5 本章小结 第12章 物理引擎  12.1 物理引擎的基本概念  12.2 物理引擎的局限性  12.3 box2d与chipmunk  12.4 box2d   12.4.1 box2d眼中的世界   12.4.2 把移动范围限制在屏幕内   12.4.3 转换点   12.4.4 在box2d世界中添加盒子   12.4.5 连接精灵和刚体   12.4.6 碰撞检测   12.4.7 连接刚体  12.5 chipmunk   12.5.1 面向对象的chipmunk   12.5.2 构建chipmunk物理空间   12.5.3 将盒子添加到物理空间中   12.5.4 添加小盒子   12.5.5 更新盒子的精灵   12.5.6 chipmunk碰撞实践   12.5.7 chipmunk中的关节  12.6 本章小结 第13章 弹球游戏  13.1 图形:凸多边形和逆时针方式  13.2 应用vertexhelper  13.3 创建弹球桌  13.4 加入动态元素   13.4.1 bodynode类   13.4.2 球   13.4.3 反弹器   13.4.4 发射器   13.4.5 挡板  13.5 本章小结 第14章 game center  14.1 激活game center   14.1.1 在itunes connect中创建应用程序   14.1.2 建立排行榜和成就   14.1.3 创建cocos2d xcode项目   14.1.4 配置xcode 项目   14.1.5 小结  14.2 game kit编程   14.2.1 gamekithelper代理   14.2.2 检查game center是否可用   14.2.3 验证本地玩家身份   14.2.4 block对象   14.2.5 接收本地玩家的好友列表   14.2.6 排行榜   14.2.7 成就   14.2.8 联机  14.3 本章小结 第15章 番外篇  15.1 一些有用的技术   15.1.1 社交网络   15.1.2 套接字服务器技术   15.1.3 广告和分析   15.1.4 推送通知供应商  15.2 从源码项目中受益   15.2.1 sapus tongue   15.2.2 levelsvg   15.2.3 iphone rpg game kit   15.2.4 line-drawing game starterkit  15.3 参考  15.4 与出版商合作  15.5 寻找自由职业者  15.6 寻找免费的艺术品和音频  15.7 寻找交易工具  15.8 市场   15.8.1 营销游戏和自己   15.8.2 公关和新闻发布  15.9 寻求帮助   15.9.1 cocos2d首页   15.9.2 栈交换网络   15.9.3 教程和常见问题解答  15.10 写在最后  15.11 本章小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值