1. 程式人生 > >linux裝置驅動--LED驅動

linux裝置驅動--LED驅動

linux裝置驅動--LED驅動

最近正在學習裝置驅動開發,因此打算寫一個系列部落格,即是對自己學習的一個總結,也是對自己的一個督促,有不對,不足,需要改正的地方還望大家指出,而且希望結識志同道合的朋友一起學習技術,共同進步。

作者:liufei_learning(轉載請註明出處)

email:[email protected]

IT學習交流群:160855096

開發環境:Win7(主機) +VisualBox + ubuntu10.10(虛擬機器) + TQ2440開發板(2.6.30.4核心)

功能:實現tq2440led控制以及自動建立裝置節點

目錄:

1.實現

1)程式分析框圖:

2)程式流程

3)原理圖

2.步驟

3.分析

1)字元設備註冊問題

2)file_operations()

3ioctl

4裝置節點的自動建立

實現:

程式分析框圖:

函式

funleds_open()

funleds_ioctl()

funleds_init()

funleds_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()

,建立裝置節點,解除安裝時呼叫leds_exit()登出裝置刪除裝置節點

由原理圖得知LED電路是共陽極的,並分別由2440的GPB5、GPB6、GPB7、GPB8口控制


步驟:

1.去掉核心已有的LED驅動設定,因為IO口與tq2440開發板不一致 修改arch/arm/plat-s3c24xx/common-smdk.c

[cpp] view plain copy  print?
  1. /* LED devices */
  2. /* 
  3. static structs3c24xx_led_platdata smdk_pdata_led4 = { 
  4.     .gpio        =S3C2410_GPF4, 
  5.     .flags        =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 
  6.     .name        ="led4", 
  7.     .def_trigger    ="timer", 
  8. }; 
  9. static structs3c24xx_led_platdata smdk_pdata_led5 = { 
  10.     .gpio        =S3C2410_GPF5, 
  11.     .flags        =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 
  12.     .name        ="led5", 
  13.     .def_trigger    ="nand-disk", 
  14. }; 
  15. static structs3c24xx_led_platdata smdk_pdata_led6 = { 
  16.     .gpio        =S3C2410_GPF6, 
  17.     .flags        =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 
  18.     .name        ="led6", 
  19. }; 
  20. static structs3c24xx_led_platdata smdk_pdata_led7 = { 
  21.     .gpio        =S3C2410_GPF7, 
  22.     .flags        =S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 
  23.     .name        ="led7", 
  24. }; 
  25. static structplatform_device smdk_led4 = { 
  26.     .name        ="s3c24xx_led", 
  27.     .id        =0, 
  28.     .dev        ={ 
  29.         .platform_data= &smdk_pdata_led4, 
  30.     }, 
  31. }; 
  32. static structplatform_device smdk_led5 = { 
  33.     .name        ="s3c24xx_led", 
  34.     .id        =1, 
  35.     .dev        ={ 
  36.         .platform_data= &smdk_pdata_led5, 
  37.     }, 
  38. }; 
  39. static structplatform_device smdk_led6 = { 
  40.     .name        ="s3c24xx_led", 
  41.     .id        =2, 
  42.     .dev        ={ 
  43.         .platform_data= &smdk_pdata_led6, 
  44.     }, 
  45. }; 
  46. static structplatform_device smdk_led7 = { 
  47.     .name        ="s3c24xx_led", 
  48.     .id        =3, 
  49.     .dev        ={ 
  50.         .platform_data= &smdk_pdata_led7, 
  51.     }, 
  52. };*/
  53. staticstruct platform_device__initdata *smdk_devs[] = {  
  54.     &s3c_device_nand,  
  55.     /*&smdk_led4, 
  56.     &smdk_led5, 
  57.     &smdk_led6, 
  58.     &smdk_led7,*/
  59. };  

[cpp] view plain copy  print?
  1. void __initsmdk_machine_init(void)  
  2. {  
  3.     /*Configure the LEDs (even if we have no LED support)*/
  4.     /* 
  5.     s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP); 
  6.     s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP); 
  7.     s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP); 
  8.     s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP); 
  9.     s3c2410_gpio_setpin(S3C2410_GPF4, 1); 
  10.     s3c2410_gpio_setpin(S3C2410_GPF5, 1); 
  11.     s3c2410_gpio_setpin(S3C2410_GPF6, 1); 
  12.     s3c2410_gpio_setpin(S3C2410_GPF7, 1);*/
  13.     if (machine_is_smdk2443())  
  14.         smdk_nand_info.twrph0 = 50;  
  15.     s3c_device_nand.dev.platform_data = &smdk_nand_info;  
  16.     platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));  
  17.     s3c_pm_init();  
  18. }  


2.編寫tq2440的LED驅動,程式碼如下

[cpp] view plain copy  print?
  1. /* 
  2.  * tq2440_leds.c 
  3.  * 
  4.  * Created on: 2011-11-29 
  5.  *     Author: liufei_learning 
  6.  * 
  7.  */
  8. #include<linux/module.h>
  9. #include<linux/init.h>
  10. #include<linux/fs.h>
  11. #include<mach/hardware.h>
  12. 相關推薦

    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

    【複習】linuxLED驅動裝置樹方式

    【前言】感謝陸老師 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: 地址鎖存, 高表示地址