基於linux 4.4版本,板載6410
#include
/* 包含file_operation結構體 */
#include
/* 包含module_init module_exit */
#include
/* 包含license的巨集 */
#include
/* 包含copy_to_user之類 */
#include
#include
/* 包含ioremap之類 */
#include
#include
#include
#include
static
unsigned
int major;
static
struct class *leds_class;
static
struct device *led_dev[4]
;/* 要申請的gpio,預設初始化為輸出高電平 */
static
const
struct gpio leds_gpio=
,,,}
;/* 定義乙個open函式 */
static
intfirst_drv_open
(struct inode *inode,
struct file *filep)
return0;
}/* 定義乙個write函式 */
static ssize_t first_drv_write
(struct file *file,
const
char __user * buf, size_t len, loff_t *ppos)
/* 比較使用者空間傳的引數,來控制io狀態 */if(
strcmp
("on"
, buf)
)else
/* 根據引數設定led的輸出 */
switch
(minor)
else
break
;case1:
gpio_set_value
(s3c64xx_gpa(3
),val)
;break
;case2:
gpio_set_value
(s3c64xx_gpa(4
),val)
;break
;case3:
gpio_set_value
(s3c64xx_gpa(5
),val)
;break
;default
:break;}
return0;
}/* 把自己定義的函式介面集合起來,方便系統使用 */
static
const
struct file_operations leds_drv_file_operation =
;/* 把集合起來的函式介面告訴系統,同時使用111作為該裝置的字元裝置號 */
static
int __init first_drv_init
(void
)/* 建立乙個類 */
leds_class =
class_create
(this_module,
"leds_class");
if(!leds_class)
/* 建立從屬這個類的裝置 */
led_dev[0]
=device_create
(leds_class,
null
,mkdev
(major,0)
,null
,"leds");
if(!led_dev[0]
)/* 建立其它三個裝置 */
for(i =
1; i <
4; i++)}
/* 使用gpiolib申請gpio */if(
gpio_request_array
(leds_gpio,3)
)return0;
/* 倒影式錯誤處理機制 */
err_gpio_request_array:
for(i--
; i >
0; i--
)err_device_create_leds:
device_unregister
(led_dev[0]
);err_device_create_led0:
class_destroy
(leds_class)
;err_class_create:
unregister_chrdev
(major,
"leds_drv");
err_register_chrdev:
return
-eio;
}/* 從系統中解除安裝掉字元裝置號為111的裝置 */
static
void __exit first_drv_exit
(void
)/* 登出字元裝置 */
unregister_chrdev
(major,
"leds_drv");
/* 登出類 */
class_destroy
(leds_class)
;/* 釋放申請的gpio */
gpio_free_array
(leds_gpio,3)
;}/* 宣告段屬性 */
module_init
(first_drv_init)
;module_exit
(first_drv_exit)
;module_license
("gpl");
、、、
kern_dir =
/home/eric/documents/work/linux/linux-
4.4.phony:all
all:
make -c $(kern_dir) m=`pwd` modules
.phony:clean
clean:
make -c $(kern_dir) m=`pwd` modules clean
obj-m +
= test_01.o
eric@eric-pc:~/documents/work/linux/driver/test01$ make
make -c /home/eric/documents/work/linux/linux-4.4 m=`pwd` modules
make[1]: 進入目錄「/home/eric/documents/work/linux/linux-4.4」
cc [m]
/home/eric/documents/work/linux/driver/test01/test_01.o
building modules, stage 2.
modpost 1 modules
cc /home/eric/documents/work/linux/driver/test01/test_01.mod.o
ld [m]
/home/eric/documents/work/linux/driver/test01/test_01.ko
make[1]: 離開目錄「/home/eric/documents/work/linux/linux-4.4」
eric@eric-pc:~/documents/work/linux/driver/test01$ ls
makefile modules.order module.symvers test_01.c test_01.ko test_01.mod.c test_01.mod.o test_01.o
eric@eric-pc:~/documents/work/linux/driver/test01$
Linux 驅動學習筆記 字元裝置驅動模板 一
驅動入口函式 static int init init void 驅動出口函式 static void exit exit void 將上面兩個函式指定為驅動的入口和出口函式 module init init module exit exit module license gpl 新增協議 modu...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...