1 自動創建設備文件創建設備文件類
#define class_create(owner, name)
設備可以有多個子設備,class_create這個宏相當于創建一
個子設備的一個父類,通過它來創建多個子設備 owner :模塊本身 THIS_MODULE name : name
返回值 : struct class 類型指針, 出錯:NULL,成功:有效的struct class指針
創建設備文件
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char
*fmt, ...)
class :通過 class_create 創建的設備文件類指針 parent :父設備,一般NULL
devt :設備號,包含主設備號和次設備號 drvdata :私有數據
fmt :設備文件名
返回值:Returns &struct device pointer on success, or ERR_PTR() on error.
失敗時需要用 ERR_PTR 函數判斷
銷毀設備文件
void device_destroy(struct class *class, dev_t devt)
class :設備文件類指針
devt :設備號,包含主設備號和次設備號
銷毀設備文件類
extern void class_destroy(struct class *cls); cls :設備文件類指針
設備類查看
ls /sys/class/xxxxx
ls /dev/xxx
2 區分設備文件 struct inode {
......
dev_ti_rdev; inode結構體保存的設備號
......
void
*i_private; inode 的私有數據
}
ptintk("open device num majour : %d , min min : %d\r\n", MAJOR(pNode->i_rdev), MINOR(pNode->i_rdev)
dmesg | tail -20
3 ioctl
命令碼構建,內核使用32位表達了4種信息 dir:讀寫,size:
ioctl第三個參數時類型所占的字節數
,type(可以做命令的一個分段,類似于使用枚舉的錯誤碼分段), nr:命令碼
*0xE0000000DIR
*0x80000000DIR = WRITE
*0x40000000DIR = READ
*0x20000000DIR = NONE
* 0x3FFF0000 SIZE (overlaps NONE bit)
* 0x0000FF00 TYPE
* 0x000000FF NR (CMD)
4 互斥鎖
# define mutex_init(mutex)
mutex :要初始化的鎖,注意傳的是 struct mutex 類型指
針
mutex_lock
mutex_unlock
5 信號量
static inline void sema_init(struct semaphore *sem, int val) sem :信號量結構體指針
val :信號量持有資源個數
down 申請資源,當沒有資源時,休眠等待,不可中斷 extern void down(struct semaphore *sem)
down_interruptible 申請資源,當沒有資源時,休眠等待,可中
斷
extern int __must_check down_interruptible(struct semaphore *sem)
up 釋放資源
extern void up(struct semaphore *sem)
6 原子變量
ATOMIC_INIT(0) 初始化
atomic_dec_and_test 減1并測試,為0返回true,否則返回
false
atomic_inc 加1
7 自旋鎖
spin_lock_init(&g_SpinLock); 初始化 spin_lock(&g_SpinLock); 加鎖 spin_unlock(&g_SpinLock); 解鎖