예제 #1
0
int __init init_module(void) {             
    int cmd, i, flags;
    struct resource * r;
    inPos_device = pci_get_device(PCI_VENDOR_ID_ALTERA, PCI_DEVICE_ID_CYCLONE_IV, inPos_device);
    if (!inPos_device) {
        printk(KERN_ALERT "ERROR - Device register failed, no such device\n");            
        return -ENODEV;
    }
    
    pci_read_config_word(inPos_device, PCI_COMMAND, &cmd);
    
    /* Set flags */
    set_command_flag(&cmd, PCI_COMMAND_MEMORY); /* Enable response in Memory space */
    set_command_flag(&cmd, PCI_COMMAND_MASTER); /* Enable bus mastering */
    set_command_flag(&cmd, PCI_COMMAND_INVALIDATE); /* Use memory write and invalidate */
    
    if (!dma_set_mask(&inPos_device->dev, 0xffffffff)) {
         printk (KERN_ALERT "DMA 32-bit not supported\n");
         return -ENOTSUPP;
    }
       
    /* Find desired region */
    
    for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
        
        region.size = pci_resource_len(inPos_device, i);
        region.phys_addr = pci_resource_start(inPos_device, i);
        flags = pci_resource_flags(inPos_device, i);
        if (!(flags & IORESOURCE_IO || region.size)) // is not IO and has size > 0
            continue;
        if ((region.size >= sizeof(struct PhysImg)) && !(flags & IORESOURCE_READONLY)) {
            region.resource_num = i;
            break;
        }
    }
    if (region.resource_num < 0) {
        printk(KERN_ALERT "ERROR - Device memory region with size >= %d not found!\n", sizeof(struct PhysImg));
        return -EINVAL;
    }
     
    region.phys_addr &= PCI_BASE_ADDRESS_MEM_MASK;
    region.size = ~(region.size & PCI_BASE_ADDRESS_MEM_MASK) + 1;
    
    
    dev_major = register_chrdev(IN_POS_MAJOR, name, &fops);
    if (dev_major < 0) {
        printk(KERN_ALERT "ERROR - Device register failed with code: %d\n", dev_major);            
        return dev_major;
    }
    
    return 0;
}
예제 #2
0
void parrot_ardrone_ctrl_set_command_flag(int32_t control_mode, bool_t enable)
{
	set_command_flag(control_mode, enable);
}