Linux ץ饰ץ쥤ɥ
  Adam Belay <ambx1@neo.rr.com>
  ǽ 2002 ǯ 10  16 
--------------------------------------------------------------------------------




----
ץ饰ץ쥤ϡ쥬ǥХޤԲĥǥХ򸡽Ф
ѤΥ꥽򥻥åȤʤ󶡤ޤLinux ץ饰ץ쥤쥤ϡ
ߴɥ饤ФФơΥӥ󶡤ޤ



桼󥿡ե
----------------------
Linux ץ饰ץ쥤Υ桼󥿡եϡLinux ץ饰ץ쥤
ݡȤʤ쥬ǥХȥ桼٥ɥ饤ФˡPnP ǥХ
ƥ١Ȥʤ󶡤ޤ桼󥿡եϡdriverfs
礵Ƥޤ

ɸ driverfs ե˲äơΥե⡢ƥǥХѥǥ쥯
ȥ˺ޤ

  id        - ݡ EISA ID ΥꥹȤɽ
  options   - ǽʥ꥽ɽ
  resources - ߳ƤƤ꥽ɽ꥽ѹǽ

- ǥХ򥢥ƥ١Ȥ

  # echo "auto" > resources

ˤꡢǥХ򥢥ƥ١Ȥ뤿˼ư꥽ꥷƥब
ưޤ

- ưǥǥХ򥢥ƥ١Ȥ

  # echo "manual <depnum> <mode>" > resources
  <depnum> - ֹ
  <mode>   - static ޤ dynamic
              static  = Υ֡
              dynamic = 

- ǥХ̵

  # echo "disable" > resources


:

եåԡǥȥ򥢥ƥ١ȤɬפȤޤ

  1.) Ŭڤʥǥ쥯ȥ˰ưޤξ /driver/bus/pnp/devices/00:0f

        # cd /driver/bus/pnp/devices/00:0f
        # cat name
        PC standard floppy disk controller

  2.) ǥХ˥ƥ֤ɤåޤ

        # cat resources
        DISABLED

      - ʸ "DISABLED" ܤƤϡǥХƥ
        ǤϤʤȤ̣ޤ

  3.) ǥХβǽåƤ (Ǥ)

        # cat options
        Dependent: 01 - Priority acceptable
            port 0x3f0-0x3f0, align 0x7, size 0x6, 16-bit address decoding
            port 0x3f7-0x3f7, align 0x0, size 0x1, 16-bit address decoding
            irq 6
            dma 2 8-bit compatible
        Dependent: 02 - Priority acceptable
            port 0x370-0x370, align 0x7, size 0x6, 16-bit address decoding
            port 0x377-0x377, align 0x0, size 0x1, 16-bit address decoding
            irq 6
            dma 2 8-bit compatible

  4.) ǡǥХ򥢥ƥ١Ȥޤ

        # echo "auto" > resources

  5.) ǸˡǥХƥ֤ɤåޤ

        # cat resources
        io 0x3f0-0x3f5
        io 0x3f7-0x3f7
        irq 6
        dma 2

ޤϢΥͥѥ᡼ޤ

  allowdma0
  pnp_reserve_irq=irq1[,irq2] ....
  pnp_reserve_dma=dma1[,dma2] ....
  pnp_reserve_io=io1,size1[,io2,size2] ....
  pnp_reserve_mem=mem1,size1[,mem2,size2] ....



礵줿ץ饰ץ쥤쥤
--------------------------------
ƤΥץ饰ץ쥤ɥ饤Сץȥ롢ӥϡץ饰ץ쥤
쥤ȸƤФʬǷҤäƤޤPnP ɥ饤Ф PnP ץȥ
֤ξΤȤϡΥ쥤䤬ôޤΤᡢΥ쥤ϡ
ޥɤŬڤʥץȥؤžޤˤꡢPnP ɥ饤Ф
񤯤Τ˴ñˤʤޤ

˵󤲤ؿϡץ饰ץ쥤쥤䤫󶡤ޤ

  pnp_get_protocol
    - ѿ䤹

  pnp_put_protocol
    - ѿĸ餹

  pnp_register_protocol
    -  PnP ץȥϿݡδؿȤޤ

  pnp_unregister_protocol
    - ץ饰ץ쥤쥤䤫 PnP ץȥݡδؿ
      Ȥޤ

  pnp_register_driver
    - ץ饰ץ쥤쥤 PnP ɥ饤Фɲäޤ
    - ˤꡢɥ饤Хǥˤ礵ޤ
      ( pnp_register_driver() 椫 driver_register()
       [drivers/base/driver.c] ƤФ롢ȤȤǤ)

  pnp_unregister_driver
    - ץ饰ץ쥤쥤䤫 PnP ɥ饤Фޤ



ץ饰ץ쥤ץȥ
--------------------------
ΥˤϡPnP ץȥ볫ȯԸξ󤬤ޤ

