arm驱动程序——自动创建设备节点 (韦东山的视频总结及针对linux-2.6.30)
2013-05-30 10:37
453 查看
[b]相关代码在资源中下载。
[/b]
mdev机制根据/sys/下的系统信息来创建设备节点。
自动创建节点的步骤:
1.入口函数中:
a.创建一个类。
b.在类下面创建一个设备。
2.出口函数中:
a.注销类下的设备。
b.销毁类。
下面是所用的函数及结构:
定义类
static struct class *first_alloc_class;
定义类下的设备
static struct class_device *first_alloc_device;
创建类
/*owner;THIS_MODULE ;name:类的名字,加载驱动程序以后会
*在/sys/class看到类的名字*/
class_create(owner,name)
创建设备
/*class:就是你已经创建的类;parent;可以直接写NULL;
*devt:可以用MKDEV(major,0);fmt;设备的名字,加载驱动程序以后
*在/sys/class/你设置的类的名字 看到设备的名字*/
struct class_device
device_create(struct class * class,struct device *parent,
dev_t devt,void *drvdata,const char *fmt,...)
设备的注销
/*dev:类下创建的设备结构体指针*/
void device_unregister(struct device *dev)
类的销毁
/*cls:你所创建的类的结构体指针*/
void class_destroy(struct class *cls)
注意:不同版本的linux内核创建类和设备的函数会有所不同的。
驱动程序:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/poll.h>
static struct class *first_alloc_class;
static struct class_device *first_alloc_device;
static int major;
static int first_alloc_open(struct inode *inode,
struct file *file)
{
printk("this is a test!");
return 0;
}
static ssize_t first_alloc_write (struct file *file,
const char __user *buffer,size_t num, loff_t *ooff)
{
printk("this is a function 0f write!");
return 0;
}
/*定义一个file_operations结构体*/
static struct file_operations filrst_alloc_ops ={
.owner = THIS_MODULE,
.open = first_alloc_open,
.write = first_alloc_write,
};
/*入口函数*/
int first_alloc_init(void){
/*注册,主设备出为0,自动分配设备号*/
major = register_chrdev(0,"first_alloc_device",
&filrst_alloc_ops);
/*创建类*/
first_alloc_class = class_create(THIS_MODULE,"first_class");
/*类下创建一个设备,MKDEV将主设备号和次设备号转换成dev_t类型*/
first_alloc_device = device_create(first_alloc_class,NULL,
MKDEV(major,0),NULL,"first_alloc_device");
return 0;
}
void first_alloc_exit(void){
/*注销*/
unregister_chrdev(major,"first_alloc_device");
/*类下的设备注销*/
device_unregister(first_alloc_class);
/*类的销毁*/
class_destroy(first_alloc_class);
}
MODULE_LICENSE("GPL");
/*修饰first_alloc_init*/
module_init(first_alloc_init);
/*修饰first_alloc_exit*/
module_exit(first_alloc_exit);
测试程序:
#include<stdio.h>
#include<fcntl.h>
int main(){
int fd;
fd = open("/dev/first_alloc_device",O_RDWR);
if(fd<0){
printf("can't open /dev/first_alloc_device!");
}
}
下面就是测试了
这两节的内容都是驱动的框架,下一节将补充open,write,实现点亮led.
[/b]
mdev机制根据/sys/下的系统信息来创建设备节点。
自动创建节点的步骤:
1.入口函数中:
a.创建一个类。
b.在类下面创建一个设备。
2.出口函数中:
a.注销类下的设备。
b.销毁类。
下面是所用的函数及结构:
定义类
static struct class *first_alloc_class;
定义类下的设备
static struct class_device *first_alloc_device;
创建类
/*owner;THIS_MODULE ;name:类的名字,加载驱动程序以后会
*在/sys/class看到类的名字*/
class_create(owner,name)
创建设备
/*class:就是你已经创建的类;parent;可以直接写NULL;
*devt:可以用MKDEV(major,0);fmt;设备的名字,加载驱动程序以后
*在/sys/class/你设置的类的名字 看到设备的名字*/
struct class_device
device_create(struct class * class,struct device *parent,
dev_t devt,void *drvdata,const char *fmt,...)
设备的注销
/*dev:类下创建的设备结构体指针*/
void device_unregister(struct device *dev)
类的销毁
/*cls:你所创建的类的结构体指针*/
void class_destroy(struct class *cls)
注意:不同版本的linux内核创建类和设备的函数会有所不同的。
驱动程序:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/poll.h>
static struct class *first_alloc_class;
static struct class_device *first_alloc_device;
static int major;
static int first_alloc_open(struct inode *inode,
struct file *file)
{
printk("this is a test!");
return 0;
}
static ssize_t first_alloc_write (struct file *file,
const char __user *buffer,size_t num, loff_t *ooff)
{
printk("this is a function 0f write!");
return 0;
}
/*定义一个file_operations结构体*/
static struct file_operations filrst_alloc_ops ={
.owner = THIS_MODULE,
.open = first_alloc_open,
.write = first_alloc_write,
};
/*入口函数*/
int first_alloc_init(void){
/*注册,主设备出为0,自动分配设备号*/
major = register_chrdev(0,"first_alloc_device",
&filrst_alloc_ops);
/*创建类*/
first_alloc_class = class_create(THIS_MODULE,"first_class");
/*类下创建一个设备,MKDEV将主设备号和次设备号转换成dev_t类型*/
first_alloc_device = device_create(first_alloc_class,NULL,
MKDEV(major,0),NULL,"first_alloc_device");
return 0;
}
void first_alloc_exit(void){
/*注销*/
unregister_chrdev(major,"first_alloc_device");
/*类下的设备注销*/
device_unregister(first_alloc_class);
/*类的销毁*/
class_destroy(first_alloc_class);
}
MODULE_LICENSE("GPL");
/*修饰first_alloc_init*/
module_init(first_alloc_init);
/*修饰first_alloc_exit*/
module_exit(first_alloc_exit);
测试程序:
#include<stdio.h>
#include<fcntl.h>
int main(){
int fd;
fd = open("/dev/first_alloc_device",O_RDWR);
if(fd<0){
printf("can't open /dev/first_alloc_device!");
}
}
下面就是测试了
这两节的内容都是驱动的框架,下一节将补充open,write,实现点亮led.
相关文章推荐
- arm驱动程序——手动设备节点 (韦东山的视频总结及针对linux-2.6.30.4)
- arm驱动程序——点亮led-利用次设备号(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序6_互斥—信号量(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序5_异步通信(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序3_定时器消抖(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序4_poll(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序2(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序6_互斥1—原子操作(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序2(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序1(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——点亮led(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序6_互斥1—原子操作(韦东山的视频总结及针对linux-2.6.30)
- arm驱动程序——按键程序6_互斥—信号量(韦东山的视频总结及针对linux-2.6.30)
- linux字符设备驱动总结之:全自动创建设备及节点
- linux字符设备驱动总结之:全自动创建设备及节点
- 韦东山Linux视频驱动第2期》学习总结之第17课(USB设备驱动程序)
- linux字符设备驱动总结之:全自动创建设备及节点
- linux字符设备驱动总结之:全自动创建设备及节点 .
- Linux驱动编程 step-by-step (四) 字符设备的注册与设备节点的自动创建
- linux字符驱动之自动创建设备节点