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