怎麼寫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.6all:
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...