⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydrv.c

📁 一个LINUX下一个框架文件系统,运行编译环境:RED HAT LINUX7.3
💻 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 + -