/* Anthony Pringle Geoffrey Wall pci_avnet.h -- Header for AvNet FPGA Driver June 20 2005 Linux Kernel Device Drivers Dr. Ted Baker */ #include #include #include #include #include #include #include /* added june 15*/ #include #include #include #include #include #include #define PCI_DEVICE_ID_XILINX_AVNET 0x0300 // Memory Space (Base Address Registers) #define BAR0 0 // fd000000 - fdffffff #define BAR1 1 // fc000000 - fcffffff #define BAR2 2 // fb000000 - fbffffff -- this is correct. #define CONTROL_REG 0x18 #define LED_OFFSET 0x08 // byte offset pointer arithmetic (NOT integer specific) // COMMAND REG DEFS #define BRG_RESET 0x0001 #define TRGT_RESET 0x0002 #define RCFG_SRAM 0x0004 #define RCFG_SYSACE 0x0008 #define SRAM_OWNER 0x0010 #define TRGT_DONE 0x0020 #define FLSH_OWNER 0x0040 #define CPY_SRM_FLSH 0x0080 #define RCFG_TMOUT 0x0100 #define TRGT_IRQ 0x0200 // IOCTLS #define V2P_MAGIC 'k' #define CONFIG_V2P _IO(V2P_MAGIC, 0) #define V2P_MAXNR 1 #define av_nr_devs 4 static void __exit avnet_exit(void); static int av_open(struct inode *inode, struct file *filp); static int mmap_sram(struct file * file, struct vm_area_struct * vma); static int mmap_flash(struct file * file, struct vm_area_struct * vma); static int mmap_ctrlreg(struct file * file, struct vm_area_struct * vma); static int mmap_led(struct file * file, struct vm_area_struct * vma); ssize_t read_sram(struct file *file, char __user *buf, size_t count, loff_t *f_pos); ssize_t read_flash(struct file *file, char __user *buf, size_t count, loff_t *f_pos); ssize_t read_ctrlreg(struct file *file, char __user *buf, size_t count, loff_t *f_pos); ssize_t read_led(struct file *file, char __user *buf, size_t count, loff_t *f_pos); ssize_t write_sram(struct file *file, const char __user *buf, size_t count, loff_t *f_pos); ssize_t write_ctrlreg(struct file *file, const char __user *buf, size_t count, loff_t *f_pos); ssize_t write_led(struct file *file, const char __user *buf, size_t count, loff_t *f_pos); typedef struct av_buf { unsigned long length; char * data; } av_buf; typedef struct av_dev { unsigned int V2P_NUM; /* use this to know which board we are talking to */ unsigned int __iomem *ctrlreg; /* pointer to BAR2 offset 0 */ unsigned char __iomem *SRAM; /* pointer to BAR0 offset 0 */ unsigned char __iomem *FLASH; /* pointer to BAR1 offset 0 */ unsigned long led_base; /* for mem mapping */ unsigned long led_size; /* for mem mapping */ int led_minor; /* store minor number */ struct cdev *led_cdev; /* Char device structure */ unsigned long sram_base; /* for mem mapping */ unsigned long sram_size; /* for mem mapping */ int sram_minor; /* store minor number */ struct cdev *sram_cdev; /* Char device structure */ unsigned long flash_base; unsigned long flash_size; int flash_minor; /* store minor number */ struct cdev *flash_cdev; /* Char device structure */ unsigned long ctrlreg_base; unsigned long ctrlreg_size; int ctrlreg_minor; /* store minor number */ struct cdev *ctrlreg_cdev; /* Char device structure */ struct pci_dev *pcidev; /* Point back to the pci dev */ struct semaphore sem; /* mutual exclusion semaphore */ struct file *filp; } av_dev; /* Multiple card support */ #define MAX_DEVS 3 static av_dev av_devs[MAX_DEVS]; /* num devices found/allocated */ unsigned int numboards = 0; static int major = 0; module_param(major, int, 0); /* Device and Manufacturer ID */ static struct pci_device_id avnet_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_XILINX_AVNET) }, { 0, } }; MODULE_DEVICE_TABLE(pci, avnet_ids); // required to access LED from ctrlreg -- depends on type of ctrlreg unsigned int led_offset = 2;