首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

26.3.4.2内核I2C驱动(一)

2.软件框架 2.1总线-设备-驱动模型如下图所示   把某个结构体,左右放入链表,一一比较,匹配调用probe函数   设备链表 driver链表, 总线提供了match函数 ?...linux-2.6.22.6\Documentation\i2c\instantiating-devices 2.2如何构造I2C_CLIENT?设备4种构建方法 2.1方法一: ?...去class表示所有的适配器上查找    如果适配器上一些I2C设备地址是一样,怎么继续分辨它是哪一款?...* 但是有些设备单凭地址无法分辨(A芯片地址是0x50, B芯片地址也是0x50) * 还需要进一步读写I2C设备来分辨是哪款芯片 * detect就是用来进一步分辨这个芯片是哪一款,...,和之前写I2C驱动不太一样 之前是构造了两个i2c_msg来进行读写 copy_to_user(buf, &data, 1); return 1; } /* buf[0] : addr *

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux内核驱动编写

    大家好,又见面了,我是你们朋友全栈君。 # 前言 开发过单片机小伙伴可以看一下我之前一篇文章从单片机开发到linux内核驱动,以浅显易懂方式带你敲开Linux驱动开发大门。...# 正文 用户空间每个函数(用于使用设备或者文件),在内核空间中都有一个对应功能相似并且可将内核信息向用户空间传递函数。 下表为几种设备驱动事件和它们在内核和用户空间对应接口函数。...这个函数工作在内核空间,用于为该驱动程序缓冲区分配内存。 * 它和我们熟悉malloc函数很相似。 * 最后,如果注册主设备号或者分配内存失败,模块将退出。...但是模块加载到内核中,还是不能用,得有具体设备才能用。 如果驱动模块中有实现自动生成当前设备文件节点代码,那么会使用和热拔插相关代码脚本,自动在/dev下面生成对应设备文件。...当然最终都要运行mknod命令,它会根据你传进去主次设备号和类型。在内核维护设备和驱动列表中寻找你在驱动模块中注册设备和驱动

    7.2K21

    LinuxI2C驱动框架分析

    I2C总线上连接I2C从设备都有一个标识自己设备地址,由这个设备地址来确定主设备发过来命令是否该由它来响应。 驱动 简单驱动代表着操作设备方式和流程。...Linux总线设备框架工作原理 如果想要弄清楚I2C驱动框架,必须深刻理解Linux总线设备框架。之所以会形成这样框架,很重要原因是为了代码复用性。...因为驱动和设备关系是一对多,对于相同类型不同设备,可共用同一套驱动程序接口。为了提高驱动可移植性,Linux抽象出一套管理资源函数。...3.LinuxI2C驱动程序体系结构 ---- 对于LinuxI2C驱动,其体系结构组成主要分为三个部分 (1)I2C核心:I2C核心提供了I2C总线驱动和设备驱动注册,注销方法,I2C通信方法...(3)I2C设备驱动I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端实现,设备一般挂接在受CPU控制I2C适配器上,通过I2C适配器与CPU交换数据。 ?

    4.8K11

    Linux系统驱动I2C协议

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 I2C协议 参考资料: i2c_spec.pdf 1....硬件连接 I2C在硬件上接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻原因以后我们再说)。 2....下图:白色背景表示"主→从",灰色背景表示"从→主" 3.3 I2C信号 I2C协议中数据传输单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。...在第9个时钟之后,如果有某一方需要更多时间来处理数据,它可以一直驱动三极管把SCL拉低。

    2.9K20

    Linux内核设备驱动Linux内核基础笔记整理

    Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2....编写内核驱动 #include #include static int __init test_init(void) { return...0; //返回0表示成功, 返加负数退出加载模块 } //__init 当内核驱动初始化完后, 释放此函数代码指令空间 static void __exit test_exit(void) { ....驱动模块Makefile obj-m += test.o //源码文件为test.c modules:make -C 内核源码目录 M=驱动代码所在目录 modules modules install...:make -C 内核源码目录 M=驱动代码所在目录 modules_install INSTALL_MOD_PATH=/文件系统路径 clean:make -C 内核源码目录 M=驱动代码所在目录

    1.9K51

    Linux I2C驱动入门,建议收藏!

    Linux内核I2C 驱动分为两部分: I2C 总线驱动I2C总线驱动就是SOC I2C控制器驱动,也叫做 I2C适配器驱动。...Linux 内核将 SOC I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件中,结构体内容如下: /*...Linux I2C总线运行机制: 注册I2C驱动I2C驱动添加到I2C总线驱动链表中 遍历I2C总线上设备链表,根据i2c_device_match函数进行匹配,如果匹配调用i2c_device_probe...对于我们 I2C 设备驱动编写人来说,重点工作就是构建i2c_driver,构建完成以后需要向Linux内核注册这个i2c_driver。 那么如何注册呢?...设备驱动时候需要将前面注册 i2c_driver 从 Linux 内核中注销掉,需要用到i2c_del_driver 函数,此函数原型如下: void i2c_del_driver(struct

    3.1K20

    谈谈Linux内核驱动coding style

    最近在向Linux内核提交一些驱动程序,在提交过程中,发现自己代码离Linux内核coding style要求还是差很多。...当初自己对内核文档里CodingStyle一文只是粗略浏览,真正写代码时候在很多细节上会照顾不周。不过, 在不遵守规则程序员队伍里,我并不是孤独。...如果去看drivers/staging下代码,就会发现很多驱动程序都没有严格遵守内核coding style,而且在很多驱动程序TODO文件里,都会把"checkpatch.pl fixes"作为自己目标之一...在Linux内核coding style里,switch和case要求有相同缩进。本例代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?...比如,Linux内核coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。 我自己习惯很差,经常在代码行尾留下一些空格。

    1.8K10

    Linux系统驱动I2C视频介绍

    I2C软件框架 以I2C接口存储设备AT24C02为例: APP: 提出要求:把字符串"www.100ask.net"写入AT24C02地址16开始地方 它是大爷,不关心底层实现细节 它只需要调用设备驱动程序提供接口...AT24C02驱动: 它知道AT24C02要求地址、数据格式 它知道发出什么信号才能让AT24C02执行擦除、烧写工作 它知道怎么判断数据是否烧写成功 它构造好一系列数据,发给I2C控制器...我们讲什么 3.1 对于Linux 从上到下: 先讲I2C协议 APP可以通过两类驱动程序访问设备 I2C设备自己驱动程序 内核自带i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间驱动程序...(i2c-dev.c) I2C Device Driver I2C设备自己驱动程序 内核自带i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间驱动程序(i2c-dev.c)...I2C Controller Driver 芯片I2C控制器驱动程序(称为adapter) 使用GPIO模拟I2C控制器驱动程序(i2c-gpio.c) 3.2 对于单片机/裸机 从上到下

    2.3K40

    Linux I2C 驱动入门,建议收藏!!!

    第一时间看干货文章 1 Linux内核I2C 驱动分为两部分: I2C 总线驱动I2C总线驱动就是SOC I2C控制器驱动,也叫做 I2C适配器驱动。...Linux 内核将 SOC I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件中,结构体内容如下: /*...Linux I2C总线运行机制: 注册I2C驱动I2C驱动添加到I2C总线驱动链表中 遍历I2C总线上设备链表,根据i2c_device_match函数进行匹配,如果匹配调用i2c_device_probe...对于我们 I2C 设备驱动编写人来说,重点工作就是构建i2c_driver,构建完成以后需要向Linux内核注册这个i2c_driver。 那么如何注册呢?...设备驱动时候需要将前面注册 i2c_driver 从 Linux 内核中注销掉,需要用到i2c_del_driver 函数,此函数原型如下: void i2c_del_driver(struct

    2.7K20

    linux内核驱动模型详解_arduino驱动安装

    转载请标明出处floatercsdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动层和设备驱动层。...核心层是LinuxSPI核心部分,提供了核心数据结构定义,总线、设备和驱动注册、注销管理等,提供与上层统一接口。...linuxI2C、SPI、USB等总线驱动隔离成控制器驱动和设备驱动,使两者相对独立。 本文以qcomspi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多关系,在spi_master设备注册时,控制器结构体信息会提供给spi_master作为私有数据。...总线传输涉及到几个重要结构体,队列,内核工作线程和厂商总线传输实现几个方面。

    11.2K40

    Linux 内核之字符设备驱动

    本篇介绍 本篇介绍下如何写字符设备驱动程序。...支持阻塞IO驱动demo Linux设备类型可以大概分为以下几种: 字符设备:以字节为单位传输,传输率低,不支持随机访问,常见设备有鼠标,键盘,触摸屏等 块设备: 以块位单位传输,常见就是磁盘...先看下字符设备结构 struct cdev { struct kobject kobj; // 用于linux设备驱动模型 struct module *owner; // 字符设备驱动所在内核模块对象指针...再介绍下misc 设备,linux 内核将一些不符合预先确定字符设备划分为杂项设备,使用数据结构如下; struct miscdevice { int minor; const char...提到多路复用,就是linux中著名poll,epoll,select机制,在内核中对应文件方法就是: __poll_t (*poll) (struct file *, struct poll_table_struct

    4.9K40

    Linux驱动I2C子系统剖析

    I2C从机驱动程序 给用户提供调用接口 内核提供两种方式来实现设备驱动: 第一种是内核默认实现通用型I2C设备驱动,位于drivers/i2c/i2c-dev.c中。...I2C核心层 注册I2C总线 由内核开发人员编写,不涉及具体硬件 给驱动编程人员提供编程接口 I2C总线驱动层 是I2C主机适配器驱动程序 初始化I2C适配器(控制器) 实现操作方法:根据I2C操作时序进行操作...I2C设备驱动层 笔者先从内核提供通用驱动开始分析,最后在文末给出特定驱动分析。...内核提供了一个通用于所有设备I2C设备驱动,用户可以在应用层实现对I2C驱动,其实现位于drivers/i2c/i2c-dev.c中。...核心层分析可知,I2C总线是根据id_table进行匹配,所以这里并不会按照常规Linux驱动模型进行match后probe,况且这个驱动里也没有probe方法。

    6.6K20

    Linux内核设备驱动内核调试技术笔记整理

    /****************** * 内核调试技术 ******************/ (1)内核源代码中一些与调试相关配置选项 内核配置选项中包含了一些与内核调试相关选项,都集中在...包括: CONFIG_DEBUG_KERNEL 使其他调试选项可用,应该选中,其本身不会打开所有的调试功能。 具体调试选项说明可参见驱动一书,或通过menuconfighelp说明查看。...有用参数有: -t 显示调用发生时间 -T 显式调用所花费时间 -f 跟踪所有子进程 -p 跟踪特定进程 -o 将输出信息导入特定文件 (5)查看oops消息 oops是内核告知用户有不幸发生最常用方式...在某些情况下,oops会导致内核混乱,而混乱结果就是死机,这些情况可能包括: *oops发生在持有锁代码中 *oops发生在和硬件设备通讯过程中 *oops在中断上下文中发生 *oops发生在idle...进程(0)或init进程(1),因为内核没有这两个进程没法工作 如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。

    2.1K41

    Linux内核驱动开发EXPORT_SYMBOL

    简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL()宏定义用法。 在阅读Linux内核驱动源码时候,我们会发现很多函数带有EXPORT_SYMBOL()宏定义。...从这个宏定义理解为输出符号。那么他究竟有什么作用。...EXPORT_SYMBOL()宏定义作用 EXPORT_SYMBOL宏定义定义函数或者符号将对内核代码公开,不用修改内核代码就在其他内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号方式导出给其他模块使用...extern int rice_func(void); 先加载定义该函数模块,然后再加载调用该函数模块,先后顺序必须注意。...实验 编写代码 编写两个模块:rice_export.ko 和 rice_import.ko,其中: rice_export.ko:导出定义函数 rice_import.ko:调用导出函数 导出函数模块代码

    2.8K20

    Linux内核LED设备驱动框架【转】

    驱动框架概念 内核驱动部分维护者针对每个种类驱动设计一套成熟、标准、典型驱动实现,并把不同厂家同类硬件驱动中相同部分抽出来自己实现好,再把不同部分留出接口给具体驱动开发工程师来实现,这就叫驱动框架...因此,Linux中LED驱动框架把所有LED设备共性给实现了,把不同地方留给驱动工程师去做。...内核在启动过程中,内核需要按照先后顺序去进行初始化操作。因此,内核给是给启动时要调用所有初始化函数归类,然后每个类按照一定次序去调用执行。...这些分类名就叫.initcalln.init,n值从1到8。内核开发者在编写内核代码时只要将函数设置合适级别,这些函数就会被链接时候放入特定段,内核启动时再按照段顺序去依次执行各个段即可。...详见Linux设备管理:sysfs文件系统功能及其应用。 led_class_attrs结构体数组设置了leds设备类属性,即led硬件操作对象和方法。

    2.6K10

    Linux系统驱动之使用GPIO模拟I2C驱动程序分析

    视频观看 百问网驱动大全 使用GPIO模拟I2C驱动程序分析 参考资料: i2c_spec.pdf Linux文档 Linux-5.4\Documentation\devicetree\bindings...\i2c\i2c-gpio.yaml Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux...-5.4\drivers\i2c\busses\i2c-gpio.c Linux-4.9.88\drivers\i2c\busses\i2c-gpio.c 1....回顾I2C协议 1.1 硬件连接 I2C在硬件上接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻原因以后我们再说)。...1.2 I2C信号 I2C协议中数据传输单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

    3.2K32
    领券