layout: article
title: Xavier上的第一个I2C驱动
tags: xavier,i2c,driver
key: i2c,driver
---
按照《Linux设备驱动开发详解-基于最新的Linux 4.0内核》15.6小节的AT24xx驱动,在Xavier上实现一个简单的I2C驱动模型

设备驱动

驱动端程序

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/regmap.h>
#include <linux/slab.h>static const struct i2c_device_id ds90ub96x_id_table[] = {{ "ds90ub96x", 0x30},{}
};
MODULE_DEVICE_TABLE(i2c,ds90ub96x_id_table);    static int ds90ub96x_probe(struct i2c_client *client,const struct i2c_device_id *id)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}static int ds90ub96x_remove(struct i2c_client *client)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}/* 1.分配/设置 i2c_driver */
static struct i2c_driver ds90ub96x_driver = {.driver = {.name   = "ds90ub96x",.owner  = THIS_MODULE,},.probe  = ds90ub96x_probe,.remove = ds90ub96x_remove,.id_table= ds90ub96x_id_table,
};static int __init ds90ub96x_drv_init(void)
{return i2c_add_driver(&ds90ub96x_driver);
}
module_init(ds90ub96x_drv_init);static void __exit ds90ub96x_drv_exit(void)
{i2c_del_driver(&ds90ub96x_driver);
}
module_exit(ds90ub96x_drv_exit);
MODULE_LICENSE("GPL");

驱动端代码

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/regmap.h>
#include <linux/slab.h>static struct i2c_client *ds90ub96x_client;static const unsigned short addr_list[] = { 0x30, I2C_CLIENT_END };
static int ds90ub96x_dev_init(void)
{struct i2c_adapter *i2c_adap;struct i2c_board_info ds90ub96x_info;memset(&ds90ub96x_info, 0, sizeof(struct i2c_board_info));  strlcpy(ds90ub96x_info.type, "ds90ub96x", I2C_NAME_SIZE);i2c_adap = i2c_get_adapter(2);/*ds90ub964使用Xavier上的I2C3(所有索引号为2)*/ds90ub96x_client = i2c_new_probed_device(i2c_adap, &ds90ub96x_info, addr_list, NULL);i2c_put_adapter(i2c_adap);if (ds90ub96x_client)return 0;elsereturn -ENODEV;
}

makefile代码


kernel_modules:make -C /usr/src/linux-headers-4.9.140-tegra-ubuntu18.04_aarch64/kernel-4.9/  M=$(CURDIR) modulesclean:make -C /usr/src/linux-headers-4.9.140-tegra-ubuntu18.04_aarch64/kernel-4.9/ M=$(CURDIR) cleanrm -rf modules.order
obj-m += ds90ub96x_dev.o
obj-m += ds90ub96x_drv.o

编译

进入nVIDIA agx-Xavier 开发板,将驱动代码和amkefile上传到开发板上,并在终端执行:make,产生模块文件。

加载模块

在终端执行:

sudo insmod ds90ub96x_drv.ko
sudo insmod ds90ub96x_dev.ko

然后执行:lsmod,可以看到ds90ub96x_drvds90ub96x_dev驱动已经加载:

在终端执行:dmesg ,可以看到模块加载的时候打印的信息:

在终端执行:sudo rmmod ds90ub96x_dev 卸载模块,在终端执行dmesg,可以看到模块卸载时打印的信息:

注意事项

Makefile文件参考的宋宝华老师《Linux设备驱动开发详解-基于最新的Linux 4.0内核》4.9小节的Makefile文件,但模块的路径无法使用KVERS指定,这个目前还不知道是什么原因导致的,可能与Xavier的系统镜像有关系,在编译Xavier的kernel和module的时候设置的build与书中的有所不同,这个问题有待深究。

参考链接

  • 本文的代码
  • 韦东山老师的《韦东山第二期Linux驱动》

转载于:https://www.cnblogs.com/think123/p/10819579.html

