|
本帖最后由 vlah 于 2017-4-10 10:11 编辑
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int f2h_int_open(struct inode *inode, struct file *file);
static int f2h_int_release(struct inode *inode, struct file *file);
static int f2h_int_init(void);
static void f2h_int_exit(void);
static int g_iMajor = 0;
static struct device *g_pDev;
static struct class *g_pClass;
#define PHY_ADDR (0xff280000)
#define PHY_ADDR_LEN (0x10)
// 字符设备结构
static struct file_operations g_f2h_int_fileops =
{
.owner = THIS_MODULE,
.open = f2h_int_open,
.release = f2h_int_release,
};
void __iomem * virt;
irqreturn_t xxx_interrupt (int irq,void*dev_id)
{
static unsigned int uiCnt = 0;
iowrite32(1, virt + 0xC);
printk("xxx_interrupt %d\n", uiCnt++);
return (IRQ_HANDLED);
}
static int f2h_int_open( struct inode *inode, struct file *file )
{
return 0;
}
static int f2h_int_release( struct inode *inode, struct file *file )
{
return 0;
}
static int f2h_int_init( void )
{
int irq = 0;
int err = 0;
unsigned int uiData = 0;
printk("f2h_int_init\n" );
g_iMajor = register_chrdev(0, "FPGA_IRQ3", &g_f2h_int_fileops);
g_pClass = class_create(THIS_MODULE, "FPGA_IRQ3");
g_pDev = device_create(g_pClass, NULL, MKDEV(g_iMajor, 0), NULL, "FPGA_IRQ3");
printk("flag 1\n" );
if(!request_mem_region(PHY_ADDR, PHY_ADDR_LEN, "FPGA_IRQ3"))
{
printk("request_mem_region fail\n");
}
virt = ioremap(PHY_ADDR, PHY_ADDR_LEN);
printk("virt = %x\n", (unsigned int)virt);
uiData = ioread32(virt);
printk("uiData = %x\n", uiData);
printk("dir = %x\n", ioread32(virt + 4));
printk("int = %x\n", ioread32(virt + 8));
printk("edge = %x\n", ioread32(virt + 0xC));
iowrite32(1, virt + 8);
printk("int = %x\n", ioread32(virt + 8));
release_mem_region(PHY_ADDR, PHY_ADDR_LEN);
printk("flag 2\n" );
err = request_irq(75, xxx_interrupt, IRQF_DISABLED, "FPGA_IRQ3", NULL);
// enable_irq(irq);
printk("irq = %d\n", irq);
printk("err = %d\n", err);
return 0;
}
static void f2h_int_exit( void )
{
printk("f2h_int_exit\n");
iounmap(virt);
free_irq(75, NULL);
// disable_irq_nosync(75);
device_destroy(g_pClass, MKDEV(g_iMajor, 0));
class_destroy(g_pClass);
unregister_chrdev(g_iMajor, "FPGA_IRQ3");
}
module_init(f2h_int_init);
module_exit(f2h_int_exit);
MODULE_DESCRIPTION("C5 Linux driver");
MODULE_LICENSE("GPL");
函数顺序的问题,已破
|
|