isapnp.txt
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
- ISA Plug & Play support by Jaroslav Kysela <perex@suse.cz>
- =========================================================
- Modified by Ed Okerson <eokerson@quicknet.net> to work with the 2.2.x
- series of Linux kernels. 11/17/99
- =====================================================================
- 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 pnp_bus *isapnp_find_card(unsigned short vendor,
- unsigned short device,
- struct pnp_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 pnp_dev *isapnp_find_dev(struct pnp_bus *card,
- unsigned short vendor,
- unsigned short function,
- struct pnp_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 pnp_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);