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 裝置驅動之I2C之client讀寫資料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