linux驅動 3 高階字元裝置驅動之ioctl

2021-07-31 16:53:44 字數 2932 閱讀 3000

linux驅動:[3]高階字元裝置驅動之ioctl

測試平台:x86 pc linux-4.4.0

scull.c:

#include 

#include

#include

#include

#include

#include

#include

#include

#include "scull.h"

//裝置私有資料

struct scull_dev dev;

//最大ioctl命令號

#define scull_ioc_maxnr 4

//預設自動分配主裝置號

#define scull_dev_major 0

static

int scull_major = scull_dev_major;

module_param(scull_major, int, s_irugo);

struct

class *scull_class;

struct cdev cdev;

long scull_ioctl(struct file *filp, unsigned

int cmd, unsigned

long arg)

return retval;

}static

const

struct file_operations scull_fops = ;

static

int scull_init(void)

if (result < 0)

return result;

//用於udev/mdev自動建立節點

scull_class = class_create(this_module, "scull");

device_create(scull_class, null, devno, null, "scull");

//靜態新增cdev

cdev_init(&cdev, &scull_fops);

cdev.owner = this_module;

cdev_add(&cdev, devno, 1);

printk("scull init success\n");

return0;}

static

void scull_exit(void)

module_author("ziping chen ");

module_license("gpl");

module_init(scull_init);

module_exit(scull_exit);

scull.h:

#ifndef scull_h_

#define scull_h_

//定義幻數

#define scull_ioc_magic '$'

//定義命令->

//資料清零

#define scull_ioc_clear _io(scull_ioc_magic, 0)

//獲取資料(通過指標)

#define scull_ioc_get _ior(scull_ioc_magic, 1, int)

//獲取資料(通過返回值)

#define scull_ioc_query _io(scull_ioc_magic, 2)

//設定資料(通過指標)

#define scull_ioc_set _iow(scull_ioc_magic, 3, int)

//設定資料(通過直接引用引數值)

#define scull_ioc_tell _io(scull_ioc_magic, 4)

#endif

makefile:

obj-m := scull.o

#編譯進模組

kerneldir := /lib/modules/4.4

.0-59-generic/build #此處為linux核心庫目錄

pwd := $(shell pwd) #獲取當前目錄

output := $(obj-m) $(obj-m:.o=.ko) $(obj-m:.o=.mod

.o) $(obj-m:.o=.mod

.c) modules.order module.symvers

modules:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -rf $(output)

linux c應用程式測試:

#include 

#include

#include

#include "scull.h"

int main(void)

//資料清零

ioctl(fd, scull_ioc_clear);

//直接傳值測試

data = ioctl(fd, scull_ioc_query);

data = 100;

ioctl(fd, scull_ioc_tell, data);

//指標傳值測試

ioctl(fd, scull_ioc_get, &data);

data = 122;

ioctl(fd, scull_ioc_set, &data);

return

0;}

測試結果:

**的大部分解析都位於上面測試,這裡我只是提一下程式編寫過程中可能出現的問題:

Linux驅動基礎 platform裝置驅動

以高通平台為例,會在kernel arch arm mach msm下的相應的board c檔案裡邊用 dt machine start 這個巨集定義一系列的晶元。以高通8916為例 在kernel arch arm mach msm board 8916.c檔案裡定義了 當然下面使用哪個要看一下。...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...