📄 mydrv.c
字号:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/types.h>
#include <linux/malloc.h>
#include <asm/uaccess.h>
#include <asm/page.h>
#include <linux/errno.h>
#include <linux/config.h>
#define MYDRV_CLS _IO('c',0x01)
ssize_t mydrv_read( struct file *, char* , size_t , loff_t * );
static ssize_t mydrv_write( struct file *, const char *, size_t , loff_t * );
static int mydrv_ioctl( struct inode * , struct file *, unsigned int , unsigned long );
int mydrv_open( struct inode* , struct file * );
int mydrv_release( struct inode* , struct file * );
char mybuf[100];
int mydrv_major = 99;
devfs_handle_t dev_handle;
struct file_operations mydrv_ops = {
open: mydrv_open,
read: mydrv_read,
write: mydrv_write,
ioctl: mydrv_ioctl,
release: mydrv_release,
};
ssize_t mydrv_read( struct file *filp, char* buf, size_t count, loff_t * f_pos )
{
int length = strlen(mybuf);
printk( "Enterring Read routine. Count value is :%d.\n", count );
/* if ( count>99 ) count = 99;
count = length - *f_pos;
if ( copy_to_user( buf, mybuf, count )){
printk( "error reading, copy to user.\n" );
return -EFAULT;
}
*f_pos += count;
return count;
*/
}
static ssize_t mydrv_write( struct file * filp, const char * buf, size_t count, loff_t *ppos )
{
int num;
printk( "Enterring Write routine. Count value is :%d.\n", count );
/* num = count<100? count: 100;
if ( copy_from_user( mybuf, buf, num ) )
return -EFAULT;
printk( "my_drv write success!\n" );
return num;
*/
}
static int mydrv_ioctl( struct inode * inode, struct file *file,
unsigned int cmd, unsigned long arg )
{
printk( "Enterring IO Control routine. Command code is :%x.\n", cmd );
/* switch( cmd ){
case MYDRV_CLS:
mybuf[0]=0x0;
return 0;
default:
return -EINVAL;
}
*/
}
#define MAX_MYDRV_DEV 2
int mydrv_open( struct inode* inode, struct file *filp )
{
unsigned int dev = MINOR( inode->i_rdev );
// if( mydrv_num )
// return -1;
if( dev >= MAX_MYDRV_DEV )
return -ENODEV;
// filp->f_op = &mydrv_ops;
printk( "open success!\n" );
// MOD_INC_USE_COUNT;
return 0;
}
int mydrv_release( struct inode* inode, struct file *filp )
{
// MOD_DEC_USE_COUNT;
return 0;
}
int init_mydrv(void)
{
int result;
char disp_buf[100];
result = devfs_register_chrdev( mydrv_major, "mydrv", &mydrv_ops );
if ( result<0 ){
printk( KERN_WARNING "mydrv: unable to get major %d.\n", mydrv_major );
return result;
}
dev_handle = devfs_register( NULL, "mydrv",
DEVFS_FL_DEFAULT, 99, 0, S_IFCHR, &mydrv_ops, NULL );
if( mydrv_major == 0 )
mydrv_major = result;
strcpy( disp_buf, "Hello, I'm Syivester." );
printk( "succeed in getting buffer: %s.\n", disp_buf );
return 0;
}
int down_mydrv(void)
{
devfs_unregister_chrdev( mydrv_major, "mydrv" );
devfs_unregister( dev_handle );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -