/*瀹氫箟鍗″彲鐢ㄨ祫婧愬尯鍩?/
unsigned long base0start=0,base0len=0;
unsigned long base1start=0,base1len=0;
unsigned long base2start=0,base2len=0;
unsigned long offset=0,step=0;
unsigned long i=0;//娴嬭瘯鐢ㄤ綔璁℃暟
void *iomembase0=NULL;
void *iomembase1=NULL;
// 鍦?.4涓涓€涓繑鍥炲€煎彂鐜板姞瀵嗗崱
static int jmk_release(struct inode *inode, struct file *file)
{
MOD_DEC_USE_COUNT;
return 0;
}
static struct file_operations jmk_fops =
{
open: jmk_open,
read: jmk_read,
write: jmk_write,
release: jmk_release,
owner: THIS_MODULE,
};
/*****************interupting****************/
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
disable_irq(11);
printk("interrupt now!\n");
addri=readl(iomembase1+0x0);
printk("dspp the data1 is 0x%x!\n",addri);
/****free irq***/
free_irq(11,jmkdev);
printk("free irq!\n");
enable_irq(11);
printk("please go to back!\n");
}
//鍙戠幇鍗?
//**********************************************
/*涓绘ā鍧楀紑濮?56*/
int __init init_module(void)
{
int result;
u8 val8;
unsigned long endsrc=0;
result = register_chrdev(0,devname,&jmk_fops);
if(result<0)
{
printk("jmk : can't get major number");
return result;
}
if(jmk_major==0)
{
jmk_major=result;
printk("jmk major number is %d!\n",jmk_major);
}
/*鏌ユ壘鍗¤祫婧?/
/*base 0*/
base0start=pci_resource_start(jmkdev,0);
endsrc=pci_resource_end(jmkdev,0);
base0len=endsrc-base0start;
printk("base 0 addr is 0x%x,len is 0x%x!\n",base0start,base0len);
/*base 1*/
base1start=pci_resource_start(jmkdev,1);
endsrc=pci_resource_end(jmkdev,1);
base1len=endsrc-base1start;
printk("base 1 addr is 0x%x,len is 0x%x!\n",base1start,base1len);
/*base 2*/
base2start=pci_resource_start(jmkdev,2);
endsrc=pci_resource_end(jmkdev,2);
base2len=endsrc-base2start;
printk("base 2 addr is 0x%x,len is 0x%x!\n",base2start,base2len);
pci_read_config_byte(jmkdev,60,&val8);
printk("Interrupt Line num is 0x%x\n",val8);
if(request_irq(11,demo_interrupt,SA_SHIRQ,devname,jmkdev)==0)
{
printk("Interrupt request is ok!\n");
}
else
{
printk("irq>15 or handler==NULL or device is busy!\n");
}
/*鐢宠浣跨敤io鍐呭瓨*/
request_mem_region(base0start,base0len,"jmkdev");
request_mem_region(base1start,base1len,"jmkdev");
/*鏄犲皠io鍐呭瓨*/
iomembase0=ioremap(base0start,base0len);
if(iomembase0==NULL)
{
printk("can't get iomem!\n");
}
else
{
printk("get iomem0 addr is 0x%x!\n",iomembase0);
}
iomembase1=ioremap(base1start,base1len);
if(iomembase1==NULL)
{
printk("can't get iomem!\n");
}
else
{
printk("get iomem1 addr is 0x%x!\n",iomembase1);
}
/*娴嬭瘯鑾峰彇鏁版嵁base0*/
addr1=virt_to_phys(p);
addri=addr1;
writel(addri,iomembase0+0x0);
addri=readl(iomembase0+0x0);
printk("dspp the data A is 0x%x!\n",addri);
addr2=virt_to_phys(q);
addri=addr2;
writel(addri,iomembase0+0x4);
addri=readl(iomembase0+0x4);
printk("dspp the data B is 0x%x!\n",addri);
addr3=virt_to_phys(r);
addri=addr3;
writel(addri,iomembase0+0x8);
addri=readl(iomembase0+0x8);
printk("dspp the data C is 0x%x!\n",addri);