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...