1. 程式人生 > >Linux 核心裝置驅動之GPIO驅動之GPIO sysfs支援

Linux 核心裝置驅動之GPIO驅動之GPIO sysfs支援

需要核心配置CONFIG_GPIO_SYSFS

int gpiochip_sysfs_register(struct gpio_device *gdev) {  struct device *dev;  struct device *parent;  struct gpio_chip *chip = gdev->chip;

 /*   * Many systems add gpio chips for SOC support very early,   * before driver model support is available.  In those cases we   * register later, in gpiolib_sysfs_init() ... here we just   * verify that _some_ field of gpio_class got initialized.   */  if (!gpio_class.p)   return 0;

 /*   * For sysfs backward compatibility we need to preserve this   * preferred parenting to the gpio_chip parent field, if set.   */  if (chip->parent)   parent = chip->parent;  else   parent = &gdev->dev;

 /* use chip->base for the ID; it's already known to be unique */  dev = device_create_with_groups(&gpio_class, parent,      MKDEV(0, 0),      chip, gpiochip_groups,      "gpiochip%d", chip->base);  if (IS_ERR(dev))   return PTR_ERR(dev);

 mutex_lock(&sysfs_lock);  gdev->mockdev = dev;  mutex_unlock(&sysfs_lock);

 return 0; }

void gpiochip_sysfs_unregister(struct gpio_device *gdev) {  struct gpio_desc *desc;  struct gpio_chip *chip = gdev->chip;  unsigned int i;

 if (!gdev->mockdev)   return;

 device_unregister(gdev->mockdev);

 /* prevent further gpiod exports */  mutex_lock(&sysfs_lock);  gdev->mockdev = NULL;  mutex_unlock(&sysfs_lock);

 /* unregister gpiod class devices owned by sysfs */  for (i = 0; i < chip->ngpio; i++) {   desc = &gdev->descs[i];   if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))    gpiod_free(desc);  } }

static int __init gpiolib_sysfs_init(void) {  int  status;  unsigned long flags;  struct gpio_device *gdev;

 status = class_register(&gpio_class);  if (status < 0)   return status;

 /* Scan and register the gpio_chips which registered very   * early (e.g. before the class_register above was called).   *   * We run before arch_initcall() so chip->dev nodes can have   * registered, and so arch_initcall() can always gpio_export().   */  spin_lock_irqsave(&gpio_lock, flags);  list_for_each_entry(gdev, &gpio_devices, list) {   if (gdev->mockdev)    continue;

  /*    * TODO we yield gpio_lock here because    * gpiochip_sysfs_register() acquires a mutex. This is unsafe    * and needs to be fixed.    *    * Also it would be nice to use gpiochip_find() here so we    * can keep gpio_chips local to gpiolib.c, but the yield of    * gpio_lock prevents us from doing this.    */   spin_unlock_irqrestore(&gpio_lock, flags);   status = gpiochip_sysfs_register(gdev);   spin_lock_irqsave(&gpio_lock, flags);  }  spin_unlock_irqrestore(&gpio_lock, flags);

 return status; } postcore_initcall(gpiolib_sysfs_init);

相關推薦

Linux 核心裝置驅動GPIO驅動GPIO sysfs支援

