led驅動程式

2021-10-11 18:30:34 字數 3260 閱讀 4204

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載入 測試驅動。檢視原理圖以及資料手冊 如下圖 從圖中...