linux中斷底層硬體操作方法

2021-06-19 19:23:44 字數 3444 閱讀 3847

linux中斷底層硬體操作方法**)

joee33

每一條中斷線都有乙個底層硬體操作函式集struct irq_chip 。大多數控制方法都是重複的 ,基本上只要有

中斷響應 、 中斷遮蔽 、 中斷開啟 、 中斷觸發型別設定等方法就可以滿足要求了。其他各種方法基本上和這些相同。

這些操作方法的實現在檔案linux/arch/arm/plat-s3c24xx/irq.c中。

例如外部中斷 irq_eint0 ~ irq_eint3都用以下操作函式集:

static struct irq_chip s3c_irq_eint0t4 = ;

static inline void

s3c_irq_ack(unsigned int irqno)

static void

s3c_irq_mask(unsigned int irqno)

static void

s3c_irq_unmask(unsigned int irqno)

ints3c_irqext_type(unsigned int irq, unsigned int type)

。。。。。。

__raw_writel(value, gpcon_reg); 

//將對應管腳配置成中斷功能

switch (type)

value = __raw_readl(extint_reg); 

value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset);

__raw_writel(value, extint_reg); 

//設定中斷的觸發方式。

return 0;

}中斷申請函式

//中斷申請函式request_irq()只是函式request_threaded_irq()的包裝而已

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,

const char *name, void *dev)

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)

#ifdef config_lockdep

irqflags |= irqf_disabled;

#endif

if ((irqflags & irqf_shared) && !dev_id)

return -einval;

desc = irq_to_desc(irq); 

//根據中斷號獲取中斷線描述符結構體

if (!desc)

return -einval;

if (desc->status & irq_norequest)

return -einval;

if (!handler)

return -einval;

//分配乙個中斷服務例程結構體action並初始化它的各欄位。

action = kzalloc(sizeof(struct irqaction), gfp_kernel); 

if (!action)

return -enomem;

action->handler = handler;

action->thread_fn = thread_fn; //為null

action->flags = irqflags;

action->name = devname;

//對於共享中斷 , 此特定值用來區分各中斷,以便從共享中斷線的諸多中斷處理程式中刪除指定的那乙個。

action->dev_id = dev_id;

//將該例程新增到單向鍊錶desc->action上,並啟動該例程。

retval = __setup_irq(irq, desc, action);

if (retval)

kfree(action);

。。。。。。

return retval;}

static int

__setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)

while (old);

shared = 1;

}if (!shared) else

compat_irq_chip_set_default_handler(desc);

// desc->status的標誌irq_noautoen 在中斷初始化函式 s3c24xx_init_irq()中呼叫函式set_irq_flags()設定。

if (!(desc->status & irq_noautoen)) else

desc->depth = 1;

。。。。。。

}*old_ptr = new; //將新加入的中斷處理例程新增到鍊錶中

。。。。。。

//在proc檔案系統中建立目錄。

new->irq = irq;

register_irq_proc(irq, desc);

new->dir = null;

register_handler_proc(irq, new);

。。。。。。

return ret;}

中斷解除安裝函式free_irq().。

如果指定的中斷線不是共享的 , 那麼 , 該函式刪除處理程式的同時將禁用這條中斷線 。 如果

中斷線是共享的,則僅刪除 dev_id 所對應的處理程式,而這條中斷線本身只有在刪除了最

後乙個處理程式時才會被禁用。由此可以看出為什麼惟一的 dev_ id 如此重要。對於共享的

中斷線,需要乙個惟一的資訊來區分其上面的多個處理程式,並讓 free_irq() 僅僅刪除指定

的處理程式。如果 dev_id 非空,它都必須與需要刪除的處理程式相匹配。非共享中斷,該

域可以為空,但需要和註冊時使用的指標一致。

static struct irqaction *__free_irq(unsigned int irq, void *dev_id)

*action_ptr = action->next;

。。。。。。

if (!desc->action)

return action; 

//返回中斷處理例程結構體

}//在函式free_irq中將函式__free_irq返回的中斷處理例程結構體釋放掉。

void free_irq(unsigned int irq, void *dev_id)

{kfree(__free_irq(irq, dev_id));

String操作方法底層實現!!!

以下 純屬個人寫著玩。為了加深理解和熟悉字串提供的方法的思路。但是我發現我寫完之後還是忘了。沒啥鳥用。分享給大家指點。大家說如果面試的話,讓面試者寫乙個字串底層方法實現思路。是否能快速寫出來。charat 方法 功能 返回指定位置的字元 引數 傳遞乙個下標 官方使用 var str abcdefg ...

c語言的底層操作方法

1.函式名 setvbuf 功 能 把緩衝區與流相關 用 法 int setvbuf file stream,char buf,int type,unsigned size 引數 stream 指向流的 指標 type 期望緩衝區的型別 iofbf 滿緩衝 當緩衝區為空時,從流讀入資料。或者當緩衝區...

Linux操作方法集介面(read,write)

一 read,write 應用層呼叫 read 應用層想讀取資料 這件事情是核心中驅動完成 copy to user 應用層呼叫 write 應用層想寫取資料 這件事情是核心中驅動完成 驅動中的read write介面實現 ssize t demo read struct file filp,cha...