Xavier上的第一个I2C驱动相关推荐

  1. Linux设备驱动程序架构分析之一个I2C驱动实例

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1 编写一个I2C设备驱动程序的工作可分为两部分,一是定义和注册I2C设备,即i2c_clien ...

  2. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  3. 【转】 i2c驱动调试经验

    原文网址:http://blog.csdn.net/cmm20071020/article/details/7179958 把一个i2c驱动从2.6.21升级到2.6.39 上网查到一篇帖子,讲了驱动 ...

  4. I2C驱动分析,好文!!

    登录 | 注册 小雷的学习空间 用硬件包围软件 最终实现软硬通吃 目录视图 摘要视图 订阅 Linux I2C驱动完全分析(二) 标签: clinuxstructalgorithmtable 2011 ...

  5. linux 触摸结构体,xboot-x4412ibox项目实战54-Linux触摸屏驱动之I2C驱动实验 - Powered by Discuz!...

    前面我们分析了linux触摸屏驱动的input子系统机制,本章节分析linux触摸屏驱动的i2c机制. 驱动源码路径: kernel/drivers/input/touchscreen/ft5x06_ ...

  6. CMOS摄像头驱动分析-i2c驱动

    CMOS摄像头驱动分析-i2c驱动 文章目录 CMOS摄像头驱动分析-i2c驱动 设备树内容 module_i2c_driver宏分析 ov2640_i2c_driver ov2640_probe 设 ...

  7. linux下I2C驱动体系结构及在FL2440开发板上的具体实现

    最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...

  8. Linux添加一个i2c设备,手把手教你写Linux I2C设备驱动

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  9. 获取另一个驱动的设备结构体_《rt-thread驱动框架分析》-i2c驱动

    驱动分析 I2C设备驱动框架图: 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方,请指出): 上图是我分析的RTT的I2C框架图.主要分为三层,驱动层-核心层-设备层. ...

最新文章

  1. 在Project 2010中添加自定义任务窗格
  2. Inside ASP.NET 2.0 – Controls Model(转载)
  3. CSS知识点个人总结(不断更新)
  4. java集合概念_JAVA集合概念
  5. [css] css中padding和margin是相对于父元素还是子元素呢?
  6. eclipse 远程链接访问hadoop 集群日志信息没有输出的问题l
  7. ENVI入门系列教程---一、数据预处理---5. 图像自动配准
  8. linux 锐捷 无法找到网卡信息,linux网卡驱动安装及锐捷使用
  9. Matlab---示波器Scope-Measurements
  10. 我的世界空岛生存服务器制作,我的世界Wishing服务器-RPG丨空岛丨生存丨[1.12.2-1.16.1]...
  11. auto.js实现支付宝蚂蚁森林自动收能量、自动偷能量教程,最简单的收能量脚本,MIUI 10亲测可用
  12. 获取设备的型号信息,比如iPhone5s,iPhone5等等
  13. 上海高一计算机奥赛,上海物理奥赛金牌“大神”爱番剧和高达,已保送清华大学姚班...
  14. Git 开发分支合并到develop分支用法
  15. ONES X 深圳农村商业银行 | 数字化项目管理实践
  16. SQL数据库字段数据类型说明
  17. 如何批量生成文件夹?
  18. 使用Matlab对PIV数据中的dat文件进行读取数据并求平均值
  19. 智慧灌区信息化解决方案
  20. 网络工作室官网HTML源码

热门文章

  1. Flume架构以及应用介绍[转]
  2. 中国人工智能学会通讯——电子商务中的个性化推荐技术剖析 1. 基于人生阶段建模的商品推荐...
  3. 关于label在ie8,9下的兼容问题???
  4. 自动化运维脚本语言之expect实践学习(1)
  5. 零件销售系统的质量属性
  6. VC++设计简易计算器笔记(一)
  7. tpcc-mysql percona_tpcc-mysql 对percona5.6进行压力测试
  8. c++ map 获取key列表_一日一技:举例说明python中的map()方法
  9. confluence添加用户_知识管理平台Confluence教程:如何添加,分配和查看任务
  10. python如何读取文件数据恢复_删python目录