问题:
在DSP触发中断SYSCFG_CHIPINT0(28)一次,ARM能收到两次。
有用过的指点一下
附相关代码:
/*******************************************
* DSP 代码 main.c
*******************************************/
struct mdsp_info g_ctx;
#pragma DATA_SECTION(g_ctx,"mem_stru")
void ARM_Interrupt()
{
L138_SYSTEM->CHIPSIG|=0x0000001;
}
void udelay(int n)
{
int f=456*1000;
while(n>0){
n--;
while(f>0) {
f--;
__asm("NOP");
}
}
}
void main()
{
struct mdsp_info *info=(struct mdsp_info *)&g_ctx;
L138_init();// pinmux etc...
for(;;) {
ARM_Interrupt();
udelay(4*1000);
info->resvd1[6]++;
}
}
//////////////////////////////////////////
// cmd 文件
//////////////////////////////////////////
SECTIONS
{
boot > BOOT_MEM
{
-l bios.a674 <boot.o674> (.sysinit)
}
mem_stru {} >0x80000000
}
/******************************************
* ARM Linux驱动代码
******************************************/
struct mdsp_info* p_mdsp=NULL;
#define CHIPSIG *(volatile unsigned int*)DA8XX_SYSCFG0_VIRT(0x174)
static int mdsp_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int mdsp_release(struct inode *inode, struct file *filp)
{
return 0;
}
static ssize_t mdsp_read(struct file* file, char __user *buf, size_t size, loff_t *off)
{
return 0;
}
static ssize_t mdsp_write(struct file* file, char __user *buf, size_t size, loff_t *off)
{
return 0;
}
static long mdsp_ioctl (struct file * filp, unsigned int cmd, unsigned long arg)
{
struct mdsp_info *info = (struct mdsp_info *)p_mdsp;
void __user *argp = (void __user *)arg;
printk("dsp_int=%d arm_int=%d\n", info->resvd1[6], info->resvd1[8]);
return 0;
}
static const struct file_operations mdsp_fops = {
.owner = THIS_MODULE,
.read = mdsp_read,
.write = mdsp_write,
.open = mdsp_open,
.release = mdsp_release,
.unlocked_ioctl = mdsp_ioctl,
};
static struct miscdevice mdsp_dev = {
MISC_DYNAMIC_MINOR,
"mdsp",
&mdsp_fops
};
static irqreturn_t dsp_data_isr(int irq, void* ctx)
{
struct mdsp_info *info=(struct mdsp_info *)ctx;
(CHIPSIG_CLR) |=0x1;
info->resvd1[8]++;
return IRQ_HANDLED;
}
static int __init mdsp_init(void)
{
p_mdsp = (struct mdsp_info*)ioremap_nocache((dma_addr_t)0x80000000, 0x20000);
memset((void*)p_mdsp, 0, sizeof(struct mdsp_info));
request_irq(28, dsp_data_isr, IRQF_TRIGGER_RISING|IRQF_DISABLED, "mdsp", (void*)p_mdsp);
misc_register(&mdsp_dev);
return 0;
}
static int __exit mdsp_exit(void)
{
free_irq(28, (void*)p_mdsp);
misc_deregister(&mdsp_dev);
if (p_mdsp) {
iounmap(p_mdsp);
p_mdsp = NULL;
}
}
module_init(mdsp_init);
module_exit(mdsp_exit);