static ssize_t spi_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned longdata)
{
return0;
}
static int__init spi_init(void)
{
intresult;
dev_t devno = MKDEV(spi_major, 0);
/**/
if(spi_major)
result = register_chrdev_region(devno, 1, spi_name);
else/**/
{
result = alloc_chrdev_region(&devno, 0, 1, spi_name);
spi_major = MAJOR(devno);
}
if(result < 0)
returnresult;
cdev_init(&spiCdev, &spi_fops);
spiCdev.owner = THIS_MODULE;
spiCdev.ops = &spi_fops;
if(cdev_add(&spiCdev, devno, 1))
printk(KERN_NOTICE"Error adding spi %d", 0);
s3c2440_clkcon = (int*)ioremap(0x4C00000c,3);
spi_gpgcon = (int*)ioremap (0x56000060,4);
spi_gpgdat = (int*)ioremap (0x56000064,2);
spi_gpgup = (int*)ioremap (0x56000068,2);
spi_gpfcon = (int*)ioremap (0x56000050,2);
spi_gpfdat = (int*)ioremap (0x56000054,1);
spi_gpfup = (int*)ioremap (0x56000058,1);
spi_spcon1 = (int*)ioremap(0x59000020,1);
spi_spsta1 = (int*)ioremap(0x59000024,1);
spi_sppin1 = (int*)ioremap(0x59000028,1);
spi_sppre1 = (int*)ioremap(0x5900002c,1);
spi_sptdat1 = (int*)ioremap(0x59000030,1);
spi_sprdat1 = (int*)ioremap(0x59000034,1);
printk("Init spi success!\n");
returnresult;
}
static void__exit spi_exit(void)
{
cdev_del(&spiCdev);
unregister_chrdev_region(MKDEV(spi_major, 0), 1);
printk("<1>spi_exit!\n");
}
module_init(spi_init);
module_exit(spi_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("nkzc");
MODULE_DESCRIPTION("SPI driver for S3C2440");
几点需要注意的地方:
1.一开始在spi_exit()函数中使用了void unregister_chrdev(unsigned int major, const char *name)函数来注销设备,但再次insmod驱动的时候提示"Device or resource busy",改为unregister_chrdev_region()后一切正常,说明即使只注册了一个设备,register_chrdev_region()和unregister_chrdev_region()也要配套使用。