字符设备驱动开发

 

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");
}
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值