Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | ISA Plug & Play support by Jaroslav Kysela <perex@suse.cz> ========================================================= Interface /proc/isapnp ====================== Read commands: -------------- No comment.. Write commands: --------------- With the write interface you can simply activate or modify the configuration for ISA Plug & Play devices. It is mainly useable for drivers which don't use the ISA Plug & Play kernel support yet. card <idx> <vendor> - select PnP device by vendor identification csn <CSN> - select PnP device by CSN dev <idx> <logdev> - select logical device auto - run autoconfigure activate - activate logical device deactivate - deactivate logical device port <idx> <value> - set port 0-7 to value irq <idx> <value> - set IRQ 0-1 to value dma <idx> <value> - set DMA 0-1 to value memory <idx> <value> - set memory 0-3 to value poke <reg> <value> - poke configuration byte to selected register pokew <reg> <value> - poke configuration word to selected register poked <reg> <value> - poke configuration dword to selected register Explanation: - variable <idx> begins with zero - variable <CSN> begins with one - <vendor> is in form 'PNP0000' - <logdev> is in form 'PNP0000' Example: cat > /proc/isapnp <<EOF card 0 CSC7537 dev 0 CSC0000 port 0 0x534 port 1 0x388 port 2 0x220 irq 0 5 dma 0 1 dma 1 3 poke 0x70 9 activate logdev 0 CSC0001 port 0 0x240 activate EOF Information for developers ========================== Finding appropriate device -------------------------- extern struct pci_bus *isapnp_find_card(unsigned short vendor, unsigned short device, struct pci_bus *from); The above function finds a ISA PnP card. For the vendor device should be used ISAPNP_VENDOR(a,b,c) where a,b,c are characters or integers. For the device number should be used ISAPNP_DEVICE(x) macro where x is integer value. Both vendor and device numbers can be get from contents of the /proc/isapnp file. extern struct pci_dev *isapnp_find_dev(struct pci_bus *card, unsigned short vendor, unsigned short function, struct pci_dev *from); The above function finds the ISA PnP device. If card is NULL, then the global search mode is used (all devices are used for the searching). Otherwise only devices which belongs to the specified card are verified. For the function number can be used ISAPNP_FUNCTION(x) macro which works similarly as the ISAPNP_DEVICE(x) macro. ISA PnP configuration ===================== There are two ways how can be ISA PnP interface used. First way is lowlevel --------------------- All ISA PNP configuration registers are accessible via lowlevel isapnp_(read|write)_(byte|word|dword) functions. The function isapnp_cfg_begin() must be called before any lowlevel function. The function isapnp_cfg_end() must be always called after configuration otherwise the access to the ISA PnP configuration functions will be blocked. Second way is auto-configuration -------------------------------- These two functions gives to the driver the real power of the ISA PnP feature. First function dev->prepare() only initialize the resource members in the device structure. This structure contains all resources set to auto configuration values after the initialization. The driver for ISA PnP device may modify (or not) some resources to skip auto configuration for the given resource. The function isapnp_configure does: - resources which have the auto configuration value are configured - the auto configuration is created using ISA PnP resource map - the function writes configuration to ISA PnP configuration registers - the function returns to the caller actual used resources Example (game port initialization) ================================== /*** initialization ***/ struct pci_dev *dev; /* find the first game port, use standard PnP IDs */ dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0xb02f), NULL); if (!dev) return -ENODEV; if (dev->prepare(dev)<0) return -EAGAIN; if (!(dev->resource[0].flags & IORESOURCE_IO)) return -ENODEV; if (!dev->ro) { /* override resource */ if (user_port != USER_PORT_AUTO_VALUE) isapnp_resource_change(&dev->resource[0], user_port, 1); } if (dev->activate(dev)<0) { printk("isapnp configure failed (out of resources?)\n"); return -ENOMEM; } user_port = dev->resource[0].start; /* get real port */ /*** deactivation ***/ /* to deactivate use: */ if (dev) dev->deactivate(dev); |