常用字元裝置入口出口框架 自動建立節點

2021-10-03 14:17:22 字數 2911 閱讀 6303

​ 驅動裝置號除了直接指定外,還可以讓linux核心分配。首先建立裝置結構體,結構體內包含的裝置的屬性:

struct newchrled_dev

;struct newchrled_dev newchrled;

​ 在裝置入口函式***_init中新增裝置號處理**:

/* 獲取裝置號 */

if(newchrled.major)

else

​ 裝置號處理分為兩種情況,一是直接指定主裝置號(次裝置號一般設定為0),然後使用mkdev這個巨集獲取dev_t型別的裝置號,此型別的裝置號包含了主裝置號和次裝置號資訊。最後使用register_chrdev_region函式向核心註冊裝置號,告知系統此裝置號已被占用。該函式第乙個引數為裝置號;第二個引數為申請的數量,一般為1;第三個引數為裝置名。

​ 二是沒有指定主裝置號,使用alloc_chrdev_region函式向核心申請乙個裝置號,該函式第乙個引數為裝置號指標,用來儲存申請到的裝置號;第二個引數為次裝置號;第三個引數為申請的數量,一般為1;第四個引數為裝置名。

​ 裝置結構體中有乙個cdev的架構體變數,表示乙個字元裝置,cdev結構體在include/linux/cdev.**件中的定義如下:

struct cdev 

;

​ 裝置註冊實質上就是初始化cdev,然後使用cdev進行註冊。在裝置號處理**後新增裝置註冊**:

/* 註冊裝置 */

newchrled.cdev.owner = this_module;

//初始化cdev中的owner

cdev_init

(&newchrled.cdev,

&led_fops)

;//初始化cdev結構體變數

cdev_add

(&newchrled.cdev, newchrled.devid,1)

;//向linux核心新增字元裝置

​ 裝置註冊使用了兩個函式:

​ cdev_init(struct cdev *cdev, const struct file_operations *fops),引數一是要初始化的cdev的指標,引數二是操作函式結構體指標。

​ int cdev_add(struct cdev *p, dev_t dev, unsigned count),引數一是要註冊的cdev的指標,引數二是裝置號,引數三是要註冊的裝置數量。

​ 在終端使用應用程式前要使用mkond命令建立驅動裝置節點,這一步可以在驅動**內自動實現,在終端只要使用modprobe載入驅動模組後就會自動建立裝置節點。

​ udev是乙個使用者程式,在linux下通過udev實現裝置檔案的建立與刪除,比如使用modprobe後自動在/dev下建立裝置節點檔案,使用rmmod後刪除裝置節點檔案。使用busybox構建根檔案系統後,會建立乙個udev的簡化版mdev,嵌入式linux一般使用mdev。mdev同時也管理熱拔插時間,在==/etc/init.d/rcs==中新增如下語句:

​ echo /sbin/mdev > /proc/sys/kernel/hotplug

​ 自動建立裝置節點一般在裝置註冊**後:

/* 自動建立裝置節點 */

newchrled.class =

class_create

(this_module, device_name)

;//建立類

newchrled.device =

device_create

(newchrled.class,

null

, newchrled.devid,

null

, device_name)

;//建立裝置

​ 1)首先要在裝置結構體中建立類和裝置結構體指標。類定義在include/linux/device.h裡面。

​ 2)然後使用class_create函式建立類,函式原型:struct class *class_create (struct module *owner, const char *name),引數一owner一般為this_module,引數二為類的名字,返回值是指向結構體class的指標。

​ 3)最後使用device_create函式建立裝置。引數一為裝置建立在哪個類下,引數二為父裝置,無則null,引數三為裝置號,引數四為裝置可能使用的一些資料,無則null,引數五是裝置名字,即建立裝置節點檔案的名字。

​ 在驅動出口函式***_exit中要刪除裝置號、裝置註冊資訊、類和自動建立裝置,在出口函式中新增**:

/* 出口函式 */

static

void __exit led_exit

(void

)

​ 在驅動入口函式中先建立的在出口函式中後刪除。入口函式中的建立順序是:裝置號——註冊字元裝置——建立類——建立裝置。出口函式中的刪除順序則是:刪除裝置——刪除類——刪除字元裝置——刪除裝置號。

​ 裝置屬性結構體可以作為私有資料來使用,操作函式的引數中有乙個file型別的結構體指標filp,該結構體有乙個private_data的成員變數,表示私有資料。可在open函式中設定私有資料:

/* open函式 */

static

intled_open

(struct inode *inode,

struct file *filp)

​ 然後在write、read等其他操作函式中使用:

/* release函式 */

static

intled_release

(struct inode *inode,

struct file *filp)

python常用字串 Python常用字串操作

1.字串首字母大寫 2.統計字串中某個字母的個數 統計字串中某個字母的個數又分兩種情況,在整個字串中統計和在某個索引範圍內統計 1 在整個字串中統計,如下面統計字串str2中字母a的個數 2 在某個索引區間內統計,如下面統計字串str2索引1到10和1到30範圍內字母t的個數 3.求字串的長度 4....

mysql常用字串 MYSQL常用字串函式寶典

mysql常用字串函式 想更進一步加強自己在查詢語句方面的能力,需要掌握常用函式。字串函式 1 concat s1,s2,sn 將s1,s2,sn串聯成乙個字串。exp root test 14 43 desc t1 field type null key default extra id int ...

ORACLE 常用字元函式

1.lower lower str 強制小寫 2.upper upper str 強制大寫 3.initcap initcap str 每個單詞首字母大寫 示例 sql select initcap my boy from dual 返回 my boy 注意 單詞之間用下劃線 分割 4.concat...