驱动程序任务就是
1.建立struct file_operations 结构,
2. 完成 struct file_operations 结构中device_seek,device_read等文件操作函数的实现。
3 .register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
4.实现挂载卸载驱动程序的两个入口。
int init_module()
{
........
}
void cleanup_module()
{
........
}
模块方式驱动程序制作步骤:
1 . 建立.c文件,例如 dramOp.c 。注意和应用程序结构有所不同。
其中没有头文件。主要有以下几个并行的部分;
(1)声明几个文件操作函数
static int device_open(struct inode *,struct file *);
static int device_release(struct inode *,struct file *);
static ssize_t device_read(struct file *,char *,size_t,loff_t *);
static ssize_t device_write(struct file *,const char *,size_t,loff_t *);
static loff_t device_seek(struct file *,loff_t,int);
(2)建立结构体。作用:《1》生成文件操作函数与应用程序相关函数对应关系。《2》用于驱动程序注册.
struct file_operations dram_mem_ops =
{
llseek: device_seek,
read: device_read,
write: device_write,
open: device_open,
release: device_release
};
(3) register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
(4) 几个函数的具体实现(定义).
static int device_open(struct inode * inode,struct file *file)
{
...
}
static int device_release(struct inode * inode,struct file *file)
{
...
}
static ssize_t device_read(struct file *file, char * buffer,size_t length,loff_t * offset)
{
...
}
static ssize_t device_write(struct file *file, const char * buffer,size_t length,loff_t * offset)
{
...
}
static loff_t device_seek(struct file *filp,loff_t off,int whence)
{
...
}
(5)两个函数名绝对不变的函数,与相应shell命令相对应,实现驱动的挂载和卸载。
int init_module()// 申请内存空间,且调用register_chrdev(含参数);实现真正挂载
{
}
void cleanup_module()//释放相应内存空间,且调用unregister_chrde(含参);实现真正卸载
{
}
2.完成上述dramOp.c,将其用驱动编译器编译成中间文件dramOp.o .注意他还不是可执行文件,之用真正与内核结合时(关联),才生成可执行文件dramOp。
3.在 arm板子的 shell 中mnt 本机 并在 dramOp.c 所在目录键入如下命令:
#insmod ./dramOp.o //此命令调用init_module()函数,实现驱动注册,将其挂载到内核。
此时只要用以下命令
#mknod /dev/设备名 设备类型 主设备号 次设备号
生成与驱动程序中定义完全一致的文件,用以操作。要确保设备名 设备类型 主设备号与驱动程序中规定的完全一致。
例如
#mknod /dev/name c 30 20 //此命令只要在应用程序操作相应文件之前任何时间执行即可。
4. 就可以用应用程序对设备进行操作拉
5.不用的时候用如下命令将驱动模块卸载
#rmmod dramOp //此时可是可执行文件拉,因为在执行命令#insmod ./dramOp.o 时就将中间文件生成可执行文件拉。
完工:
1.建立struct file_operations 结构,
2. 完成 struct file_operations 结构中device_seek,device_read等文件操作函数的实现。
3 .register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
4.实现挂载卸载驱动程序的两个入口。
int init_module()
{
........
}
void cleanup_module()
{
........
}
模块方式驱动程序制作步骤:
1 . 建立.c文件,例如 dramOp.c 。注意和应用程序结构有所不同。
其中没有头文件。主要有以下几个并行的部分;
(1)声明几个文件操作函数
static int device_open(struct inode *,struct file *);
static int device_release(struct inode *,struct file *);
static ssize_t device_read(struct file *,char *,size_t,loff_t *);
static ssize_t device_write(struct file *,const char *,size_t,loff_t *);
static loff_t device_seek(struct file *,loff_t,int);
(2)建立结构体。作用:《1》生成文件操作函数与应用程序相关函数对应关系。《2》用于驱动程序注册.
struct file_operations dram_mem_ops =
{
llseek: device_seek,
read: device_read,
write: device_write,
open: device_open,
release: device_release
};
(3) register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。
unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。
(4) 几个函数的具体实现(定义).
static int device_open(struct inode * inode,struct file *file)
{
...
}
static int device_release(struct inode * inode,struct file *file)
{
...
}
static ssize_t device_read(struct file *file, char * buffer,size_t length,loff_t * offset)
{
...
}
static ssize_t device_write(struct file *file, const char * buffer,size_t length,loff_t * offset)
{
...
}
static loff_t device_seek(struct file *filp,loff_t off,int whence)
{
...
}
(5)两个函数名绝对不变的函数,与相应shell命令相对应,实现驱动的挂载和卸载。
int init_module()// 申请内存空间,且调用register_chrdev(含参数);实现真正挂载
{
}
void cleanup_module()//释放相应内存空间,且调用unregister_chrde(含参);实现真正卸载
{
}
2.完成上述dramOp.c,将其用驱动编译器编译成中间文件dramOp.o .注意他还不是可执行文件,之用真正与内核结合时(关联),才生成可执行文件dramOp。
3.在 arm板子的 shell 中mnt 本机 并在 dramOp.c 所在目录键入如下命令:
#insmod ./dramOp.o //此命令调用init_module()函数,实现驱动注册,将其挂载到内核。
此时只要用以下命令
#mknod /dev/设备名 设备类型 主设备号 次设备号
生成与驱动程序中定义完全一致的文件,用以操作。要确保设备名 设备类型 主设备号与驱动程序中规定的完全一致。
例如
#mknod /dev/name c 30 20 //此命令只要在应用程序操作相应文件之前任何时间执行即可。
4. 就可以用应用程序对设备进行操作拉
5.不用的时候用如下命令将驱动模块卸载
#rmmod dramOp //此时可是可执行文件拉,因为在执行命令#insmod ./dramOp.o 时就将中间文件生成可执行文件拉。
完工: