dispc的中斷處理

2021-06-18 16:54:42 字數 1603 閱讀 2506

sprdfb_dispc.c      (kernel\drivers\video\sc8825)
//註冊中斷處理函式結構

static inline int __must_check

request_irq( unsigned int irq, //中斷號

irq_handler_t handler, //中斷處理函式

unsigned long flags, //中斷標誌,上公升沿,下降沿等

const char *name, //名字

void *dev ) //指標

//dispc的中斷註冊:

request_irq(irq_dispc_int, dispc_isr, irqf_disabled, "dispc", &dispc_ctx);
//dispc的中斷服務程式:

static irqreturn_t dispc_isr(int irq, void *data)

else if ((reg_val & 0x1) && (sprdfb_panel_if_dpi != dev->panel_if_type)) //cmd mode

if((reg_val & 0x2) && (sprdfb_panel_if_dpi == dev->panel_if_type)) /*dispc external te isr*/

}//...

}

//我們的**中預設是不使用te中斷的,假如要使用此中斷控制一些東西,可以這樣做:

static irqreturn_t dispc_isr(int irq, void *data)

//...

}

//方式一:在自己的sys介面中,show或者store函式中,可以加入以下函式:

dispc_set_bits(bit(1), dispc_int_en);		//使能te中斷, 當te中斷來臨時,就會呼叫上述的中斷處理函式

//方式二:可以通過lookat設定暫存器,充當上述函式的功能

#define dispc_int_en   (0x0070)

static inline void dispc_set_bits(uint32_t bits, uint32_t reg)

static inline uint32_t dispc_read(uint32_t reg)

#define dispc_ctl_begin 0x21000000 //dispc registers

通過一層層**剖析可以得出該暫存器:0x21000000+0x0070 = 0x21000070 的bit1寫上1

檢視 0x21000070 的內容: lookat -l 1 0x21000070 

得出值為: 0x00000014,  bit1位置為1 =  0x00000016

再通過:  lookat -s 16 0x21000070  即可開啟中斷功能

Linux中斷和中斷處理

眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...

Linux中斷處理之共享中斷處理初探

在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...

中斷處理介紹

當某一中斷源需要cpu為其進行中斷服務時,就輸出中斷請求訊號,使中斷控制系統的中斷請求觸發器置位,向cpu請求中斷。系統要求中斷請求訊號一直保持到cpu對其進行中斷響應為止。cpu對系統內部中斷源提出的中斷請求必須響應,而且自動取得中斷服務子程式的入口位址,執行中斷 服務子程式。對於外部中斷,cpu...