您的位置:首页 > 其它

驱动开发-字符设备2

2016-05-03 20:15 302 查看

字符设备驱动2

readl和writel 读寄存器的值,写寄存器的值

writel(readl(gpd0con) & (~(0xf << 0)) | (0x2 << 0));


void __iomen *timer_base

timer_base = ioremap(0x100,0x4);

timer_base += 0x4; 加多少就是多少

内存之间的拷贝(用户空间和内核空间)

memcpy(void * dest,const void * src,size_t n);


__must_check 必须判断返回值

__user 修饰的都是用户空间

从内核区中读取数据到用户区

static inline unsigned long __must _check copy_to_user(void __user *to,const void *from,unsigned long n);
//1. void __user *to 用户空间
//2. void *from 内核空间
//3. long n 拷贝的大小

static inline unsigned long __must_check copy_from_user(void *to,void __user *from,unsigned long n);
//1. void *to 内核空间
//2. void __user *from 用户空间
//3. long n 拷贝的大小

//成功返回0,失败返回未拷贝的字节数

/*****************file_operations结构体****************/
//loff_t *loff --> 文件指针偏移的位置


用户空间与内核空间交互

/***********************用户空间************************/
1. 无传参的命令发送
ioctl(int d,int request,void *argp);
//1.文件描述符
//2.命令
//    32位的无符号整形
//    设备类型(8)--> 那一类设备'c'
//    序列号(8) --> 这一类设备的第几个命令
//    方向(2) --> 读写判断
//    尺寸(14) --> 大小

内核已经定义量宏(命令)

没有数据传递使用的命令
_IO(taye,nr);
1.type 设备类型
2.nr 序列号

ioctl(fd,_IO('a',0));

2. 有传参的命令发送
ioctl(int d,int request,void *argp);
//1.文件描述符
//2.命令
//    32位的无符号整形
//    设备类型(8)--> 那一类设备'c'
//    序列号(8) --> 这一类设备的第几个命令
//    方向(2) --> 读写判断
//    尺寸(14) --> 大小
//3.需要传递的数据

内核已经定义量宏(命令)

有数据传递的命令
_IOR(type,nr,size);
_IOW(type,nr,size);
_IOWR(type,nr,size);
1.type -- 设备类型
2.nr -- 序列号
3.size -- 数据类型

ioctl(fd,\_IO('a',0,int),&pre);


/***********************内核空间************************/
1. 无传参的命令发送
long (*unlocked_ioctl) (struct file*,unsiged int,unsiged long);
//1.文件描述符
//2.用户空间传的命令
//3.用户空间传递的参数

static long my_ctrl(struct file* file,unsiged int cmd,unsiged long arg)

int data = 0;

if(copy_from_user(&data,(void *)arg,sizeof(int)));

switch(cmd)


获取一个或多个设备编号

static inline int register_chrdev(unsigned int major,unsigned int baseminor,unsigned int count,const char *name);

//1. 主设备号
//2. 次设备号
//3. 次设备号数
//4. 名字
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: