led_drv.c檔案如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
"led_opr.h"
#define led_num 2
/*① 確定主裝置號,也可以讓核心分配*/
static
int major =0;
static
struct class *led_class;
struct led_operations *p_led_opr;
#define min(a , b)(a < b ? a : b)
/*③ 實現對應的 drv_open/drv_read/drv_write 等函式,填入 file_operations 結構體*/
static ssize_t led_drv_read (
struct file *file,
char __user *buf, size_t size, loff_t *offset)
;static ssize_t led_drv_write (
struct file *file,
const
char __user *buf, size_t size, loff_t *offset)
;static
intled_drv_open
(struct inode *node,
struct file *file)
;static
int led_drv_close (
struct inode *node,
struct file *file)
;/*② 定義自己的 file_operations 結構體*/
static
struct file_operations led_drv =
;//④ 把 file_operations 結構體告訴核心:register_chrdev、
static
int __init led_init
(void
)for
(i=0
;i)device_create
(led_class,
null
,mkdev
(major, i)
,null
,"led%d"
,i);
p_led_opr =
get_board_led_opr()
;return0;
};//⑤ 誰來註冊驅動程式啊?得有乙個入口函式:安裝驅動程式時,就會去呼叫這個入口函式
//⑥ 有入口函式就應該有出口函式:解除安裝驅動程式時,出口函式呼叫 unregister_chrdev
static
void __exit led_exit
(void);
module_init
(led_init)
;module_exit
(led_exit)
;module_license
("gpl"
);
為了使同乙個驅動程式可以操作不同的led,採用分層的思想,以下是led_opr.**件
struct led_operations
;struct led_operations *
get_board_led_opr
(void);
//呼叫此函式是為了讓leddrv.c訪問led_operation結構體
為了使此驅動程式使用於其他板子,以下是board_demo檔案:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
"led_opr.h"
static
intboard_demo_led_init
(int which)
//初始化led,which哪乙個led
static
intboard_demo_led_ctl
(int which,
char status)
//初始化led,which哪乙個led
static
struct led_operations board_demo_led_opr =
;struct led_operations *
get_board_led_opr
(void
)
makefile檔案如下:
kern_dir =
/home/john/
100ask_imx6ull-sdk/linux-
4.9.88
all:
make -c $(kern_dir) m=`pwd` modules
$(cross_compile)gcc -o ledtest ledtest.c
clean:
make -c $(kern_dir) m=`pwd` modules clean
rm -rf modules.order
rm -f ledtest
# 參考核心原始碼drivers/
char
/ipmi/makefile
# 要想把a.c, b.c編譯成ab.ko, 可以這樣指定:
# ab-y := a.o b.o
# obj-m += ab.o
# leddrv.c board_demo.c 編譯成 100ask.ko
100ask_led-y :
= leddrv.o board_demo.o
obj-m +
=100ask_led.o
led 驅動程式測試
1.首先驅動程式檔案通過tftp傳輸到開發板上,然後執行insmod s3c led.ko 裝載led驅動模組 2.cat proc devices grep led,顯示led 250 3.建立裝置節點 mknod dev led0 c 250 0 mknod dev led1 c 250 1 m...
字元裝置驅動 LED驅動程式
int main open sys.open led.open write sys.write led.write 第一步 驅動功能實現 static int first drv open struct inode inode,struct file file static ssize t firs...
十 編寫LED驅動程式
結合前面介紹的linux字元驅動編寫的流程 申請裝置號 裝置註冊 生成裝置節點 開始對led驅動進行編寫。編寫驅動的流程 檢視原理圖以及資料手冊 核心尋找相似驅動進行開發,有時從零開始 字元驅動編寫以及實現功能,方便呼叫 編譯核心或者insmod載入 測試驅動。檢視原理圖以及資料手冊 如下圖 從圖中...