ԥ塼ƥ󥰤ˤϡߤΤȤΥץȥ뷲ޤ

  - PNPBIOS
      ꥢݡȡѥݡΥƥǥХǻѤޤ
  - ISAPNP
      ISA ХѤ PnP ݡȤ󶡤ޤ
  - ACPI
      ӤǤ⡢ACPI ϡƥ٥ǥХ˴ؤ
      󶡤ޤ

PNPBIOS ֤ͽˤʤäƤޤLinux ץ饰ץ쥤ǤϤޤ
ݡȤƤޤ󤬡ᤤ襵ݡȤͽǤ


Linux PnP ץȥФ׵ࡧ

  1.) ץȥϡEISA ID ѤʤФʤʤ
  2.) ץȥϡPnP 쥤˥ǥХθΤʤФʤʤ
      - ꥽򥻥åȤ뵡ǽǤդǤ侩ޤ

˵󤲤ΤϡPnP ץȥ˴طؿǤ

  pnp_add_device
    - PnP 쥤 PnP ǥХɲäݡδؿѤޤ
    - δؿƤӽФΤϡpnp_dev ¤Τ׵ᤵͤƥå
      줿ΤߤȤƤ

  pnp_init_device
    - PnP ¤Τ뤿ˡδؿƤӽФޤ

  pnp_remove_device
    - ץ饰ץ쥤쥤䤫ǥХΤˡδؿƤ
      Фޤ
    - ǥХξ硢Ԥޤ
    - ǥХȴϢ빽¤ΤˤѤƤưŪ
      ޤ

  pnp_add_id
    - ꤷǥХݡȤ ID ΥꥹȤˡEISA ID ɲäޤ

ܺ٤ʾˤĤƤϡ/drivers/pnp/pnpbios/core.c ʤɤΥץȥ
ɤ򻲾ȤƤ



Linux ץ饰ץ쥤ɥ饤
------------------------------
ΥˤϡPnP ɥ饤гȯԸξ󤬤ޤ

ˡ
..........

  1.) ǽˡݡȤ EISA ID ΥꥹȤޤ

        :
            static const struct pnp_id pnp_dev_table[] = {
                    /* ɸ LPT ץ󥿥ݡ */
                    {.id = "PNP0400", .driver_data = 0},
                    /* ECP ץ󥿥ݡ */
                    {.id = "PNP0401", .driver_data = 0},
                    {.id = ""}
            };

      ʸ 'X' ϡؿΰǥ磻ɥɤȤƻѤǤ뤳Ȥ
      Ƥ ( 4 ʸ)

        :
            /* ̤Τ PnP ǥෲ */
            { "PNPCXXX", UNKNOWN_DEV },

      ݡȤ PnP  ID ǤդǤޤ

        :
            static const struct pnp_id pnp_card_table[] = {
                    { "ANYDEVS", 0 },
                    { "",        0 }
            };


  2.) Ǥդǡprobe ؿ remove ؿޤparport_pc ɥ饤
      Τ褦ˡ꥽򸡽ФΤʼˡ˥ɥ饤ФäƤ
      ˤϡδؿʤȤΤϡˤʤäƤޤ

        :
            static int
            serial_pnp_probe(struct pnp_dev * dev, const struct pnp_id *card_id, const 
                             struct pnp_id *dev_id)
            {
            . . .

        :
            static void serial_pnp_remove(struct pnp_dev * dev)
            {
            . . .

      ܺ٤ʾˤĤƤ /drivers/serial/8250_pnp.c 򻲾Ȥ
      


  3.) ɥ饤й¤Τޤ

        :
            static struct pnp_driver serial_pnp_driver = {
                    .name           = "serial",
                    .card_id_table  = pnp_card_table,
                    .id_table       = pnp_dev_table,
                    .probe          = serial_pnp_probe,
                    .remove         = serial_pnp_remove,
            };

      * name  id_table  NULL ˤǤޤ


  4.) ɥ饤ФϿޤ

        :
            static int __init serial8250_pnp_init(void)
            {
                    return pnp_register_driver(&serial_pnp_driver);
            }


Ťˡ
........

ISAPNP ɥ饤ФѴưפˤ뤿ᡢϢθߴؿƤޤ
ŪʲˡȤƤΤ󶡤ޤ

ΤȤǤ

struct pnp_card *pnp_find_card(unsigned short vendor,
                               unsigned short device,
                               struct pnp_card *from)

struct pnp_dev *pnp_find_dev(struct pnp_card *card,
                             unsigned short vendor,
                             unsigned short function,
                             struct pnp_dev *from)

------------------------------------------------------------
Ρ JF ץ < http://www.linux.or.jp/JF/ >
   2004/05/17
ԡ    ɧ <takahiko(a)hakubi.co.jp>
