linux 中断驱动和led驱动读写的函数清单

发布时间:2023-09-05  

请注意, linux的应用层对字符设备都是采取文件读写的方式,所以说我们的驱动程序也是用的是文件的形式。

我们需要把所有的驱动程序封装到文件的读写形式里面。

1、 static int XXX_open(struct inode *inode, struct file *file)  //这个函数是挂载到struct file_operations  open里面的。

     此函数需要完成对各种引脚或者总线的硬件初始化,中断初始化 等等

2、static ssize_t XXX_write(struct file *file, const char __user *buf, size_t count, loff_t* ppos)   //这个函数是挂载到struct file_operations  write里面的。

在此函数中 我们可以给引脚赋值。

3. static struct file_operations XXX_XXX_fops = {

  

.owner = THIS_MODULE,
.open = first_drv_open,
.write = first_drv_write,

 

}

这个结构体是一个文件的结构我们把前面的读写函数都挂载到这里。

 

4、XXX_init //这个函数是注册在module_init 

     这个函数会给设备分配设备号,映射绝对地址给内核的虚拟地址。

    在此函数中我们会用到以下的函数:

     register_chrdev: Register a major number for character devices.

    

int register_chrdev ( unsigned int   major,

const char *   name,

const struct file_operations *   fops);

Arguments

  • major

  • major device number or 0 for dynamic allocation    //如果0的话将会自动的分配驱动设备号 如果写入别的数值则会按照数值去分配设备号

  • name

  • name of this range of devices                        //这个驱动设备的名字

  • fops

  • file operations associated with this devices  //这是存入上面的那个文件的结构体

     

    class_create — create a struct class structure   //这个结构体只是给class_device_create 用的


    class_create(struct module* owner, const char* name) //pointer to the module that is to “own” this struct class  (always THIS_MODULE), the name is the name of this range of devices.

    ioremap(pysical address, length) : give the absolute address of pin address to kernel

     

     

    class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz");   还不是太能理解这个函数 不过他能够自动的返回一个设备。我们可以知道这个设备的设备号。

5. module_init : 这是一个宏,会把XXX_init注册进入内核

6. module_exit: 这是一个宏,会调用XXX_Exit函数把设备从内核卸载。(rmmod 会调用这个函数。)

7.int first_drv_exit(void)  其中会用到的函数:

unregister_chrdev()取消函数的注册

class_device_unregister()卸载设备类型(想当于卸载了此设备)

iounmap()卸载了绝对地址和相对地址之间的关系。

 

//这个函数必须有 证书许可证

MODULE_LICENSE("GPL");   //MUST BE INCLUDED

 

关于中断的函数

1.request_irq

Synopsis

int request_irq ( unsigned int   irq,

irq_handler_t   handler,

unsigned long   irqflags,

const char *   devname,

void *   dev_id);

Arguments

  • irq

  • Interrupt line to allocate

  • handler

  • Function to be called when the IRQ occurs

  • irqflags

  • Interrupt type flags

  • devname

  • An ascii name for the claiming device

  • dev_id

  • A cookie passed back to the handler function

Description

This call allocates interrupt resources and enables the interrupt line and IRQ handling. From the point this call is made your handler function may be invoked. Since your handler function must clear any interrupt the board raises, you must take care both to initialise your hardware and to set up the interrupt handler in the right order.

Dev_id must be globally unique. Normally the address of the device data structure is used as the cookie. Since the handler receives this value it makes sense to use it.

If your interrupt is shared you must pass a non NULL dev_id as this is required when freeing the interrupt.

 

 

2. free_irq() normally write in XX_XXX_Close function

 

3. wait_event_interruptible(button_waitq, ev_press);

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);  //这个宏定义了一个事件,  从而从休眠中脱离,程序会直接跳到中断里面,然后执行中断,在中断中ev_press = 1. 当为1的时候XXX_read函数退出休眠可以执行后面的内容,然后请在执行之后ev_press 清0。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>