我的内核学习笔记12:linux i2c-gpio驱动应用实例

我的内核学习笔记12:linux i2c-gpio驱动应用实例
linux内核的i2c-gpio是使用GPIO模拟I2C协议的驱动,只需要配置2根GPIO即可使用。Linux的I2C子系统比较复杂,笔者暂时还没有研究。本着“实用”的目的,介绍一下如何使用这个驱动及一些注意事项。 一、概述 Linux内核很多驱动都使用到I2C子系统。如EEPROM、RTC等。 GPIO模拟I2C协议的驱动位于drivers/i2c/busses目录。驱动名称为“i2c-gpio”,驱动文件为drivers/i2c/busses/i2c-gpio.c。 二、内核配置 本文基于...

我的内核学习笔记11:linux leds-gpio驱动应用实例

我的内核学习笔记11:linux leds-gpio驱动应用实例
linux内核的leds-gpio是使用GPIO控制LED的驱动,只要将板子上LED灯对接的GPIO引脚号进行适当的配置,就能使用这个驱动了,十分方便。网上有很多文章分析这个驱动,就不献丑——或者后面闲时再写写吧。 本文仅本着“实用”的目的,介绍从内核配置到应用实例,以期对leds-gpio驱动有一个整体概念。 一、概述 leds-gpio封装得十分好,只需要提供可正常使用的GPIO即可。另外还具备触发器功能,其实就是控制LED的亮...

我的内核学习笔记10:Intel GPIO驱动源码分析

我的内核学习笔记10:Intel GPIO驱动源码分析
本文对Intel e3800的GPIO驱动源码进行分析。 一、概述 1.1 内核配置 Intel e3800的GPIO在Linux内核中使用的驱动名为gpio_ich(为了行文方便,将对应的设备称为“gpio_ich设备”)。驱动源码位于:drivers/gpio/gpio-ich.c 本文基于linux 3.17.1版本内核进行分析。 内核配置(make menuconfig)信息如下: Device Drivers ---> -*- GPIO Support ---> <M> Intel ICH GPIO 使用模块形...

我的内核学习笔记9:Intel内部看门狗iTCO_wdt驱动

我的内核学习笔记9:Intel内部看门狗iTCO_wdt驱动
本文对Intel e3800内部看门狗驱动源码进行分析。 一、概述 Intel e3800内部看门狗在手册的PCU - Power Management Controller (PMC)章节中介绍——在这里,WDT属于电源管理范畴了。有些ARM芯片,将watchdog单独成一个章节,这个东西,笔者是在无意中发现的。涉及的寄存器有TCO_RLD、TCO1_CNT、TCO_TMR。这些寄存器在后文将再次介绍。 在Linux内核中使用的驱动名为iTCO_wdt(为了行文方便,将对应的设备称为“iT...

我的内核学习笔记8:多功能设备mfd驱动

我的内核学习笔记8:多功能设备mfd驱动
前段时间分析了Intel的lpc驱动,里面涉及了mfd,但网络上关于mfd的资料少之又少。所以就自己分析一下代码。本文对Linux内核的mfd设备注册过程进行分析,并结合2个实例,加深对其概念。 一、概述 mfd是Multifunction device的简称,即多功能设备,是许多有共性的设备的集合,mfd由核心层(core)以及其下的“子设备”组成。从下文将会看到,mfd只是将设备注册到platform总线——因此,其子设备属于platform设备。...

我的内核学习笔记7:Intel LPC驱动lpc_ich分析

我的内核学习笔记7:Intel LPC驱动lpc_ich分析
接触这么久的内核代码,还没有真正分析一个完整的驱动源码,都是零零散散写只言片字。本文就作一个尝试,写一写Linux内核源码分析层面的文章。 本文介绍基于Intel baytrail系列的e3800系列的SOC的LPC驱动。后续文章将进行该系列的WDT和GPIO驱动分析。 一、概述 ICH是I/O Controller Hub,用于Intel南桥芯片,扩展IO。目前有很多代,从ICH0到ICH11。ICH支持LPC接口(Low Pin Count interface)——本文分析的Lin...

我的内核学习笔记6:PCI驱动probe的一点认知

我的内核学习笔记6:PCI驱动probe的一点认知
对于PCI的学习,在文章《初识PCI》和《再识PCI:一个PCI驱动实例》中有介绍,文中使用大量代码进行演示。但总觉得有些认知不到位。于是就再写一文。 一、PCI驱动一般框架 先看一下PCI驱动一般框架的示例代码: #include <linux/pci.h> #include <linux/module.h> static int misc_pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) { switch (dev->device) ...