字元裝置驅動筆記(二)

2021-07-27 19:02:26 字數 4411 閱讀 2668

怎麼寫led驅動:

①寫框架

②完善硬體的操作

1>看原理圖

2>看2440手冊

3>微控制器:直接操作實體地址

驅動程式:操作虛擬位址,實體地址用iorremap對映為虛擬位址

myleds.c

#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

*/

}return0;

}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

*/

}return1;

}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

; }

}return1;

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

* 當應用程式操作裝置檔案時所呼叫的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

"); /*

/dev/leds

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

/dev/led1,2,3

*/

printk(device_name

"initialized\n");

return0;

}/** 執行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");

ledtest.c

#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

return0;

}

makefile

kern_dir = /work/system/linux-2.6.22.6

all:

make -c $(kern_dir) m=`pwd` modules

clean:

make -c $(kern_dir) m=`pwd` modules clean

rm -rf modules.order

obj-m += myleds.o

字元裝置驅動筆記(二)

怎麼寫led驅動 寫框架 完善硬體的操作 1 看原理圖 2 看2440手冊 3 微控制器 直接操作實體地址 驅動程式 操作虛擬位址,實體地址用iorremap對映為虛擬位址 myleds.c include include include include include include includ...

字元裝置驅動筆記

在所有linux裝置驅動中,字元裝置驅動最為基礎,本筆記將講解linux字元裝置驅動的結構,並解釋其主要組成部分的程式設計方法。cdev結構 struct cdev cdev結構體的dev t成員定義了裝置號,為32位,其中12bit為主裝置號,20bit為次裝置號。使用如下巨集可以從dev t獲得...

Linux裝置驅動筆記 字元裝置驅動程式

關鍵字 編寫linux字元裝置驅動程式 linux提供了幾種註冊字元裝置的方式。如下 include include include include define dev major 100 define dev name test static intmyopen struct inode ino...