Comprensión simple de las interrupciones superior e inferior en el código del controlador TP

背景知识食用:

create_singlethread_workqueue: 

                               https://blog.csdn.net/liushuimpc/article/details/105198429

//驱动里面的中断一般都是这样流程

ts_probe()        
    |
     ----- ts->goodix_wq = create_singlethread_workqueue("goodix_wq");    //在单cpu上创建一个名字时goodix_wq的工作队列
    |
     ----- INIT_WORK(&ts->work, goodix_ts_work_func);           //创建一个推后的任务,任务标识为ts->work, 这个任务的工作内容时goodix_ts_work_func这个函数
    |
     ----- gtp_request_irq()
                |
                 -----  参1:中断号(线), 参2:中断发生时执行的函数, 参3:irq handler, 参4:中断标志,参5:设备名,参6:设备id
                 ----- int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id)                //  kernel/irq/manage.c
                 ----- ret = request_threaded_irq(ts->client->irq, NULL, goodix_ts_irq_handler, ts->pdata->irq_gpio_flags, ts->client->name, ts);


static irqreturn_t goodix_irq_handler(int irq, void *dev_id)
{
    struct goodix_ts_data *ts = dev_id;
    
    gtp_irq_disable(ts);

    queue_work(ts->goodix_wq, &ts->work);        //将工作(任务)放到队列中,宏观上这个时候任务函数就可以执行,微观上权力交给了cpu,cpu在合适的时候执行任务函数




    return IRQ_HANDLED;
}


-------------
简单总结一下流程:
        1.注册好中断下半部任务,也就是work对应的工作任务函数goodix_ts_work_func
        2.申请中断,把中断号(线)与中断处理函数(上半部),也就是goodix_ts_irq_handler连系起来,硬件上中断触发,cpu就会执行中断处理函数
       //
        3.中断处理函数里面,把任务放到工作队列,这时候宏观上任务函数就执行了

 

Supongo que te gusta

Origin blog.csdn.net/John_chaos/article/details/115368847
Recomendado
Clasificación