需要核心配置CONFIG_GPIO_SYSFS int gpiochip_sysfs_register(struct gpio_device *gdev) {  struct device *dev;  struct device *parent;  struct gpi

Linux 核心裝置驅動GPIO驅動GPIO 管腳新增

在配置CONFIG_OF_GPIO下作用: int of_gpiochip_add(struct gpio_chip *chip) {  int status; if ((!chip->of_node) && (chip->parent))

面向物件地分析Linux核心裝置驅動(2)——Linux核心裝置模型與匯流排

Linux核心裝置模型與匯流排 -         核心版本 Linux Kernel 2.6.34, 與 Robert.Love的《Linux Kernel Development》(第三版)所講述的核心版本一樣 1.      Linux核心裝置模型分析 1)  

LINUX核心模組載入Windows下驅動

最近一段時間以來,幾乎每一臺行動式計算機都內建了無線功能,但是它們中有很多並不支援Linux。因此,除非這些計算機設定了雙啟動,這樣做LINUX使用者也未必可以使用無線網絡卡,儘管如此,除非Windows正在執行,否則這些便攜計算機可能依然無法連線到無線網路。   最近一段時間以來,幾乎每一臺行

舊手機android的linux核心編譯2-Wifi驅動加入。

經過一些時間的分析與除錯,還是把wifi的驅動調通了。 首先要分析舊手機的wifi。 1,要分析舊手機的wifi,在recovery下配通wifi 是一個不錯的選擇。在recovery已經配通了adb 介面,其實它除去沒有應用軟體外,與硬體系統相關的內容都是完整的。經過我多次償試,對我的MS

Linux核心中新增自己的驅動程式

就說一下怎麼新增進去吧。首先你要把驅動程式寫好。我已新增 首先在drivers目錄下面建立GPIO資料夾,,資料夾下面建立三個檔案,分別是:gpio.c,Kconfig Makefile,三個檔案。     gpio.c是你的驅動程式,Kconfig是配置選單,也就是它會在

47 使用linux核心原始碼裡的按鍵驅動

這個裝置驅動適用於,每個按鍵是連線到一個io口, 而且這個io口還有中斷功能的 需要在linux核心配置裡選上相關的配置。在核心原始碼目錄下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gn

Linux核心初始化步驟(八)---GPIO相關的初始化工作

參考博文:http://blog.chinaunix.net/uid-27717694-id-3624294.html 分析GPIO的初始化過程,GPIO是與硬體體系密切相關的,Linux提供一個模型來讓驅動統一處理GPIO, 即各個板卡都有實現自己的gpio_chip控制模組:reques

轉載:Linux核心 裝置樹操作常用API

Linux裝置樹語法詳解一文中介紹了裝置樹的語法,這裡主要介紹核心中提供的操作裝置樹的API,這些API通常都在"include/of.h"中宣告。 device_node,核心中用下面的這個結構描述裝置樹中的一個節點,後面的API都需要一個device_nod

linux核心裝置樹及編譯

1、裝置樹的概念         在核心原始碼中,存在大量對板級細節資訊描述的程式碼。這些程式碼充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目錄,對核心而言這些pl

Linux裝置驅動程式架構分析I2C架構(基於3.10.1核心

作者:劉昊昱  核心版本:3.10.1 I2C體系架構的硬體實體包括兩部分: 硬體I2C Adapter:硬體I2C Adapter表示一個硬體I2C介面卡,也就是I2C控制器。一般是SOC中的一個介面,也可以用GPIO模擬。硬體I2C Adapter主要用來在I2

Linux核心驅動GPIO子系統(一)GPIO的使用

四 使用者態使用gpio監聽中斷       首先需要將該gpio配置為中斷 echo  "rising" > /sys/class/gpio/gpio12/edge 以下是虛擬碼 int gpio_id; struct pollfd fds[1]; gpio_fd = open("/s

Linux裝置驅動程式架構分析platform(基於3.10.1核心

作者:劉昊昱  核心版本:3.10.1 一、platform bus的註冊 platform bus註冊是通過platform_bus_init函式完成的,該函式定義在drivers/base/platform.c檔案中,其內容如下: 904int __init pl

linux 核心模組程式設計LED驅動程式(六)

我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下   LED1 LED2 LED3 LED4

linux 網路裝置驅動alloc_etherdev

最近在看網路驅動時,發現這個函式: struct net_device *netdev; netdev = alloc_etherdev(sizeof(synopGMACPciNetworkAdapter)); 順著這個函式進行追蹤: #define allo

Linux裝置驅動程式架構分析一個I2C驅動例項

作者:劉昊昱  核心版本:3.10.1 編寫一個I2C裝置驅動程式的工作可分為兩部分,一是定義和註冊I2C裝置,即i2c_client;二是定義和註冊I2C裝置驅動,即i2c_driver。下面我們就以mini2440的I2C裝置at24c08 EEPROM為例,介紹如

Linux Kernel 裝置驅動I2Cclient讀寫資料API

傳送資料 int i2c_master_send(const struct i2c_client *client, const char *buf, int count) 接收資料 int i2c_master_recv(const struct i2c_client *c

linux核心USB驅動分析

第一部分  USB驅動程式框架   app:   -------------------------------------------   USB裝置驅動程式    // 知道資料含義  核心 --------------------------------------   USB匯流

Linux裝置模型tty驅動架構分析

------------------------------------------ 本文系本站原創,歡迎轉載!轉載請註明出處:http://ericxiao.cublog.cn/------------------------------------------一:前言Tty這個名稱源於電傳打位元組的簡稱。

65 linux spi裝置驅動spi LCD屏驅動

SPI的控制器驅動由平臺裝置與平臺驅動來實現. 驅動後用spi_master物件來描述.在裝置驅動中就可以通過函式spi_write, spi_read, spi_w8r16, spi_w8r8等函式來呼叫控制器. "include/linux/spi/s