Xavier上的第一个I2C驱动
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_drv
和ds90ub96x_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驱动相关推荐
- Linux设备驱动程序架构分析之一个I2C驱动实例
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1 编写一个I2C设备驱动程序的工作可分为两部分,一是定义和注册I2C设备,即i2c_clien ...
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析
PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...
- 【转】 i2c驱动调试经验
原文网址:http://blog.csdn.net/cmm20071020/article/details/7179958 把一个i2c驱动从2.6.21升级到2.6.39 上网查到一篇帖子,讲了驱动 ...
- I2C驱动分析,好文!!
登录 | 注册 小雷的学习空间 用硬件包围软件 最终实现软硬通吃 目录视图 摘要视图 订阅 Linux I2C驱动完全分析(二) 标签: clinuxstructalgorithmtable 2011 ...
- linux 触摸结构体,xboot-x4412ibox项目实战54-Linux触摸屏驱动之I2C驱动实验 - Powered by Discuz!...
前面我们分析了linux触摸屏驱动的input子系统机制,本章节分析linux触摸屏驱动的i2c机制. 驱动源码路径: kernel/drivers/input/touchscreen/ft5x06_ ...
- CMOS摄像头驱动分析-i2c驱动
CMOS摄像头驱动分析-i2c驱动 文章目录 CMOS摄像头驱动分析-i2c驱动 设备树内容 module_i2c_driver宏分析 ov2640_i2c_driver ov2640_probe 设 ...
- linux下I2C驱动体系结构及在FL2440开发板上的具体实现
最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...
- Linux添加一个i2c设备,手把手教你写Linux I2C设备驱动
Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...
- 获取另一个驱动的设备结构体_《rt-thread驱动框架分析》-i2c驱动
驱动分析 I2C设备驱动框架图: 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方,请指出): 上图是我分析的RTT的I2C框架图.主要分为三层,驱动层-核心层-设备层. ...
最新文章
- 在Project 2010中添加自定义任务窗格
- Inside ASP.NET 2.0 – Controls Model(转载)
- CSS知识点个人总结(不断更新)
- java集合概念_JAVA集合概念
- [css] css中padding和margin是相对于父元素还是子元素呢?
- eclipse 远程链接访问hadoop 集群日志信息没有输出的问题l
- ENVI入门系列教程---一、数据预处理---5. 图像自动配准
- linux 锐捷 无法找到网卡信息,linux网卡驱动安装及锐捷使用
- Matlab---示波器Scope-Measurements
- 我的世界空岛生存服务器制作,我的世界Wishing服务器-RPG丨空岛丨生存丨[1.12.2-1.16.1]...
- auto.js实现支付宝蚂蚁森林自动收能量、自动偷能量教程,最简单的收能量脚本,MIUI 10亲测可用
- 获取设备的型号信息,比如iPhone5s,iPhone5等等
- 上海高一计算机奥赛,上海物理奥赛金牌“大神”爱番剧和高达,已保送清华大学姚班...
- Git 开发分支合并到develop分支用法
- ONES X 深圳农村商业银行 | 数字化项目管理实践
- SQL数据库字段数据类型说明
- 如何批量生成文件夹?
- 使用Matlab对PIV数据中的dat文件进行读取数据并求平均值
- 智慧灌区信息化解决方案
- 网络工作室官网HTML源码
热门文章
- Flume架构以及应用介绍[转]
- 中国人工智能学会通讯——电子商务中的个性化推荐技术剖析 1. 基于人生阶段建模的商品推荐...
- 关于label在ie8,9下的兼容问题???
- 自动化运维脚本语言之expect实践学习(1)
- 零件销售系统的质量属性
- VC++设计简易计算器笔记(一)
- tpcc-mysql percona_tpcc-mysql 对percona5.6进行压力测试
- c++ map 获取key列表_一日一技:举例说明python中的map()方法
- confluence添加用户_知识管理平台Confluence教程:如何添加,分配和查看任务
- python如何读取文件数据恢复_删python目录