linux裝置驅動--LED驅動
linux裝置驅動--LED驅動
最近正在學習裝置驅動開發,因此打算寫一個系列部落格,即是對自己學習的一個總結,也是對自己的一個督促,有不對,不足,需要改正的地方還望大家指出,而且希望結識志同道合的朋友一起學習技術,共同進步。
作者:liufei_learning(轉載請註明出處)
email:[email protected]
IT學習交流群:160855096
開發環境:Win7(主機) +VisualBox + ubuntu10.10(虛擬機器) + TQ2440開發板(2.6.30.4核心)
功能:實現tq2440下led控制以及自動建立裝置節點
目錄:
1.實現
1)程式分析框圖:
2)程式流程
3)原理圖
2.步驟
3.分析
1)字元設備註冊問題
2)file_operations()
3)ioctl
4)裝置節點的自動建立
實現:
程式分析框圖: |
函式 fun:leds_open() fun:leds_ioctl() fun:leds_init() fun:leds_exit() 結構體 struct:led_table struct:led_cfg_table struct:led_fops |
呼叫 控制程式執行open()時,會呼叫此函式 控制程式執行ioctl)時,會呼叫此函式 載入模組時會呼叫此函式 解除安裝函式時會呼叫此函式 功能 控制LED的IO口 LEDIO口的模式 註冊字元裝置時,通過此結構體關聯leds_open(),Leds_ioctl() |
程式流程 |
首先通過入口函式module_init(leds_init),進入leds_init()進行初始化操作,設定GPIO口,註冊字元裝置,通過led_fops結構體關聯leds_open(),Leds_ioctl() |
由原理圖得知LED電路是共陽極的,並分別由2440的GPB5、GPB6、GPB7、GPB8口控制
步驟:
1.去掉核心已有的LED驅動設定,因為IO口與tq2440開發板不一致 修改arch/arm/plat-s3c24xx/common-smdk.c
[cpp] view plain copy print?- /* LED devices */
- /*
- static structs3c24xx_led_platdata smdk_pdata_led4 = {
- .gpio =S3C2410_GPF4,
- .flags =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
- .name ="led4",
- .def_trigger ="timer",
- };
- static structs3c24xx_led_platdata smdk_pdata_led5 = {
- .gpio =S3C2410_GPF5,
- .flags =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
- .name ="led5",
- .def_trigger ="nand-disk",
- };
- static structs3c24xx_led_platdata smdk_pdata_led6 = {
- .gpio =S3C2410_GPF6,
- .flags =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
- .name ="led6",
- };
- static structs3c24xx_led_platdata smdk_pdata_led7 = {
- .gpio =S3C2410_GPF7,
- .flags =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
- .name ="led7",
- };
- static structplatform_device smdk_led4 = {
- .name ="s3c24xx_led",
- .id =0,
- .dev ={
- .platform_data= &smdk_pdata_led4,
- },
- };
- static structplatform_device smdk_led5 = {
- .name ="s3c24xx_led",
- .id =1,
- .dev ={
- .platform_data= &smdk_pdata_led5,
- },
- };
- static structplatform_device smdk_led6 = {
- .name ="s3c24xx_led",
- .id =2,
- .dev ={
- .platform_data= &smdk_pdata_led6,
- },
- };
- static structplatform_device smdk_led7 = {
- .name ="s3c24xx_led",
- .id =3,
- .dev ={
- .platform_data= &smdk_pdata_led7,
- },
- };*/
- staticstruct platform_device__initdata *smdk_devs[] = {
- &s3c_device_nand,
- /*&smdk_led4,
- &smdk_led5,
- &smdk_led6,
- &smdk_led7,*/
- };
[cpp] view plain copy print?
- void __initsmdk_machine_init(void)
- {
- /*Configure the LEDs (even if we have no LED support)*/
- /*
- s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
- s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
- s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);
- s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);
- s3c2410_gpio_setpin(S3C2410_GPF4, 1);
- s3c2410_gpio_setpin(S3C2410_GPF5, 1);
- s3c2410_gpio_setpin(S3C2410_GPF6, 1);
- s3c2410_gpio_setpin(S3C2410_GPF7, 1);*/
- if (machine_is_smdk2443())
- smdk_nand_info.twrph0 = 50;
- s3c_device_nand.dev.platform_data = &smdk_nand_info;
- platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));
- s3c_pm_init();
- }
2.編寫tq2440的LED驅動,程式碼如下
[cpp] view plain copy print?- /*
- * tq2440_leds.c
- *
- * Created on: 2011-11-29
- * Author: liufei_learning
- *
- */
- #include<linux/module.h>
- #include<linux/init.h>
- #include<linux/fs.h>
- #include<mach/hardware.h>
-
相關推薦
linux裝置驅動--LED驅動
linux裝置驅動--LED驅動 最近正在學習裝置驅動開發,因此打算寫一個系列部落格,即是對自己學習的一個總結,也是對自己的一個督促,有不對,不足,需要改正的地方還望大家指出,而且希望結識志同道合的朋友一起學習技術,共同進步。 作者:liufei_le
字元裝置驅動----LED驅動程式
一. 概念介紹 一般使用者在應用程式裡呼叫的 open, read, write 函式是 c 庫的函式, 這些函式會觸發 swi val異常,從而引發系統呼叫,進入到核心空間, 核心通過VFS(virtual Filesystem)來實現呼叫不同的驅動函式
linux驅動--LED驅動
linux驅動–LED驅動 配置介紹 前面已經詳細的介紹了關於設備註冊、驅動註冊以及裝置節點的生成的相關問題,本文主要介紹如何寫LED驅動程式。 主要介紹GPIO的 呼叫、賦值以及配置的函式 (1)使用一個GPIO前必須對其進行申請,申請GPIO
linux裝置驅動(3)字元驅動 -led
本文基於mini2440 /* * kernel : linux-2.6.22.6 * gcc : arm-linux-gcc -3.4.5 */ #include <linux/module.h> #include <linux/kerne
【複習】linux之LED驅動的裝置樹方式
【前言】感謝陸老師 linux中led驅動(裝置樹)程式設計筆記 1.模組三要素 用到的標頭檔案 #include <linux/kernel.h> #include <linux/module.h> 1.1 初
Linux裝置驅動第四天(自動建立裝置節點、LED驅動程式)
回顧: 與驅動有關的幾個重要結構體 1,struct cdev //從軟體上代表硬體裝置 { dev_t dev;//裝置號 = 主裝置號+次裝置號 struct file_operations f_ops; } 2,stru
linux裝置驅動之led子系統
/include/linux/leds.h enumled_brightness{ LED_OFF = 0, LED_HALF = 127, LED_FULL = 255, }; led_classd
Linux驅動開發09:【裝置樹】nanopi的LED驅動
介紹 這節通過在nanopi的裝置樹中新增LED子節點,來實現一個LED驅動。由於linux核心支援LED驅動框架並且有通用的LED驅動,因此這裡只需按照驅動要求新增裝置樹節點就可以了,不用我們自己重寫LED驅動。這一節先在裝置樹中新增一個LED節點,重新編譯
嵌入式Linux學習筆記(三) 字元型裝置驅動--LED的驅動開發
在成功構建了一個能夠執行在開發板平臺的系統後,下一步就要正式開始應用的開發(這裡前提是有一定的C語言基礎,對ARM體系的軟/硬體,這部分有疑問可能要參考其它教程),根據需求仔細分解任務,可以發現包含的外設有LED,BEEP,RS232,六軸感測(SPI介面),光環境感測器(I2C),音訊輸出, RTC等,
linux裝置驅動開發學習--記憶體和IO訪問
一 I/O 埠 1. 讀寫位元組埠(8 位寬) unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); 2. 讀寫字埠(16 位寬) unsigned inw(unsigne
如何檢視LINUX下的一個USB裝置使用的驅動模組
http://unix.stackexchange.com/questions/60078/find-out-which-modules-are-associated-with-a-usb-device Finding the Kernel Driver(s) Th
linux裝置驅動模型 - regmap
1. regmap介紹 regmap主要是為了方便操作暫存器而設計的,它將所有模組的暫存器(包括soc上模組的暫存器和外圍裝置的暫存器等) 抽象出來,用一套統一介面來操作暫存器 比如,如果要操作i2c裝置的暫存器,那麼就要呼叫i2c_transfer介面,要操作spi裝置的暫存
linux裝置驅動模型 - device/bus/driver
在linux驅動模型中,為了便於管理各種裝置,我們把不同裝置分別掛在他們對應的總線上,裝置對應的驅動程式也在總線上找,這樣就提出了deivce-bus-driver的模型,硬體上有許多裝置匯流排,那麼我們就在裝置模型上抽象出bus概念,相應的device就代表裝置,driver表示驅動,
linux裝置驅動模型 - sys/kobject
1. sysfs 1.1 sysfs檔案系統註冊 在系統啟動時會註冊sysfs檔案系統 (fs/sysfs/mount.c) int __init sysfs_init(void) { int err; sysfs_root = kernfs_creat
linux裝置驅動模型 - 驅動框架
linux驅動模型框架如圖所示: 1. kernfs 驅動最終是提供給使用者層使用,那麼其中的介面就是通過kernfs檔案系統來註冊,kernfs是一個通用的核心虛擬檔案系統 2. sysfs/kobject sysfs是裝置驅動檔案系統,裝置之間的各種關係會在在/
linux 核心模組程式設計之LED驅動程式(六)
我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下 LED1 LED2 LED3 LED4
linux裝置驅動(3)I2C驅動
i2c驅動程式的核心是建立i2c_driver結構體 /* This is the driver that will be inserted */ static struct i2c_driver at24cxx_driver = { .driver = { .name
《linux裝置驅動開發》,基於最新的linux 4.0核心-----筆記
第二章 Linux 的核心結構及構建 ---->這一章是自己總結的 1、核心結構(主要是下面這幾個部分) 系統呼叫介面<–>System call interface 程序管理<------>Process manag
linux裝置驅動 按鍵幾種寫法總結
對於基礎按鍵的驅動,有如下幾種寫法: (1)查詢 所謂查詢方法,主要描述應用程式會在while(1)裡面一直read,如果沒有資料會導致阻塞,佔用CPU;這種方法是最差的。 (2)中斷 中斷配合休眠會避免查詢法佔用CPU的缺點。 應用程式和查詢法沒有什麼區別, 但是驅動裡面的read
linux 裝置驅動 nand驅動框架
nand 裝置驅動(一)架構 使用mini2440 - nand 1. nand硬體 1.1 資源 LDATD0~7資料線和地址線是複用的,都是8位 既可以傳輸資料(命令或者資料), 也可以傳送地址訊號 訊號說明: CLE: 命令鎖存, 高表示cmd ALE: 地址鎖存, 高表示地址