字符设备驱动开发

原创 2013年12月02日 19:14:48
 

1、外部设备映射到字符设备

/* 宏定义 */

#define CHAR_MAJOR 90

#define CHAR_DEV_NAME "ssd_chr"

 

add_mtd_device(struct mtd_dev *mtd_dev,int dev_idx)
{

     int idx;

    int dev_id;

   struct mtd_infor mtd_info = mtd_dev->mtd;

    spin_lock(mtd_table_lock);

     for(idx = 0;idx < MTD_DEV_COUNT;idx++)

   {

          if(NULL == mtd_table[idx])

          {

                      mtd_table[idx] = (struct mtd_dev)kmalloc(sizeof(struct mtd_dev),GFP_KERNEL);

                      memset(mtd_table[idx],0,sizeof(struct mtd_dev));

                      dev_id = MKDEV(MTD_CHAR_MAJOR,i * 2);

                       memcpy(mtd_table[idx],sizeof(struct mtd_dev));

                       mtd_table[idx] ->mtd.index = i ;

                       mtd_table[idx]->mtd.usecount++;

                       mtd_table[idx]->mtd.dev.class = g_mtdclass;

                       mtd_table[idx]-.>mtd.dev.devt = j;

                       dev_set_name(mtd_table[idx]->mtd_dev,"mtd%d",i);

                       dev_set_drvdata(mtd_table[idx]->dev,&mtd_info);

                       if(dev_id)

                    {

                                device_create(&mtd_table[idx]->dev.parent,j,NULL,"mtd_%d",i;

                     }

                  spin_unlock(mtd_table_lock);

                 __module_get(THIS_MODULE);

              return 0;

            }

     

   }

  spin_unlock(mtd_table_lock);

}

2、字符设备的注册

 
/* 字符设备IO操作接口 */
static struct file_operations g_chr_fops = 
{
	.open = chr_open,
	.close = chr_close,
	.ioctl = chr_ioctl
};
 
static struct class g_mtd_class = 
{
	.name = "mtd“,
	.ower = THIS_MODULE,
	.suspend = mtd_suspend,
	.resume = mtd_resume
};
 
/* 模块初始化 */
static int __init module_charDrv_init()
{
	int idx; 
	if(register_chrdev(CHAR_MAJOR,CHAR_DEV_NAME,g_chr_fops))
	{
		printk(KERN_ERR“register char device failed !\n”);
		return -1;
	}
	
	/* MTD设备表初始化 */
	for(idx = 0;idx < MTD_DEV_COUNT)
	{
		g_mtd_table[idx] = NULL;
		printk(“register char device failed !\n”);
	}
	
	/* 注册MTD设备Class */
	if(class_register(&g_mtd_class))
	{
		printk(KERN_ERR“register class failed !\n”);
		return -1;
	}
	
	printk(KERN_INFO"register char device success.\n");
}
 


 

简单的字符设备驱动开发

  • 2010年06月03日 07:09
  • 943KB
  • 下载

Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析

一、 ioremap() 函数基础概念        几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU...

Linux 字符设备驱动开发基础(四)—— ioctl() 函数解析

解析完 open、close、read、write 四个函数后,终于到我们的 ioctl() 函数了 一、 什么是ioctl          ioctl是设备驱动程序中对设备的I/O通道进行管理的函...

Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

一、VFS 虚拟文件系统基础概念         Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File S...

linux字符设备驱动开发模板及Makefile

linux2.6字符设备驱动开发模板 #include #include #include #include #include //=======================字符设备...

字符设备驱动开发流程详解

字符驱动相关概念解析一、驱动初始化1.1分配设备描述结构1.2初始化设备描述结构1.3.注册设备描述结构1.4.硬件初始化二、实现设备操作2.1open2.2read2.3.write2.4.lsee...

Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析

我们在前面讲到了file_operations,其是一个函数指针的集合,用于存放我们定义的用于操作设备的函数的指针,如果我们不定义,它默认保留为NULL。其中有最重要的几个函数,分别是open()、r...

字符设备驱动开发流程(总结)

准备工作: #include #include #include #include #include #include #include #include #include #in...
  • nuistlr
  • nuistlr
  • 2012年12月13日 19:53
  • 608

Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析

一、 ioremap() 函数基础概念        几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符设备驱动开发
举报原因:
原因补充:

(最多只允许输入30个字)