1、 register_chrdev()
用法:int = register_chrdev(major ,"abc",const struct file_operations *fops)
unregister_chrdev(major, "abc");
说明:major是注册的主设备号,为0时自动分配,返回值为主设备号,abc为设备名,fops为相应的操作
2、class_creat和device_creat
用法:static struct class *cls cls=class_create(THIS_MODULE, "name");
static struct class_device * cls_dev cls_dev=device(cls,NULL, MKDEV(major, 0), NULL, "xyz")
device_destroy(cls,MKDEV(major,0));
class_destroy(cls);
说明:device_creat函数和以前的版本不一样,销毁函数的参数也不一样,用时注意。
3、ioremap
用法:volatile unsigned long *gpx gpx = (volatile unsigned long *)ioremap(0x56000010, 16);
iounmap(gpx);
说明:gpx为0x56000010的虚拟地址
4、注册中断处理函数request_irq()
用法:int request_irq(unsigned int irq, irq_hander_t handler,unsigned long irqflags, const char *devname,void *dev_id)
free_irq(irq, *dev_t)
参数说明:irq为中断号,可以为IRQ_EINT0~,
hander为中断处理函数,它的用法:
static irqreturn_t buttons_irq(int irq, void *dev_id)
{ return IRQ_RETVAL(IRQ_HANDLED) }
可以在dev_id内包含中断的信息
irqflags为中断的类型,IRQ_TYPE_EDGE_RISING(上升沿触发) IRQ_TYPE_EDGE_FALLING(下降沿触发)
IRQ_TYPE_EDGE_BOTH(双边触发)
IRQ_TYPE_LEVEL_LOW(低电平触发)
IRQ_TYPE_LEVEL_HIGH(高电平触发)
dev_id提供一些中断的信息,在中断处理函数内部使用,卸载释放中断时也用此。
5、等待队列:
定义队列:wait_quene_head_t wq;
初始化:init_waitquene_head(wait_quene_head_t *q)
或者直接定义并初始化:DECLARE_WAIT_QUENE_HEAD( wq )
等待:wait_event_interruptible(wq,condition) 信号或者condition为真都能使它唤醒,
唤醒:void wake_up (wait_quene_head_t *q)