LED驅動字元模型

2021-06-02 04:36:49 字數 3335 閱讀 8223

#include #include #include #include #include #include #include #include #include #include #define device_name     "leds"  /* 載入模式後,執行」cat /proc/devices」命令看到的裝置名稱 */

#define led_major 231 /* 主裝置號 */

static struct class *leds_class;

static struct class_device *leds_class_devs[4];

/* bit0<=>d10, 0:亮, 1:滅

* bit1<=>d11, 0:亮, 1:滅

* bit2<=>d12, 0:亮, 1:滅

*/ static char leds_status = 0x0;

static declare_mutex(leds_lock); // 定義賦值

//static int minor;

static unsigned long gpio_va;

#define gpio_oft(x) ((x) - 0x56000000)

#define gpfcon (*(volatile unsigned long *)(gpio_va + gpio_oft(0x56000050)))

#define gpfdat (*(volatile unsigned long *)(gpio_va + gpio_oft(0x56000054)))

/* 應用程式對裝置檔案/dev/leds執行open(...)時,

* 就會呼叫s3c24xx_leds_open函式

*/static int s3c24xx_leds_open(struct inode *inode, struct file *file)

case 1: /* /dev/led1 */

case 2: /* /dev/led2 */

case 3: /* /dev/led3 */

} return 0;

}static int s3c24xx_leds_read(struct file *filp, char __user *buff,

size_t count, loff_t *offp)

case 1: /* /dev/led1 */

case 2: /* /dev/led2 */

case 3: /* /dev/led3 */

}return 1;

}static ssize_t s3c24xx_leds_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

case 1: /* /dev/led1 */

else

break;

}case 2: /* /dev/led2 */

else

break;

}case 3: /* /dev/led3 */

else

break;}}

return 1;

}/* 這個結構是字元裝置驅動程式的核心

* 當應用程式操作裝置檔案時所呼叫的open、read、write等函式,

* 最終會呼叫這個結構中指定的對應函式

*/static struct file_operations s3c24xx_leds_fops = ;

/* * 執行insmod命令時就會呼叫這個函式

*/static int __init s3c24xx_leds_init(void)

//static int __init init_module(void)

/* 註冊字元裝置

* 引數為主裝置號、裝置名字、file_operations結構;

* 這樣,主裝置號就和具體的file_operations結構聯絡起來了,

* 操作主裝置為led_major的裝置檔案時,就會呼叫s3c24xx_leds_fops中的相關成員函式

* led_major可以設為0,表示由核心自動分配主裝置號

*/ret = register_chrdev(led_major, device_name, &s3c24xx_leds_fops);

if (ret < 0)

leds_class = class_create(this_module, "leds");

if (is_err(leds_class))

return ptr_err(leds_class);

leds_class_devs[0] = class_device_create(leds_class, null, mkdev(led_major, 0), null, "leds");

for (minor = 1; minor < 4; minor++)

printk(device_name " initialized\n");

return 0;}/*

* 執行rmmod命令時就會呼叫這個函式

*/static void __exit s3c24xx_leds_exit(void)

class_destroy(leds_class);

iounmap(gpio_va);

}/* 這兩行指定驅動程式的初始化函式和解除安裝函式 */

module_init(s3c24xx_leds_init);

module_exit(s3c24xx_leds_exit);

/* 描述驅動程式的一些資訊,不是必須的 */

module_author("");

module_version("0.1.0");

module_description("s3c2410/s3c2440 led driver");

module_license("gpl");

#include #include #include #include /*

* ledtest */

void print_usage(char *file)

int main(int argc, char **argv)

filename = argv[1];

fd = open(filename, o_rdwr);

if (fd < 0)

if (!strcmp("on", argv[2]))

else if (!strcmp("off", argv[2]))

else

return 0;

}

LED字元裝置驅動

一 實驗環境 開發機環境 作業系統 ubuntu 10.10 交叉編譯環境 arm linux gcc 4.4.1,安裝位置 usr local arm 4.4.1 6410板子核心原始碼路徑 work linux 2.6.36.2 v1.05 目標板環境 ok6410 a linux2.6.36 ...

字元裝置驅動 Led

驅動檔案 使用linux3.2.81核心 include include include include include include include include include include include static struct class ledsdrv class 類結構體 st...

字元裝置驅動 LED型

字元驅動程式 對於led型別的字元裝置驅動函式編寫 1 建立乙個file operation結構體,裡面會有點燈操作的各個硬體操作函式 2 編寫乙個drv init 函式 3 要對drv init函式進行修飾為入口函式,告訴核心,載入驅動時進行掛接 4 有init函式,那麼也會有出口函式exit m...