一、大体调用过程
应用程序位于用户空间,驱动程序位于内核空间,Linux系统规定,用户空间不可以直接调用内核空间的函数。所以必须经过系统调用,应用程序才可以调用驱动程序的函数。具体系统调用的过程,这是属于更高级别的知识,以后有机会再补充,大体就是通过C库函数实现的,目前只要知道这个过程即可。另外,应用程序通过系统调用去调用驱动程序的函数,还有一个前提就是驱动程序必须留有接口,这里的接口就是ops函数操作集(有点类似Windows的DLL),所以我们一般在驱动程序中设计好接口,然后实现接口函数。
二、具体实施过程
2.1根据对设备的操作需要,设计驱动程序的接口, 如下:
2.2在驱动程序中实现接口,如下:
static int xxx_open(struct inode *inode, struct file *filp)
{
/* 实现具体的功能*/
return 0;
}
static ssize_t xxx_read(struct file *filp, char __user *buf, size_t cnt, loff_t *off)
{
/* 实现具体的功能*/
return 0;
}
static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *off)
{
/* 实现具体的功能*/
return 0;
}
2.3在应用程序通过C库函数,调用驱动程序的接口,实现对设备的操作:
先打开设备文件得到文件标识符:fd = open(filename, O_RDWR);
根据文件标识符实现读操作:ret = read(fd, databuf, sizeof(databuf));
根据文件标识符实现写操作:ret = write(fd, writebuf, sizeof(writebuf));
2.4如果使用设备树的话,在设备树文件dtsi中增加设备信息。