久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 學習筆記 > linux字符設備驅動(dong)框架及編寫流程

linux字符(fu)設(she)備驅動框架及(ji)編(bian)寫流(liu)程 時間:2018-08-27      來源:未知

流程:

init

{

}

exit

{

}

申(shen)請(qing)設備號 (動態(tai)注冊(ce)/靜態(tai)注冊(ce)) 創建一個字符設備 cdev_alloc

初始化字符設備 cdev_init

設備(bei)號和字符設備(bei)關聯 cdev_add

銷毀字符設備(bei) cdev_del

解注冊設(she)備號 unregister_chrdev_region

1 設備號

設(she)備(bei)號(hao)分為(wei)主設(she)備(bei)號(hao)和次設(she)備(bei)號(hao)主設(she)備(bei)號(hao)表(biao)示一類設(she)備(bei)

次設(she)(she)備號表示(shi)一(yi)類設(she)(she)備中的一(yi)個設(she)(she)備

#include #define MINORBITS 20

#define MINORMASK ((1U << MINORBITS) - 1)

#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))

#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))

#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) typedef u_long dev_t;

2 申請設備號

靜態注冊

#include

extern int register_chrdev_region(dev_t, unsigned, const char *);

函數實現在(zai)char_dev.c

int register_chrdev_region(dev_t from, unsigned count, const char *name)

from : 設備(bei)號 通過 MKDEV 生(sheng)成count : 子設備(bei)個數

name : 設備名

返(fan)回(hui)值: 成功返(fan)回(hui)0, 失敗返(fan)回(hui)負數錯誤碼

動態注冊

#include

extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,

const char *name) dev : 設備(bei)號(hao)指針

baseminor : 子設備第一個編號count : 子設備個數

name : 設備(bei)名

返回值: 成功返回0, 失敗返回負(fu)數錯(cuo)誤碼

注銷設備號

#include

void unregister_chrdev_region(dev_t from, unsigned count) from : 設(she)備號

count: 子設備個(ge)數

3 創建字符設備

struct cdev *cdev_alloc(void)

 分配一個(ge)cdev結(jie)構(gou)體,使用此結(jie)構(gou)體描述(shu)一個(ge)字符(fu)設(she)備成功返回(hui)一個(ge)指(zhi)針,否則返回(hui)NULL

#include

void cdev_del(struct cdev *p) 刪除字符設備結構體#include

void cdev_init(struct cdev *cdev, const struct file_operations

*fops)

初始化(hua)一個字符設備(bei)

cdev :被(bei)初始化的字(zi)符設備(bei)指針(zhen)fops :字(zi)符設備(bei)操作(zuo)函數指針(zhen)集

int cdev_add(struct cdev *p, dev_t dev, unsigned count) 講字符(fu)設備添加(jia)到內核

體指針

p :字(zi)符設備結(jie)(jie)構體指針(zhen),cdev_alloc函數成功返回的結(jie)(jie)構

dev : 設(she)備(bei)號(hao) 通(tong)過動態(tai)或靜態(tai)成功分配的設(she)備(bei)號(hao)count :子設(she)備(bei)個(ge)數

返(fan)回(hui)值:成功返(fan)回(hui)0, 出錯返(fan)回(hui)負數(shu)的錯誤碼

4 創建設備(bei)文(wen)件

sudo mknod /dev/haha0 c 250 0

/dev/haha0 創建的子設備文(wen)件名

c 字符設備

250 主設備號

0 次設備號

會在 /dev 下創建(jian)一(yi)個haha0的(de)一(yi)個字符設備文件(jian),主設備號(hao)

250,次設備號0

5 數據拷貝(bei)

char user *buf : user 指用戶(hu)空(kong)間的指針

從(cong)內核空間向用戶空間拷貝數據

static inline long copy_to_user(void user *to, const void *from, unsigned long n)

to :用(yong)戶空間(jian)指(zhi)針( user) from :數(shu)據源

n :拷貝的字(zi)節(jie)數返回值 0 成(cheng)功

從用戶空(kong)間向內核(he)空(kong)間拷(kao)貝數據(ju)

static inline long copy_from_user(void *to, const void user * from, unsigned long n) to :內核buf指(zhi)針(zhen)

form:用(yong)戶(hu)空間數(shu)據源指針n : 拷貝字節數(shu)

返回值 0 成功

注:字符設備驅(qu)動(dong)測(ce)試步驟:

1 編譯出(chu)hello.ko(make)和test 2 sudo insmod hello.ko

3 cat /proc/devices 查看設備號

4 sudo mknod /dev/haha0 c 250 0

5 sudo ./test

如果打印open /dev/haha0 ok 則驅動正常否則驅動有(you)錯,需改正

6 sudo rmmod hello

7 sudo rm -rf /dev/haha0

上一篇:什么是進程,學霸來告訴你

下一篇:TCP網絡編程詳解

熱點文章(zhang)推薦
華清(qing)學員就業榜(bang)單
高薪學員(yuan)經驗分享
熱點(dian)新(xin)聞推薦
前(qian)臺(tai)專(zhuan)線:010-82525158 企(qi)業培(pei)訓洽談專線:010-82525379 院校(xiao)合作洽(qia)談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部