#include <stdio.h>
main()
{
printf("hello world\n");
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int fd;
char *leds = "/dev/leds";
char *test1 = "/bin/test1";
char *test2 = "/bin/test2";
if((fd=open(leds,O_RDWR|O_NOCTTY|O_NDELAY))<0)
{
printf("open %s is failed %d\n",leds,fd);
}
printf("open %s is OK %d\n",leds,fd);
if((fd=open(test1,O_RDWR,0777))<0)
{
printf("open %s is failed %d\n",test1,fd);
}
printf("open %s is OK %d\n",test1,fd);
if((fd=open(test2,O_RDWR|O_CREAT,0777))<0)
{
printf("open %s is failed %d\n",test2,fd);
}
printf("open %s is OK %d\n",test2,fd);
return 0;
}
1.我们这节课要讲的杂项设备驱动是属于我们这三大设备驱动里面的哪个呢?
杂项设备是字符设备的一种。可以自动生成设备节点。
//目录下设备节点。
cat /dev
系统里面有很多杂项设备。我们可以输入
//目录下d 杂项设备。
cat /proc/misc
2.杂项设备除了比字符设备代码简单,还有别的区别吗?
杂项设备的主设备号是相同的,均为 10,
次设备号是不同的。
主设设备号相同就可以节省内核的资源。
主设备号可以比做成电话号码的区号。
比如北京的区号是010,
次设备号可以比作成电话号码。
//查看的都是主设备号
cat /proc/devices
4 杂项设备的描述
定义在内核源码路径:
vim include/linux/miscdevice.h
struct miscdevice{
int minor; //次设备号
const char *name; //设备节点的名字
const struct file_operations *fops; //文件操作集
。。。。。。}
file operations 文件操作集在定义在
include/linux/fs.h
下面。里面的一个结构体成员都对应一个调用。
注册杂项设备
extern int misc register(struct miscdevice *misc);
注销杂项设备
extern int misc deregister(struct miscdevice *misc);
5 注册杂项设备的流程
(1)填充 miscdevice 这个结构体
(2)填充file operations 这个结构体
(3)注册杂项设备并生生成设备节点。
#include<linux/init.h>
#include<linux/module.h>
#include<linux/miscdevice.h>
#include <linux/fs.h>
struct file_operations misc_fops ={
.owner=THIS MODULE
}
struct miscdevice misc_dev={
.minor=MISC_DYNAMIC_MINOR,
.name="hello misc",
.fops= &misc_fops
}
static int misc_init(void)
{
int ret;
ret = misc_register(&misc_dev);
if(ret < 0)
{
printk("misc registe is error\n");
return -1;
}
printk("misc registe is succeed\n");
return 0;
}
static void misc exit(void)
{
misc_deregister(&misc_dev);
printk("misc byb byb \n");
}
module init(misc_init);
module exit(misc_exit);
MODULE LICENSE("GPL");