当前位置: 技术问答>linux和unix
在ARM开发平台下linux是怎么响应中断?急!
来源: 互联网 发布时间:2016-04-29
本文导语: 在ARM开发平台下linux是怎么响应中断? 大概都用到那些函数!很急!! | up~~~~~~~~~5楼+13楼。 | 给你一个例子,中断号要先确定好adc->irq, 请求中断: if (request_irq(adc->irq, adc_interr...
在ARM开发平台下linux是怎么响应中断?
大概都用到那些函数!很急!!
大概都用到那些函数!很急!!
|
up~~~~~~~~~5楼+13楼。
|
给你一个例子,中断号要先确定好adc->irq,
请求中断:
if (request_irq(adc->irq, adc_interrupt, IRQF_SHARED, DRV_NAME, adc)){
printk(KERN_ERR"%s: request irq failedn", __FILE__);
goto adc_del_channel;
}
中断函数:
static irqreturn_t adc_interrupt(int irq, void *dev_id)
{
struct adc *adc = dev_id;
struct adc_channel *channel;
unsigned int status;
status = adc_readl(adc, AT91_ADC_SR) & adc_readl(adc, AT91_ADC_IMR);
while (status) {
printk(KERN_DEBUG "at91_adc: interrupt status reg 0x%08xn",
status);
if (status & AT91_ADC_EOC0){
channel = adc->channel[0];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR0));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC1){
channel = adc->channel[1];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR1));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC2){
channel = adc->channel[2];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR2));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC3) {
channel = adc->channel[3];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR3));
// adc_sigio(channel);
}
if (status & AT91_ADC_DRDY)
adc_readl(adc, AT91_ADC_LCDR);
status = adc_readl(adc, AT91_ADC_SR) & adc_readl(adc, AT91_ADC_IMR);
}
return IRQ_HANDLED;
}
请求中断:
if (request_irq(adc->irq, adc_interrupt, IRQF_SHARED, DRV_NAME, adc)){
printk(KERN_ERR"%s: request irq failedn", __FILE__);
goto adc_del_channel;
}
中断函数:
static irqreturn_t adc_interrupt(int irq, void *dev_id)
{
struct adc *adc = dev_id;
struct adc_channel *channel;
unsigned int status;
status = adc_readl(adc, AT91_ADC_SR) & adc_readl(adc, AT91_ADC_IMR);
while (status) {
printk(KERN_DEBUG "at91_adc: interrupt status reg 0x%08xn",
status);
if (status & AT91_ADC_EOC0){
channel = adc->channel[0];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR0));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC1){
channel = adc->channel[1];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR1));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC2){
channel = adc->channel[2];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR2));
// adc_sigio(channel);
}
if (status & AT91_ADC_EOC3) {
channel = adc->channel[3];
buf_in(channel, adc_readl(adc, AT91_ADC_CDR3));
// adc_sigio(channel);
}
if (status & AT91_ADC_DRDY)
adc_readl(adc, AT91_ADC_LCDR);
status = adc_readl(adc, AT91_ADC_SR) & adc_readl(adc, AT91_ADC_IMR);
}
return IRQ_HANDLED;
}
|
简单来说就这样啦:
中断源,比如外设,引脚会连接到中断控制器的引脚,这个在系统设计的时候分配好的,哪个脚对应哪个外设,中断号也是在这边分配好的,中断号对应着中断函数,具体linux内核里面的各个体系结构里面。发生中断的时候,中断控制器会把信息传给cpu,然后cpu找到中断控制函数的地址并开始运行。
中断源,比如外设,引脚会连接到中断控制器的引脚,这个在系统设计的时候分配好的,哪个脚对应哪个外设,中断号也是在这边分配好的,中断号对应着中断函数,具体linux内核里面的各个体系结构里面。发生中断的时候,中断控制器会把信息传给cpu,然后cpu找到中断控制函数的地址并开始运行。