  Linux PCMCIA vO}̎
  David Hinds, dhinds@allegro.stanford.edu
  v1.35, 1997/11/14 08:25:25
  Kazuyuki Okamoto, ikko-@pacific.rim.or.jp
  Hiroshi Kawashima (kei@sm.sony.co.jp)
  Hiro Sugawara, hiro@arkusa.com
  JF project
  v1.35, 1997/12/11 01:00:00

  ̕ Linux PCMCIA J[hT[rXC^[tF[Ẍׂ̃J[lf
  oCXhCȍĂ܂B܂AJ[hT[rX̗pҗp
  [eBeB̏܂B̕(text,html,sgml) ̍ŐV
  hyper.stanford.edu  /pub/pcmcia/doc ɂ܂B HTML ł
  http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html ɂ܂B
  ______________________________________________________________________

  ڎ

  1. T
     1.1 쌠\ƕ
     1.2 ӎ

  2. {I PCMCIA ̊TO
     2.1 PCMCIA \PbgC^tF[X
     2.2 PCMCIA \Pbg䑕u

  3. J[hT[rX֐
     3.1 NCAgǗ֐
        3.1.1 RegisterClient
        3.1.2 DeregisterClient
        3.1.3 SetEventMask
        3.1.4 BindDevice
     3.2 \PbgԊǗ
        3.2.1 GetStatus
        3.2.2 ResetCard
        3.2.3 SuspendCard
        3.2.4 ResumeCard
        3.2.5 EjectCard
        3.2.6 InsertCard
     3.3 o̓J[h̐ݒ֐
        3.3.1 RequestIO
        3.3.2 ReleaseIO
        3.3.3 RequestIRQ
        3.3.4 ReleaseIRQ
        3.3.5 RequestConfiguration
        3.3.6 ModifyConfiguration
        3.3.7 ReleaseConfiguration
        3.3.8 GetConfigurationInfo
     3.4 J[h\ (CIS) gp@
        3.4.1 GetFirstTuple, GetNextTuple
        3.4.2 GetTupleData
        3.4.3 ParseTuple
        3.4.4 ValidateCIS
     3.5 ̈搧
        3.5.1 RequestWindow
        3.5.2 ModifyWindow
        3.5.3 MapMemPage
        3.5.4 ReleaseWindow
     3.6 eʃT[rX
        3.6.1 RegisterMTD
        3.6.2 GetFirstRegion, GetNextRegion
        3.6.3 OpenMemory
        3.6.4 CloseMemory
        3.6.5 ReadMemory, WriteMemory
        3.6.6 RegisterEraseQueue
        3.6.7 DeregisterEraseQueue
        3.6.8 CheckEraseQueue
     3.7 eĂяo
        3.7.1 GetCardServicesInfo
        3.7.2 AccessConfigurationRegister
        3.7.3 AdjustResourceInfo
        3.7.4 ReportError

  4. J[h\ (CIS) ̒`
     4.1 CIS ^v̒`
        4.1.1 CISTPL_CHECKSUM
        4.1.2 CISTPL_LONGLINK_A, CISTPL_LONGLINK_C, CISTPL_LINKTARGET, CISTPL_NOLINK
        4.1.3 CISTPL_LONGLINK_MFC
        4.1.4 CISTPL_DEVICE, CISTPL_DEVICE_A
        4.1.5 CISTPL_VERS_1
        4.1.6 CISTPL_ALTSTR
        4.1.7 CISTPL_JEDEC_C, CISTPL_JEDEC_A
        4.1.8 CISTPL_CONFIG
        4.1.9 CISTPL_CFTABLE_ENTRY
        4.1.10 CISTPL_MANFID
        4.1.11 CISTPL_FUNCID
        4.1.12 CISTPL_DEVICE_GEO
        4.1.13 CISTPL_VERS_2
        4.1.14 CISTPL_ORG
     4.2 CIS \WX^
        4.2.1 Configuration Option Register
        4.2.2 J[h̍\ƏԃWX^
        4.2.3 sփWX^
        4.2.4 \PbgƃRs[WX^
        4.2.5 gԃWX^

  5. J[hT[rXCxg̈ɂ
     5.1 Cxgnh̑
     5.2 Cxg̐
     5.3 NCAghCõCxg̖ɂ

  6. eNmWhCo
     6.1 MTD v̏
     6.2 MTD x֐
        6.2.1 MTDRequestWindow, MTDReleaseWindow
        6.2.2 MTDModifyWindow
        6.2.3 MTDSetVpp
        6.2.4 MTDRDYMask

  7. hCoT[rXC^tF[X
     7.1 ̃NCAghCoւ̃C^tF[X
        7.1.1 dev_link_t \
        7.1.2 register_pcmcia_driver
        7.1.3 unregister_pcmcia_driver
     7.2 [U[h PCMCIA eBeBƂ̃C^tF[X
        7.2.1 J[hT[rX̃Cxgʒm
        7.2.2 ioctl ̐

  8. J[hT[rXNCAghCỏU
     8.1 W[̏ƃZbg
     8.2 *_attach()  *_detach() ֐
     8.3 *_config()  *_release() ֐
     8.4 PCMCIA Cxgnh
     8.5 bNƓɂ
     8.6 L Linux ̃hCo PCMCIA foCXANZX@

  9. Ȃ͂ǂɂ邩H

  ______________________________________________________________________

  1.  T

  Linux Kernel PCMCIA VXe 3 ̕ɕĂ܂Bŉʂ̃C
  ^[tF[X̓\PbghCołB̓J[hT[rXW[
  B̃J[hp̃hCo̓J[hT[rX̏ʂɈʒuĂ܂B
  ̃J[hT[rXNCAg̓hCoT[rXƌĂ΂Apҗp
  PCMCIA [eBeBƃJ[l PCMCIA @\Ƃ̊Ԃт܂B

  \PbghCow̓\PbgT[rX API ̗pĂ܂B 2 
  \PbghCoW[܂Btcic W[ PCMCIA Rg
  [ TCIC-2 ñf[^ubNT|[gĂ܂Bi82365 W
  [ Intel i82365sl n Cirrus, VLSI, Ricoh, Vadem `bṽCe
  ݊̃Rg[T|[gĂ܂B

  J[hT[rX PCMCIA pbP[W̍ł傫ȒPƂ̍\vfłB
  T[rX API  DOS ̃J[hT[rXƎĂ Unix ɓKĂ
  ܂BLinux ւ̎ Solaris PCMCIA ̃C^[tF[Xdlɏ
  ܂B̎dl pcmcia_core W[ɎĂ܂Bo[W
  2.1 ̖wǂƂ PC Card 95 ̎dl܂B
  hCoT[rXw PCMCIA [eBeBĂ΂邢̃J[h
  T[rX֐ANZX闘pҗp^hCoƂĎĂ܂B
  ̎͑SĂ PCMCIA NCAghCoȂ悤ɂ̂ƁA
  \PbgƃhCoĂ̂mɂĂ܂Bds W[
  ɎĂ܂B

  ̓̕J[hT[rXƃhCoT[rXW[ƃhCoT[rX
  ւ̃[UC^[tF[X̃J[lC^[tF[XɂĐĂ
  ܂BPCMCIA foCXhCo̊J҂ׂ̈ɏĂ܂B Linux
  PCMCIA-HOWTO ͂ǂ̂悤ɓ邩 Linux  PCMCIA ǂ̂悤Ɏg
  ɂĐĂ܂B̕ cb-iris.stanford.edu 
  /pub/pcmcia ɂ܂B

  1.1.  쌠\ƕ

  Copyright (c) 1996, 1997 David A. Hinds

  ͒̕҂̋Ȃɔ@Ȃ`ŕʂ܂͔zzĂ܂܂B
  ̕𑼂̌ɖ|ȂǕύX̂܂ŁAύX_𖾊mɖ
  āA̒쌠\̂܂܂ɓYtĎRɔzzĂB

  ̓Ӗɏpzzɗp\łBK{ł͂܂񂪁App
  AɒʒmĉBoŕɓƎvĂꍇAŐV
  ̂gKv܂̂ŎɘAĉB

  ͖̕I܂͈ÖٓIۏؖ``̂܂''񋟂Ă܂B
  ̕ɂ͌䎩g̐ӔCŗpĉB

  1.2.  ӎ

   PCMCIA \tgEFAƃhCo̊J̃eXgƃfobO`Ă
  ꂽ Linux [ŮFɊӂƎv܂BăJ[lJ
  Ăꂽ Linus Torvalds, Donald Becker, Alan Cox,  Bjorn Ekwall
  Ɋӂ܂B Solaris PCMCIA ̎ɂđ̏ƂȂł
  sȂ Michael Bender Ɋӂ܂B

  2.  {I PCMCIA ̊TO

  2.1.  PCMCIA \PbgC^tF[X

  PCMCIA J[hoXɂ 2 ̊{샂[h܂B ``
  ̂''``Ɠo''łBŏ̃[h͌X̑ 1 ł̎dlŒ
  `ĒPɃJ[hT|[ĝłB̃[h͑ 2 
  Œ`ÃJ[h̐M IO |[gƓo͊荞ݐM
  悤ɍĒ`Ă܂B

  PCMCIA J[h 2 ̃Ԃ܂B``''
  ``ʃ''łBPCMCIA C^tF[X͂ꂼ̌`̃
  16MB ȏ̃g܂B͈ʂɎނ̏\郌
  WX^ێ̂Ɏgp܂Bʃ̓J[h̖wǂ̗̈
   IO J[h̏ꍇ̓obt@̈Ɏgp܂BPCMCIA dl 2łɓK
  ĂSẴJ[h̓J[hǂ̂悤ɍ\Ă邩̃J[h\
  (Card Information Structure (܂ ``CIS'')) 𑮐Ɋi[
  B

  J[h͕Mgđ󋵂zXgɒm点܂B̐M
  ̓J[h̒TmAfB/rW[ԁAݕیAdrsƓdr؂
  \Ă܂B

  ``Ɠo''^̃C^[tF[X[h̃J[h 64K ȏ̓o
  ̓|[gɃANZXł܂B̃[hł͓o͊荞݂ƃJ[h̏o
  zXgVXẽXs[Jւ̌oH񋟂܂B̃[hł͂
  ̃J[hM͓ʂȓo̓J[hM`B̂ɂ̃s
  gĂ̂Ŏgpł܂B̃J[hł͐M𑮐
  ʂȍ\WX^ǂݏoɗp܂B``s
  WX^''^̃J[hƌĂт܂B

  2.2.  PCMCIA \Pbg䑕u

  PCMCIA 䑕u PCMCIA J[hƃVXeoX̊Ԃ̋n܂B
  䑕uɂ͂̎ނ܂A{@\͓łB\PbgT[
  rXw PCMCIA 䑕u@Ɉ̏ڍׂĂ܂B

  PCMCIA 䑕u̓zXg̃WuԂƓo͋Ԃ̃AhẌ
  J[h̃AhẌ̊sȂ܂BSĂ̐䑕u͍Œ 4
  Ɨ̈2̓o͗̈\PbgɎĂ܂B

  ꂼ̃̈̓zXgAhXԂ̊AhXAJ[hԂ̊
  AhXƂ̗̈̑傫Œ`܂B̐䑕uł̓
  ̈̋EɈႢ܂ASĂ̐䑕u͍Œ 4K A
  2 ׂ̂̑傫̃̈ƊAhXŗ̈̔{̑傫̗̈
  T|[gĂ܂Bꂼ̗̈𑮐ʃw悤
  ɃvOo܂B

  zXgAhX̓o͗̈̃AhXJ[hɓnĂύXȂ
  ̈ƈقȂĂ܂BۂɁAzXgƃJ[ḧ̗̊Ah
  X͂łBo͗̈͒ʏAE傫̐
  ܂Bo͗̈̋E̎n_ƏI_ 64K ̃oCgEłB

  PCMCIA J[hoX̓J[h琧䑕uւ̈̊荞ݐM`
  B䑕u͂̎K؂ȃCvgv(IRQ) 𑀂ڂ𕉂܂BS
  Ă̐䑕u̓J[ho͊荞݂󂢂Ă銄荞݂Ɋ蓖Ă܂B
  ]Đ䑕u̓J[hgǂ̊荞݂gOɂ͕܂B

  SĂ PCMCIA 䑕u̓J[hԂԕύX̊荞݂𐶐܂B
  ̊荞݂͓o̓J[ho͊荞݂ƋʂAʂ̊荞
  ݐg܂B̐M̓J[ȟmAfB/rW[AݕیA
  drsAdr؂܂ł܂B

  3.  J[hT[rX֐

  J[hT[rX͈ʂɎ̌`ŌĂт܂B:

       #include "cs_types.h"
       #include "cs.h"

       int CardServices(int subfunc, void *arg1, void *arg2, ...);

  ̃J[hT[rX֐ #include ǉKv܂B
  ȉʂ̊֐͈̐F܂BCS_SUCCESS ̖߂l͌ďo
  Ă܂B̖̑߂l͎sĂ܂B

  3.1.  NCAgǗ֐

  J[hT[rX֐gfoCXhCo``NCAg''ƌĂт܂B
  foCXhCo͑̃T[rXgpO RegisterClient Ăяo
  ăNCAgnh擾Ȃ΂܂BJ[h𔲂OɃh
  Co DeregisterClient gpĖKv܂B

  3.1.1.  RegisterClient

       int CardServices(RegisterClient, client_handle_t *client, client_reg_t *reg);

  client_reg_t f[^\̂̒`͎̂Ƃ:

       typedef struct client_reg_t {
               dev_info_t              *dev_info;
               u_long                  Attributes;
               u_long                  EventMask;
               int                     (*event_handler)(event_t event, int priority,
                                                       event_callback_args_t *args);
               event_callback_args_t   event_callback_args;
               u_long                  Version;
       } client_reg_t;

  RegisterClient ̓NCAghCoƃJ[hT[rX̌mN
  CAgɓK؂ȃ\Pbgڑ܂B dev_info p^̓\Pbg
  ֐NCAgɍ킹̂ɃJ[hT[rXg܂B̑Ή
  BindDevice ĂԎʂăhCoT[rXɂĊm܂BΉ
  mANCAgnh client ɕԂ܂B

  ̃tOɎwł܂B:

     INFO_MASTER_CLIENT
        hCoT[rXNCAggp܂BɁA\Pbg
        J[h𔲂̓NCAgłȂȂ΂܂
        B

     INFO_IO_CLIENT
        NCAgo̓J[hhCȍꍇɎw肵܂B

     INFO_MEM_CLIENT
        NCAgeNmWhCȍꍇɎw肵܂B

     INFO_MEM_CLIENT
        NCAgJ[hhCȍꍇɎw肵܂B

     INFO_CARD_SHARE
        ׂ݊̈ɓĂ܂B܂B

     INFO_CARD_EXCL
        ׂ݊̈ɓĂ܂B܂B

  EventMask ̓NCAgɉNĂ邩ʒm鎞Ɏw肵܂B
  event_handler ̍ڂ EventMask ŏƃJ[hT[rXɂ
  Ă΂܂Bevent_handler_args \̂̓Cxgnhɓn\
  ̂̐^ (ev[gr) łBVersion p^͂̃hCov
  J[hT[rX̃o[Wx܂B͌ݖ܂B

  hCo RegisterClient ĂяoOɃJ[hT[rXs
  Kv܂B̌Ăяo͂ CS_REGISTRATION_COMPLETE Cx
  g𐶐A\PbgݎgpĂꍇ́A킴 CS_CARD_INSERTION
  Cxg𐶐܂B

  ߂l :

     CS_OUT_OF_RESOURCE
        hCoɕKvȓK؂ȃhCo܂B

  3.1.2.  DeregisterClient

       int CardServices(DeregisterClient, client_handle_t client);

  DeregisterClient ̓NCAgƃJ[hT[rX̘AsȂ܂BN
  CAg蓖Ăꂽ\[XŌĂт܂BA؂ꂽ
  ABindDevice 𑼂̃NCAgĂԂ܂ōĊmo܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_IN_USE
        NCAgɓo̓|[g̈⊄荞݂Ȃǂ̃\[X蓖
        Ă邩\Pbg\bNĂ܂B

  3.1.3.  SetEventMask

       int CardServices(SetEventMask, client_handle_t client, eventmask_t *mask);

  eventmask_t \̂̒`͎̂Ƃ:

       typedef struct eventmask_t {
               u_long          Attributes;
               u_long          EventMask;
       } eventmask_t;

  SetEventMask ̓NCAgɒʒmꂽCxgF悤Ƀ}XN
  XV܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB
  3.1.4.  BindDevice

       int CardServices(BindDevice, bind_req_t *req);

  bind_req \̂̒`͎̂Ƃ:

       typedef struct bind_req_t {
               socket_t        Socket;
               u_char          Function;
               dev_info_t      *dev_info;
       } bind_req_t;

  BindDevice ŃfoCXhCoƓK؂ȃ\Pbg֌WÂ܂BʏAV
  Kɑ}ꂽJ[hFłŃfoCXT[rXĂ΂܂B
  UAhCo\PbgƐڑƁÃ\Pbg̃NCAgƂƂ
  ăhCoo^̂ɓKił傤B̌Ăяo͈NCAg
  nhł͂ȂƂɒӂĉBJ[hT[rXĂяo̓\
  PbgԍɗpĂ܂B

  Function ϐ̓hCoɌ@\J[ĥ̋@\ ( )
  w肵܂BFunction ԍ̓J[h CISTPL_LONGLINK_MFC ^vɑ
  ܂BFunction  BIND_FN_ALL ɐݒ肵ꍇ́AhCo̓J[h̑S
  Ă̋@\ڑ܂BhCo CIS ^vɑ@\ɐڑ鎖
  \łB

  ߂l :

     CS_BAD_SOCKET
        w肵\Pbgԍ͖łB

  3.2.  \PbgԊǗ

  ̊֐͑ꏭȂꌻ݂̃\Pbg̏Ԃ̊lƐݒɊ֗^
  ܂BGetStatus ݂͌̃\PbgԂԂ܂BResetCard ̓n[h
  ZbgM\Pbgɑ܂BSuspendCard  ResumeCard ͓dIt
  dIݐڑĂhCo؂藣ȂɍsȂ܂B
  EjectCard  InsertCard ͖{IɎۂɃJ[h̔roƑ}Cxg^
  ܂B

  3.2.1.  GetStatus

       int CardServices(GetStatus, client_handle_t client, status_t *status);

  status_t f[^\̂̒`͎̂Ƃ:

  typedef struct status_t {
          u_char          Function;
          u_long          CardState;
          u_long          SocketState;
  } status_t;

  GetStatus ̓NCAg̃\Pbǧ݂̏ԂԂ܂Bo̓[h
  ɐݒ肳ĂJ[hł́AGetStatus ̓sփWX^ƊgԃW
  X^J[hԂF̂ɎgĂ܂Bʏ̃NCAgɂ
  Function ϐ͖܂A BIND_FN_ALL w肵ĂNCAg
  ł͂̕ϐŎw肵@\̍\WX^Ń\PbgԂ肷̂Ɏg
  p܂B CardState ɂ͎̃tO`Ă܂B:

     CS_EVENT_CARD_DETECT
        w肵\Pbggp܂B

     CS_EVENT_WRITE_PROTECT
        w肵J[h݋֎~ɂ܂B

     CS_EVENT_BATTERY_LOW
        w肵J[h̓drs܂B

     CS_EVENT_BATTERY_DEAD
        w肵J[h͓dr؂łB

     CS_EVENT_READY_CHANGE
        w肵J[h͏łB

     CS_EVENT_PM_SUSPEND
        w肵\Pbg͒~܂B

     CS_EVENT_REQUEST_ATTENTION
        w肵gԃWX^̗v߃rbgݒ肵܂B

  SocketState ͌ݎgĂ܂񂪁AIɂ CardState ̏ԕϐ
  ̒ɑgݍ܂Ăł傤B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

  3.2.2.  ResetCard

       int CardServices(ResetCard, client_handle_t client);

  ResetCard ̓NCAg̃\Pbg̃Zbgv܂B̌Ăяo
  AJ[hT[rX͑SẴNCAg
  CS_EVENT_RESET_REQUEST Cxg𑗂܂BNCAg̗v
  ۂꍇ́AJ[hT[rXNCAgׂ
  CS_EVENT_RESET_COMPLETE Cxg event_callback_args.info ɃNCA
  g̗vۂ̕Ԃlݒ肵ăNCAgɑ܂B

  SẴNCAg̗vɓӂƁAJ[hT[rX
  CS_EVENT_RESET_PHYSICAL Cxg𑗂A\PbgZbg܂B\
  PbgMɂȂƁACS_EVENT_CARD_RESET Cxg𐶐
  BŌ CS_EVENT_RESET_COMPLETE Cxg event_callback_args.info
  Ƀ[ݒ肵ďNCAgɑ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg͌݃ZbgĂ܂B

  3.2.3.  SuspendCard

       int CardServices(SuspendCard, client_handle_t client);

  J[hT[rX͑SẴNCAg CS_EVENT_PM_SUSPEND Cxg
  ܂B\PbgVbg_EƓdIt܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg͊ɒ~Ă܂B

  3.2.4.  ResumeCard

       int CardServices(ResumeCard, client_handle_t client);

  \PbgdItAJ[hT[rX͑SẴNCAg
  CS_EVENT_PM_RESUME Cxg𑗂܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg͊ɒ~Ă܂B
  3.2.5.  EjectCard

       int CardServices(EjectCard, client_handle_t client);

  J[hT[rX͑SẴNCAg ro (CWFNg) Cxg𑗂
  ܂B\PbgVbg_EƓdIt܂BSẴNCAg
  hCoT[rX\Pbg؂藣ׂɃCxg󂯎܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

  3.2.6.  InsertCard

       int CardServices(InsertCard, client_handle_t client);

  J[hT[rX͑}CxgSẴ\Pbg̃NCAgɑ܂B
  (ʏAhCoT[rXł)

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg͊ɐݒ肵Ă܂B

  3.3.  o̓J[h̐ݒ֐

  ʂ̃Cxg̏Ԃ̓hCopɓo̓|[g RequestIO 
  RequestIR ĂяoĊ荞ݐ\񂵂܂BāA
  RequestConfiguration ĂяoĎۂ̃\Pbgݒ肵܂B
  ĂяoɎsA܂\񂪂ł悤Ƀ\[X悤
  hComFĉB

  @\J[h͂ꂼ̋@\𕪗Đݒ肵܂傤BȂ瑼
  @\ƒaĂKv܂Bꂼ̃J[h@\͂̎g̃W
  X^̃ZbgAꂼ̃\Pbg͈̊荞ݐƓ̘A
  o̓|[gԍ蓖Ă܂B

  3.3.1.  RequestIO

       int CardServices(RequestIO, client_handle_t client, io_req_t *req);

  io_req_t \̂̒`͎̂Ƃ:

       typedef struct io_req_t {
               ioaddr_t        BasePort1;
               ioaddr_t        NumPorts1;
               u_long          Attributes1;
               ioaddr_t        BasePort2;
               ioaddr_t        NumPorts2;
               u_long          Attributes2;
               u_long          IOAddrLines;
       } io_req_t;

  RequestIO ̓J[hpo͗̈\񂵂܂BBasePort1 [łȂꍇ
  ́A\񂷂̈̓o̓|[gAhXłB[̏ꍇ́AJ[hT[r
  Xpł݂̈āABasePort1 ɂ̃AhXݒ肷邱Ƃ
  BNumPorts2 [łȂꍇ́A2Ԗڂ̓o̓|[g̈\񂵂
  BIOAddrLines  PCMCIA J[hŎۂɃfR[hAhX̐w
  肵܂B͌ݎgĂ܂B

  @\J[hł͂̌Ăяołꂼ̕|[gɑΉ 2 ̒
  wo͗̈tꂼ̃J[h@\ɑΉSẴ|[gɓo
  ̓|[g蓖Ă܂BႦ΁A4@\J[h̏ꍇ 8 |[gL
  1̓o͗̈hCo͊蓖āAJ[hT[rX 1 ̘A
  32-|[gubNɓ܂B

  ̌Ăяo͎ۂ̃\Pbg̓o͗̈ݒ肷̂ł͂܂B
   RequestConfiguration ĂяoĐݒ肵ĉB

  ̃tO Attributes1  Attributes2 Ɏw肵܂B:

     IO_DATA_PATH_WIDTH
        ̕ϐ 16 rbgANZXp IO_DATA_PATH_WIDTH_16 
        8 rbgANZXp IO_DATA_PATH_WIDTH_8 ̓ANZXo
        X̑傫ɍ킹Iȗ̈̑傫߂
        IO_DATA_PATH_WIDTH_AUTO ̂ǂ炩ɐݒ肵܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg̓o͗̈͊ɗ\񂳂Ă܂B

     CS_CONFIGURATION_LOCKED
        \Pbg̍\ RequestConfiguration ɂăbNĂ
        B

     CS_BAD_ATTRIBUTE
        T|[gĂȂtOw肳܂B
  3.3.2.  ReleaseIO

       int CardServices(ReleaseIO, client_handle_t client, io_req_t *req);

  ReleaseIO  RequestIO Ă΂OɊ蓖ĂĂo̓|[g
  ܂Breq ϐ RequestIO ɂ̂܂ܓn܂B̃J
  [h̋@\傫ȓo̓|[g̈LĂꍇA̋@\|[
  gĂSẴJ[h̋@\o̓|[g܂ł͑g
  Ă|[ggȂĂ܂Ă͂܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_CONFIGURATION_LOCKED
        \Pbg̍\ RequestConfiguration ɂăbNĂ
        B̍\ ReleaseIO ĂԑOɉĂ܂B

     CS_BAD_ARGS
        req ɓĂϐ RequestIO ɓnꂽ̂ƈvĂ܂
        B

  3.3.3.  RequestIRQ

       int CardServices(RequestIRQ, client_handle_t client, irq_req_t *req);

  irq_req_t \̂̒`͎̂Ƃ:

       typedef struct irq_req_t {
               u_long          Attributes;
               u_long          AssignedIRQ;
               u_long          IRQInfo1, IRQInfo2;
               void            *(Handler)(int, struct pt_regs *);
               void            *Instance
       } irq_req_t;

  RequestIRQ  PCMCIA J[hgp銄荞ݐ\񂵂܂B IRQInfo1
   IRQInfo2 ϐ CFTABLE_ENTRY ^v̊荞݋LqƈvĂ
  ܂BIRQ_INFO2_VALID  IRQInfo1 ɐݒ肵ĂȂ IRQInfo2 
  ݂̐llrbg}bv}XNݒ肵܂傤Bꂼ̃rb
  g͈̊荞ݐƈvĂ܂BႦ΃rbg 0 ͊荞 0 A
  rbg 1 ͊荞 1 ȂǂłB]āA 0x1100 Ƃ}XN͊荞
  12 Ɗ荞 8 gӖĂ܂BIRQ_INFO2_VALID ݒ肵Ă
  Ȃꍇ́AIRQInfo1 ͊荞ݔԍw肷Kv܂B̌Ă
  óAAssignedIRQ ɗ\񂳂ꂽ荞ݔԍԂĂ
  B

  IRQ_HANDLER_PRESENT tOݒ肷ƁA̎̌Ăяo荞݂
  LɂȂĂ鎞Ɋ荞݃nh𓱓邱ƂĂ
  BRequestConfiguration Ă΂ꂽAHandler Ŏw肵荞݃n
  h܂BJ[l 2.0 ȍ~ł͊荞݃nh Instance
  ŗ^ ``'' ̃hCoƋɓ܂BJ[l 2.1.60 
  Oł́AJ[l irq2dev_map e[uXVł傤B@\J[
  hł́A荞݂͋L[hŊ蓖ĂAnh͊荞݂
  J[hɋ@\F𕉂܂BNCAgJ[hT
  [rXI񂷂ׂɓƎ̊荞݃T[rX[`𓱓ꍇ́AN
  CAg@\J[hƌɂ͋L[hŊ蓖Ă܂傤B

  Attributes ŎwłtÔ͎Ƃ:

     IRQ_FORCED_PULSE
        w肷銄荞݂͕W̃x[h̓pX[hŐݒ肵
        傤B

     IRQ_TYPE_TIME
        w肷銄荞݂͑̃J[hT[rXhCoŎōsȂ
        傤B̃hCoł͂ł荞݉\ɂȂ܂B

     IRQ_FIRST_SHARED
        IRQ_TYPE_TIME Ƒgݍ킹āAŏ̃hCoL荞݂
        ɐݒ肵܂B

     IRQ_HANDLER_PRESENT
        Handler ϐς݂̊荞݃T[rX[`w悤ɂ
        B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_IN_USE
        \Pbg̓o͗̈͊ɗ\񂳂Ă邩Av荞݂͎g
        pł܂B

     CS_CONFIGURATION_LOCKED
        \Pbg̍\ RequestConfiguration ɂăbNĂ
        B

     CS_BAD_ATTRIBUTE
        T|[gĂȂtOw肳܂B

  3.3.4.  ReleaseIRQ

       int CardServices(ReleaseIRQ, client_handle_t client, irq_req_t *req);

  ReleaseIRQ ͂ȑOɊ蓖ĂĂ銄荞݂̗\܂B
  req \̂ RequestIRQ ɓn\̂Ɠ̂łBnh
  RequestIRQ ĂяoŎw肵ꍇ́A̎_œo^܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB
     CS_CONFIGURATION_LOCKED
        \Pbg̍\ RequestConfiguration ɂăbNĂ
        B\ ReleaseIRQ Ă΂OɉĂ܂B

     CS_BAD_IRQ
        req Ŏw肵p[^ RequestIRQ ɓnĂ̂ƈv
        Ă܂B

  3.3.5.  RequestConfiguration

       int CardServices(RequestConfiguration, client_handle_t client, config_req_t *req);

  config_req_t \̂̒`͎̂Ƃ:

       typedef struct config_req_t {
               u_long          Attributes;
               u_long          Vcc, Vpp1, Vpp2;
               u_long          IntType;
               caddr_t         ConfigBase;
               u_char          Status, Pin, Copy, ExtStatus;
               u_char          ConfigIndex;
               u_long          Present;
       } config_req_t;

  RequestConfiguration ͎ۂɃ\Pbg̍\sȂ܂B͓d
  ݒA CIS \WX^̐ݒAo̓|[g̈̐ݒA荞݂̐ݒ
  sȂ܂B

  IntType ͎gpJ[h̃C^[tF[X̌^w肵܂B̌^
  INT_MEMORY ܂ INT_MEMORY_AND_IO ̂ꂩw肵܂B Voltages
   1/10 {g̒PʂŎw肵܂B݂́AVpp1  Vpp2 ͓łK
  v܂D

  @\J[hł͂ꂼ̃J[h@\͕ʁXɍ\܂Bꂼ̋@\
   CIS \WX^̑gݍ킹ōsȂ܂BȂASĂ̋@\
  ͓dƃC^tF[Xō\Ȃ΂܂B

  ̃tO Attributes Ŏw肷̂łBDMA ƃXs[J͑SĂ
  VXeŃT|[g͂Ă܂B

     CONF_ENABLE_IRQ
        RequestIRQ ȑOo͊荞݂\\ɂ܂B

     CONF_ENABLE_DMA
        \Pbgp DMA ANZXLɂ܂B

     CONF_ENABLE_SPKR
        \PbgXs[Jo͂Lɂ܂B

  Present ϐ̓J[hɎĂ CIS \WX^Ŏw肷rbg
  }bvłBConfigBase ͑̍\WX^̃ItZbgŗ^
  ܂B̃WX^Ŏw肵܂B:

     PRESENT_OPTION
        ݂̍\IvVWX^(COR) w肵܂B COR WX^
        ConfigIndex ϐgĎw肵܂B

     PRESENT_STATUS
        ݂̃J[h\(CC)  ԃWX^(SR) w肵܂B CCSR 
        Status ϐŏ܂B

     PRESENT_PIN_REPLACE
        ݂̃sփWX^(PRR) w肵܂BPRR  Pin ϐŏ
        ܂B

     PRESENT_COPY
        ݂̃\Pbg(S) ƃRs[WX^(CR) w肵܂BSCR  Copy
        ϐŏ܂B

     PRESENT_EXT_STATUS
        ݂̊gԃWX^(ESR) w肵܂BESR  ExtStatus ϐ
        ŏ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_OUT_OF_RESOURCE
        J[hT[rX̓J[h̍\WX^ɃANZX郁̈悪
        蓖Ăł܂B

     CS_CONFIGURATION_LOCKED
        J[h̍\ RequestConfiguration ɂăbNĂ܂B

     CS_BAD_VCC
        vꂽ Vcc d̓T|[gĂ܂B

     CS_BAD_VPP
        vꂽ Vpp1/Vpp2 d̓T|[gĂ܂B

  3.3.6.  ModifyConfiguration

       int CardServices(ModifyConfiguration, client_handle_t client, modconf_t *mod);

  modconf_t \̂̒`͎̂Ƃ:

       typedef struct modconf_t {
               u_long          Attributes;
               u_long          Vcc, Vpp1, Vpp2;
       } modconf_t;

  ModifyConfiguration  RequestConfiguration ĂяoĐݒ肵\Pb
  g̑ύX܂B

  Attributes ŎwłtÔ͎Ƃ:

     CONF_IRQ_CHANGE_VALID
        CONF_ENABLE_IRQ ̐ݒύX鎖\Ă܂B

     CONF_ENABLE_IRQ
        \PbgɗLɂȂĂo͊荞݂w肵܂B

     CONF_VCC_CHANGE_VALID
        Vcc ύX邱Ƃ\Ă܂B

     CONF_VPP1_CHANGE_VALID
        Vpp1 ύX邱Ƃ\Ă܂B

     CONF_VPP2_CHANGE_VALID
        Vpp2 ύX邱Ƃ\Ă܂B

  ݁AVpp1  Vpp2 ͏ɓlłȂ΂܂B]āA2̒l
  ɕύXKv܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnh͖łB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_CONFIGURATION_LOCKED
        ۂɂ́A\Pbg̓bNĂ܂B

     CS_BAD_VCC
        vꂽ Vcc d̓T|[gĂ܂B

     CS_BAD_VPP
        vꂽ Vpp1/Vpp2 d̓T|[gĂ܂B

  3.3.7.  ReleaseConfiguration

       int CardServices(ReleaseConfiguration, client_handle_t client, config_req_t *req);

  ReleaseConfiguration ͂ȑOɐݒ肳Ă\̉܂B
  req \̂ \Pbgݒ肷ƂƓ̂łB

  ߂l :

     CS_BAD_HANDLE
        NCAgnhA\Pbgݒ肳Ă܂B

  3.3.8.  GetConfigurationInfo

       int CardServices(GetConfigurationInfo, client_handle_t client, config_info_t *config);

  config_info_t \̂̒`͎̂Ƃ:

       typedef struct config_info_t {
               u_char          Function;
               u_long          Attributes;
               u_long          Vcc, Vpp1, Vpp2;
               u_long          IntType;
               caddr_t         ConfigBase;
               u_char          Status, Pin, Copy, Option, ExtStatus;
               u_long          Present;
               u_long          AssignedIRQ;
               u_long          IRQAttributes;
               ioaddr_t        BasePort1;
               ioaddr_t        NumPorts1;
               u_long          Attributes1;
               ioaddr_t        BasePort2;
               ioaddr_t        NumPorts2;
               u_long          Attributes2;
               u_long          IOAddrLines;
       } config_info_t;

  GetConfigurationInfo  RequestIO, RequestIRQ  RequestConfiguration
  Őݒ肵݂̃\Pbg̍\Ԃ܂BSɍ\\Pbgɑ΂
  ēKĂBP@\̃J[hɌĂNCAgł́A
  Function ϐ͖ANCAgw肵Ă@\̃f[^Ԃ
  ܂BBIND_FN_ALL ƌĂNCAgł͂̕ϐ͎w肵֐
  ̍\f[^Ԃ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhA\Pbgݒ肳Ă܂B

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_CONFIGURATION_LOCKED
        ۂɂ́A\Pbg̓bNĂ܂B

  3.4.  J[h\ (CIS) gp@

  J[h\ (CIS)  PCMCIA W̒ōłɂƂ
  BSĂ̑ 2 ł PCMCIA J[h͂łǂݒ肷邩 CIS 
  Ă܂BCIS ̓J[h̑Ԃ̒``^v (tuples)''
  AXgłB^v͎ʃR[hAf[^ƈÃf[^Ȃ
  B̃^vł̃f[^̔zu͂ƂƂSẴrbgg悤
  Ȗ炩ȓw͂KvƂقǁAȂ蕡GłB

  ValidateCIS Ăяo͐ CIS gĂJ[hǂׂ܂B
  GetFirstTuple  GetNextTuple Ăяo CIS ^vXgړ
  @łBGetTupleData ̓^vf[^o܂B
  ParseTuple ͓ɏdvȌꂽ̃^v߂܂B

  3.4.1.  GetFirstTuple, GetNextTuple

  #include "cistpl.h"

  int CardServices(GetFirstTuple, client_handle_t client, tuple_t *tuple);
  int CardServices(GetNextTuple, client_handle_t client, tuple_t *tuple);

  tuple_t f[^\̂̒`͎̂Ƃ:

       typedef struct tuple_t {
               u_long          Attributes;
               cis_data_t      DesiredTuple;
               u_long          Flags;
               cisdata_t       TupleCode;
               u_long          TupleLink;
               cisdata_t       TupleOffset;
               cisdata_t       TupleDataMax;
               cisdata_t       TupleDataLen;
               cisdata_t       *TupleData;
       } tuple_t;

  GetFirstTuple  DesiredTuple Ɉvŏ̃^vR[hJ[h
  CIS T܂Bʂ RETURN_FIRST_TUPLE R[h͂ǂȎނ̃^v
  Ɉv܂BTupleCode ŏɈv^ṽR[hɐݒ肵
  BTupleLink ͑̃^ṽAhXłB

  GetNextTuple ͎OɎs GetFirstTuple Ԃ tuple_t \̂^
  邱Ƃ GetFirstTuple ɎĂ܂B܂AGetNextTuple ͎
  v^v DesiredTuple ɕԂ܂B

  ̊֐͎I CIS ̃N^vSĎJĒ܂B
  @\J[hł CISTPL_LONGLINK_MFC ^vĂ̂́A
  ֐NCAghCo̎wĂ@\w肵 CIS I
  ɒǐՂł悤ɂ邽߂łBNCAg BIND_FN_ALL 
  ꍇ́ASẴ^vԂł傤B

  Attributes ŎwłtÔ͎Ƃ:

     TUPLE_RETURN_LINK
        N^v (CISTPL_LONGLINK_A, CISTPL_LONGLINK_C,
        CISTPL_LONGLINK_MFC, CISTPL_NOLINK, CISTPL_LINKTARGET) Ԃ
        Ƃ\Ă܂Bʂ͂̃^v͈Öق̂ɏ
        B

     TUPLE_RETURN_COMMON
        @\ CIS ``L'' CIS ZNṼ^vԂƂ\Ă
        ܂B̃tOȂ͒ʏAJ[hT[rX̓NCAgɌ
        @\\^vԂ܂D

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_OUT_OF_RESOURCE
        J[hT[rX̓̈J[h CIS Ɋtł܂
        B

     CS_NO_MORE_ITEMS
        DesiredTuple Ɉv^v͂܂B
  3.4.2.  GetTupleData

       #include "cistpl.h"

       int CardServices(GetTupleData, client_handle_t client, tuple_t *tuple);

  GetTupleData ͈Ãf[^OɌĂ GetFirstTuple ܂
  GetNextTuple ̕ԂĂw肳ꂽ^vo܂B
  TupleDataMax ̍ő咷 TupleData obt@ɃRs[āA TupleOffset
  ̃ItZbgn܂܂BRs[ꂽoCg TupleDataLen ɓ
  Ă܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_OUT_OF_RESOURCE
        J[hT[rX̓̈J[h CIS Ɋtł܂
        B

     CS_NO_MORE_ITEMS
        ^vɂ͉f[^i[Ă܂BTuppleOffset ̓^v
        ̒Ɠ傫łB

  3.4.3.  ParseTuple

       #include "cistpl.h"

       int CardServices(ParseTuple, client_handle_t client, tuple_t *tuple, cisparse_t *parse);

  cisparse_t f[^ \͎̂̂Ƃ:

       typedef union cisparse_t {
               cistpl_device_t         device;
               cistpl_checksum_t       checksum;
               cistpl_longlink_t       longlink;
               cistpl_longlink_mfc_t   longlink_mfc;
               cistpl_vers_1_t         version_1;
               cistpl_altstr_t         altstr;
               cistpl_jedec_t          jedec;
               cistpl_manfid_t         manfid;
               cistpl_funcid_t         funcid;
               cistpl_config_t         config;
               cistpl_cftable_entry_t  cftable_entry;
               cistpl_device_geo_t     device_geo;
               cistpl_vers_2_t         version_2;
               cistpl_org_t            org;
       } cisparse_t;

  ParseTuple ͎OɌĂ GetTupleData ԂĂ^ṽf[^
  ߂܂BԂĂ\͉̂͂^v̌^Ɉˑ܂B̍\
  ̂̒` cistpl.h t@CQƂĉB̂̂͑
  ϕGȂ̂łB

  ߂l :

     CS_BAD_TUPLE
        ^v̉͒ɃG[܂B^vsSA
        ܂B

     CS_UNSUPPORTED_FUNCTION
        ParseTuple w肳ꂽ^v̌^͂ł܂B

  3.4.4.  ValidateCIS

       int CardServices(ValidateCIS, client_handle_t client, cisinfo_t *cisinfo);

  cisinfo_t \͎̂̂Ƃ:

       typedef struct cisinfo_t {
               u_long          Chains;
       } cisinfo_t;

  ValidateCIS ̓J[hÓȃJ[h\(CIS) Ă邩؂
  ܂BChains Ɍ^v̐ԂĂ܂BCIS ߕs\
  vAChains  0 ɐݒ肵܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_OUT_OF_RESOURCE
        J[hT[rX̓̈J[h CIS Ɋtł܂
        B

  3.5.  ̈搧

  ꂼ̃\Pbg4ȏ̃̈āAPCMCIA ̈ꕔz
  Xg̃AhXԂɊt܂BPCMCIA @͈ʃƑ
  ̗ 16MB xANZXł܂B͈̈ʂ 2 ׂ̂̑傫
  Ă܂AzXgƃJ[h̃AhXԂł͗̈̑傫̔{ɋE
  Ă܂B

  ̈ RequestWindow Ăяoď܂B̗̈摮
   ModifyWindow gpĕύXsȂ܂B̈ɊtꂽJ[
  ḧꕔ MapMemPage gpĕύX܂B̈ ReleaseWindow
  ŉ܂B̃J[hT[rX֐Ƃ͈قȂāAclient_handle_t n
  hłȂ window_handle_t nhœ삵܂B

  3.5.1.  RequestWindow

       int CardServices(RequestWindow, client_handle_t *handle, win_req_t *req);

  win_req_t \͎̂̂Ƃ:

       typedef struct win_req_t {
               u_long          Attributes;
               caddr_t         Base;
               u_long          Size;
               u_long          AccessSpeed;
       } win_req_t;

  RequestWindow ̓J[ḧ̗VXe֊蓖Ă܂BĂ
  OɁAhandle ϐLȃNCAgnhw悤ɂ܂BԂ
  ĂǍĂ΂ ModifyWindowAMapMemPage  ReleaseWindow 
  gp window_handle_t nhŒu܂B

  Attributes ŎwłtÔ͎Ƃ:

     WIN_MEMORY_TYPE
        ̕ϐ͈ʃł WIN_MEMORY_TYPE_CM Ał
        WIN_MEMORY_TYPE_AM ̂ꂩɂȂ܂B

     WIN_DATA_WIDTH
        16 rbgANZXł WIN_DATA_WIDTH_16 A8 rbgANZXȂ
        WIN_DATA_WIDTH_8 ̂ꂩɂȂ܂B

     WIN_ENABLE
        ݒ肷ƁÄ悪gp\ɂȂ܂B

     WIN_USE_WAIT
        䑕uJ[h MWAIT MĎ悤Ɏw肵܂B

  Base ̓VXeł̗̈̊AhXw肵܂BNULL ̏ꍇ
  ́AJ[hT[rX͍ŏɌp\ȗ̈̃AhXݒ肵
  BSize ͗̈̑傫oCgPʂŎw肵܂BAccessSpeed ̓
  ANZXXs[himbPʂŎw肵܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_NO_CARD
        NCAgɊt\Pbg͌ݎgĂ܂B

     CS_BAD_ATTRIBUTE
        T|[gĂȂ̈̑w肳܂B

     CS_OUT_OF_RESOURCE
        ̃\Pbgɑ΂郁̈̍ő吔͎gpς݂łB

     CS_IN_USE
        RequestWindow ̓VXê̈悪܂B

  3.5.2.  ModifyWindow

       int CardServices(ModifyWindow, window_handle_t, modwin_t *);

  modwin_t \͎̂̂Ƃ:

       typedef struct modwin_t {
               u_long          Attributes;
               u_long          AccessSpeed;
       } modwin_t;

  ModifyWindow ͎OɌĂ RequestWindow ԂĂ̈nh
  ύX܂BύXł鑮͎̂Ƃ:

     WIN_MEMORY_TYPE
        ̕ϐ͈ʃł WIN_MEMORY_TYPE_CM Ał
        WIN_MEMORY_TYPE_AM ̂ꂩɂȂ܂B

     WIN_DATA_WIDTH
        16 rbgANZXł WIN_DATA_WIDTH_16 A8 rbgANZXȂ
        WIN_DATA_WIDTH_8 ̂ꂩɂȂ܂B

     WIN_ENABLE
        ݒ肷ƁÄ悪gp\ɂȂ܂B

  AccessSpeed ̓ANZXXs[himbPʂŎw肵܂B

  ߂l :

     CS_BAD_HANDLE
        ̈nh͖łB

  3.5.3.  MapMemPage

       int CardServices(MapMemPage, window_handle_t, memreq_t *);

  memreq_t \͎̂̂Ƃ:

       typedef struct memreq_t {
               u_long          CardOffset;
               page_t          Page;
       } memreq_t;

  MapMemPage  CardOffset Ŋẗ̊AhXJ[h
  ̃AhXɐݒ肵܂B̈ RequestWindow Ăяoč쐬
  Ă܂傤BPage ϐ͂̔łł͎Ă܂̂ŁA0 ɐݒ肵
  ĂB

  ߂l :

     CS_BAD_HANDLE
        ̈nh͖łB

     CS_BAD_PAGE
        Page ̒l[ȊOłB

  3.5.4.  ReleaseWindow

       int CardServices(ReleaseWindow, window_handle_t handle);

  ReleaseWindow ͎O RequestWindow Ŋ蓖Ă̈
  B

  ߂l :

     CS_BAD_HANDLE
        ̈nh͖łB

  3.6.  eʃT[rX

  eʃT[rX̓̈T[rXŒ񋟂ĂC^[tF[X
  胁̈ɃANZXC^[tF[X͂荂xɂȂĂ܂B
  eʃĂяogpNCAg͔wɂ郁̋@\A
  NZX@ɂĂ̒m͕Kv܂B@ɈˑvO̓
  eNmWhCo(MTD) ƌĂ΂ȃJ[hT[rXɓĂ
  B

  3.6.1.  RegisterMTD

       int CardServices(RegisterMTD, client_handle_t handle, mtd_reg_t *reg);

  mtd_reg_t f[^ \͎̂̂Ƃ:

       typedef union mtd_reg_t {
               u_long          Attributes;
               u_long          Offset;
               u_long          MediaID;
       } mtd_reg_t;

  RegisterMTD ̓J[hT[rXɃNCAg MTD w肵̈
  vʒm܂BOffset ϐ̓̈̊JnAhXw肵
  ܂BAttributes Ŏwłê͎Ƃ:

     REGION_TYPE
        ʃł REGION_TYPE_CM  ł
        REGION_TYPE_AM ̂ǂ炩w肵܂B

  MediaID ϐ̓J[hT[rX݂܂BMTD ɂ̃̈Q
  鎞̗v̈ꕔƂēn܂B

  UAMTD ̌ĂяoŃ̈ɌƁADeregisterClient 
  Ăяo܂ŌÂ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_BAD_OFFSET
        LȃJ[h̃̈ƃItZbgvȂA MTD 
        ɂ̃̈o^Ă܂B

  3.6.2.  GetFirstRegion, GetNextRegion

       int CardServices(GetFirstRegion, client_handle_t handle, region_info_t *region);
       int CardServices(GetNextRegion, client_handle_t handle, region_info_t *region);

  region_info_t f[^ \͎̂̂Ƃ:

       typedef union region_info_t {
               u_long          Attributes;
               u_long          CardOffset;
               u_long          RegionSize;
               u_long          AccessSpeed;
               u_long          BlockSize;
               u_long          PartMultiple;
               u_char          JedecMfr, JedecInfo;
               memory_handle_t next;
       } region_info_t;

  GetFirstRegion  GetNextRegion ̓J[h CISTPL_DEVICE,
  CISTPL_JEDEC,  CISTPL_DEVICE_GEO ^v̏v񂵂
  BCardOffset ͗̈̊JnAhX񋟂܂BRegionSize ͗̈̑
  oCgPʂŒ񋟂܂B AccessSpeed ͋@̃TCNԂim
  bPʂŒ񋟂܂B BlockSize ͏ubN̑傫oCgPʂŒ
  APartMultiple ͋̍ŏ̑傫 BlockSize PʂŒ񋟂
  BJedecMfr  JedecInfo  ̈悪 JEDEC ɏĂؖ
  ܂B

  Attributes Ŏwłϐ͎̂Ƃ:

     REGION_TYPE
        ʃł REGION_TYPE_CM  ł
        REGION_TYPE_AM ̂ǂ炩w肵܂B

  ̌Ăяo MTD NCAgɂčsȂꂽABindMTD 
  яoNCAg BindMTD Ԃ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_NO_MORE_ITEMS
        ̈悪`Ă܂B

  3.6.3.  OpenMemory

       int CardServices(OpenMemory, client_handle_t *handle, open_mem_t *req);

  pen_mem_t \͎̂̂Ƃ:

       typedef struct open_mem_t {
               u_long          Attributes;
               u_long          Offset;
       } open_mem_t;

  OpenMemory ͑̑eʃT[rXoRŃ̈ANZXn
  hl܂BOffset ϐ̓ANZX郁̈̊AhX
  w肵܂B܂ANCAgnh͐Vn
  hɒu܂B

  Attributes Ŏwłϐ͎̂Ƃ:

     MEMORY_TYPE
        ͈̈ʃł MEMORY_TYPE_CM Ał
        MEMORY_TYPE_AM ̂ꂩɂȂ܂B

     MEMORY_EXCLUSIVE
        NCAg̈rIɃANZXׂɎw肵܂B

  ߂l :

     CS_BAD_HANDLE
        ̈nhłB

     CS_BAD_OFFSET
        Lȗ̈̃ItZbgw肳ĂȂAeʃvƊ
        AÂ MTD ̑eʃT[rXɗ̈悪܂B

  3.6.4.  CloseMemory

       int CardServices(CloseMemory, memory_handle_t handle);

  CloseMemory  ȑOɌĂяo OpenMemory Ԃnh
  ܂BNCAg DeregisterClient ĂяoOɑSẴn
  h܂傤B

  ߂l :

     CS_BAD_HANDLE
        nhłB

  3.6.5.  ReadMemory, WriteMemory

       int CardServices(ReadMemory, memory_handle_t handle mem_op_t *req, caddr_t buf);
       int CardServices(WriteMemory, memory_handle_t handle, mem_op_t *req, caddr_t buf);

  mem_io_t \͎̂̂Ƃ:

       typedef struct mem_op_t {
               u_long          Attributes;
               u_long          Offset;
               u_long          Count;
       } mem_op_t;

  ReadMemory  WriteMemory ͈ȑOɌĂяo OpenMemory Ԃw肵
  nhŎw肵J[ḧǂݏ܂B Offset 
  ̓J[ḧ̊JnAhXw肵܂B Count ϐ͓]
  oCgw肵܂Bbuf ϐ ReadMemory p̑Ώۖ
  WriteMemory ̑ΏۂƂȂzXg̃obt@w܂B

  Attributes Ŏwłϐ͎̂Ƃ:

     MEM_OP_BUFFER
        zXgobt@[UZOgɂ鎞
        MEM_OP_BUFFER_USER ̓zXgobt@J[lɂ
         MEM_OP_BUFFER_KERNEL w肵܂B

     MEM_OP_DISABLE_ERASE
        J[ḧޑOɏȂ悤Ɏw肵܂B

     MEM_OP_VERIFY
        ݂̎Ɍ؂ƂɎw肵܂B

  ߂l :

     CS_BAD_HANDLE
        ̈nhłB

     CS_BAD_OFFSET
        w肵J[hItZbg̈̏IAhXzĂ
        B

     CS_BAD_SIZE
        w肵]TCŸ̏IAhXzĂ܂B

  3.6.6.  RegisterEraseQueue

       int CardServices(RegisterEraseQueue, client_handle_t *handle, eraseq_hdr_t *header);

  eraceq_hdr_t \͎̂̂Ƃ:

       typedef struct erase_queue_header_t {
               int             QueueEntryCount;
               eraseq_entry_t  *QueueEntryArray;
       } eraseq_hdr_t;

  ̌Ăяo̓J[hT[rX̏L[o^܂B eraseq_handle_t
  nh *handle ɕԂ܂BNCAg CheckEraseQueue Ăяo
  AJ[hT[rXL[𒲂ׂĐVv̔񓯊Jn
  B

  eraseq_entry_t \͎̂̂Ƃ:

       typedef struct eraseq_entry_t {
               memory_handle_t Handle;
               u_char          State;
               u_long          Size;
               u_long          Offset;
               u_long          *Optional;
       } eraseq_entry_t;

  L[̓o^ɂ́AHeader ϐ͈ȑOɌĂ΂ꂽ OpenMemory Ԃ
  nh܂BState ϐ͏L[̏Ԃ܂B
  l`Ă܂B:

     ERASE_QUEUED
        VKɗvNCAgݒ肵܂B

     ERASE_IDLE
        o^ANeBułȂNCAgݒ肵܂B

     ERASE_PASSED
        ܂ MTD ݒ肵܂B

     ERASE_FAILED
        Ɏs MTD ݒ肵܂B

     ERASE_MEDIA_WRPROT
        ̈悪݋֎~ɂȂĂ鎖Ă܂B

     ERASE_NOT_ERASABLE
        ̈悪T|[gĂȂĂ܂B

     ERASE_BAD_OFFSET
        ubN̋EŎn܂ĂȂĂ܂B

     ERASE_BAD_SIZE
        vĂ̑傫ubN̔{ɂȂĂȂ
        Ă܂B

     ERASE_BAD_SOCKET
        MTD J[hȂĂ܂B

  āAERASE_IN_PROGRESS() }N͏Ă State ̒l̐^
  ̏ԂԂ܂B

  Size ϐ͏v傫oCgPʂŗ^܂BOffset ϐ͗̈
  JnʒũItZbgŗ^܂B傫ƃItZbg͏ubN
  EɋEĂ܂BOptional ϐ̓J[hT[rXł͎gĂ
  ܂񂪁ANCAghCoŎgĂ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

  3.6.7.  DeregisterEraseQueue

       int CardServices(DeregisterEraseQueue, eraseq_handle_t handle);

  DeregisterEraseQueue ͈ȑO RegisterEraseQueue ɂo^ꂽL
  [܂Bw肳ꂽL[ɏ̃L[ꍇ́AĂяo
  ͎s܂B

  ߂l :

     CS_BAD_HANDLE
        L[nhłB

     CS_BUSY
        L[łB

  3.6.8.  CheckEraseQueue

       int CardServices(CheckEraseQueue, eraseq_handle_t handle);

  ̌Ăяo͈ȑO RegisterEraseQueue œo^ꂽVvJ
  [hT[rXɒʒm܂B

  ɂāANCAg͍ŏɂꂼ̃L[ ERASE_IDLE Ԃ
  蓖Ă܂BL[ɐVvǉꂽ́ANCAg̓L[
  Ԃ ERASE_QUEUED ɂāACheckEraseQueue Ăт܂BNCAg
  Cxg󂯎ꍇ́AvԕϐmF
  B

  ߂l :

     CS_BAD_HANDLE
        L[nhłB

  3.7.  eĂяo

  3.7.1.  GetCardServicesInfo

       int CardServices(GetCardServicesInfo, servinfo_t *info);

  servinfo_t \͎̂̂Ƃ:

       typedef struct servinfo_t {
               char            Signature[2];
               u_long          Count;
               u_long          Revision;
               u_long          CSLevel;
               char            *VendorString;
       } servinfo_t;

  GetCardServicesInfo ͂̃J[hT[rX̃o[W̏CԂ
  BSignature  ``CS'' ɐݒ肵܂BCount ͌\̃\Pbg̐
  ݒ肵܂B Revision ɂ̓J[hT[rXpbP[W̏Cxݒ肵
  CSLevel  PCMCIA Wɏxݒ肵܂BBCD ŕ\LĂ
  BVendorString  RCS ʕւ̃|C^ݒ肵܂B

  ̌Ăяo͏ɐ܂B

  3.7.2.  AccessConfigurationRegister

       #include "cisreg.h"

       int CardServices(AccessConfigurationRegister, client_handle_t handle, conf_reg_t *reg);

       <tt/conf_reg_t/ \͎̂̂Ƃ:
       typedef struct conf_reg_t {
               u_char          Function;
               u_long          Action;
               off_t           Offset;
               u_long          Value;
       } conf_reg_t;

  J[h̋@\Ɋ蓖ĂꂽʓIȃNCAgł́AFunction 
  ͖܂BBIND_FN_ALL Ɋ蓖ĂꂽNCAgł́A̕
  ̓ANZX@\̍\WX^w肵܂B

  Action ϐ͎̓̈w肵܂B

     CS_READ
        w肵\WX^ǂݏo Value ɒlԂ܂B

     CS_WRITE
        w肵\WX^ Value ̒l݂܂B

  AccessConfigurationRegister ͍\WX^̈̊JnAhX
  Offset ̃ItZbg CIS \WX^1oCgǂݏ܂B
  RequestConfiguration ō\\PbgŎg܂B

  cistpl.h Œ`Ă Offset ̒l͎̂Ƃ :

     CISREG_COR
        \IvVWX^(COR)B

     CISREG_CCSR
        J[h\(CC) ƏԃWX^(SR)B

     CISREG_PRR
        sփWX^(PRR)B

     CISREG_SCR
        \Pbg(S) ƃRs[WX^(CR)B

     CISREG_ESR
        gԃWX^(ESR)B

     CISREG_IOBASE0..CISREG_IOBASE3
        o͊ꃌWX^B

     CISREG_IOSIZE
        o̓TCYWX^B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhłB

     CS_BAD_ARGS
        w肵 Action ̓T|[gĂ܂B

     CS_CONFIGURATION_LOCKED
        ۂɍ\bNĂ鎖ӖĂ܂B

     CS_OUT_OF_RESOURCE
        J[hT[rX̓J[h̍\WX^ANZX郁̈
        蓖ĂgȂ悤ɂ܂B

  3.7.3.  AdjustResourceInfo

       int CardServices(AdjustResourceInfo, client_handle_t handle, adjust_t *adj);

  adjust_t \͎̂̂Ƃ:

  typedef struct adjust_t {
          u_long          Action;
          u_long          Resource;
          u_long          Attributes;
          union {
                  struct memory {
                          caddr_t         Base;
                          u_long          Size;
                  } memory;
                  struct io {
                          ioaddr_t        BasePort;
                          ioaddr_t        NumPorts;
                          u_long          IOAddrLines;
                  } io;
                  struct irq {
                          u_long          IRQ;
                  } irq;
          } resource;
  } adjust_t;

  AdjustResourceInfo ̓J[hT[rXɎ PCMCIA foCX蓖
  邩蓖ĂȂ₢킹܂Bʏ Linux ̎ǗVXe (
  *_region Ăяoo̓|[gA荞݊蓖)̓J[hT[rXŊ
  Ă܂Å֐̓[Uɑ̊Ǘx񋟂܂B

  Action ϐ͎̓̈w肵܂B

     ADD_MANAGED_RESOURCE
        J[hT[rXǗɂw肵܂B] PCMCIA foC
        X蓖Ă̂łB

     REMOVE_MANAGED_RESOURCE
        J[hT[rXǗ폜鎑w肵܂D

  ɁAJ[hT[rXSĂ̎gp\Ȋ荞݂gpł悤ɂ
  ܂Ao̓|[gƃ̈ ADD_MANAGED_RESOURCE ŖIɎw
  Kv܂B

  Resource ϐ͎̒lƂ܂B:

     RES_MEMORY_RANGE
        adj->resource.memory ŋLq͈̔͂w肵܂B

     RES_IO_RANGE
        adj->resource.io ŋLqo̓|[gw肵܂B

     RES_IRQ
        adj->resource.irq ŋLq荞݂w肵܂B

  Attributes Ŏwłê͎Ƃ:

     RES_RESERVED
        PCMCIA hCopɗvC\񂵂Ă܂Bp\
        ȃJ[hT[rX̖₢킹foCXp̎ł͂܂B
        ͖Ă܂B

  ߂l :

     CS_UNSUPPORTED_FUNCTION
        w肵 Action  Resource ̓T|[gĂ܂B

     CS_BAD_BASE
        w肵o̓AhX͔͈͊OłB
     CS_BAD_SIZE
        w肵܂͓o͗̈̃TCY͔͈͊OłB

     CS_IN_USE
        w肵荞݂͌݃J[hT[rXNCAggpłB

  3.7.4.  ReportError

       int CardServices(ReportError, client_handle_t handle, error_info_t *err);

  error_info_T \̂̒`͎̂Ƃ:

       typedef struct error_info_t {
              int             func;
              int             retcode;
       } error_info_t;

  ReportError ͎w肵 prefix ƃJ[hT[rX̋@\R[hƖ߂
  l܂񂾃J[lG[bZ[W𐶐܂B :

       error_info_t err = { RequestIO, CS_BAD_HANDLE };
       CardServices(ReportError, handle, &err);

  ͎̃bZ[W𐶐܂B:

       serial_cs: RequestIO: Bad handle

  ̌Ăяo͏ɐI܂B

  4.  J[h\ (CIS) ̒`

  4.1.  CIS ^v̒`

  J[hT[rX^v (Card Services ParseTuple) @\́A
  GetTupleData œ CIS ^v͂Aꂼ̃^v̎ނɈ
  `Ń^v̓eԂ܂B

  #include "cistpl.h"

  4.1.1.  CISTPL_CHECKSUM

  cistpl_checksum_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_checksum_t {
               u_short         addr;
               u_short         len;
               u_char          sum;
       } cistpl_checksum_t;

  4.1.2.  CISTPL_LONGLINK_A, CISTPL_LONGLINK_C, CISTPL_LINKTARGET,
  CISTPL_NOLINK

  cistpl_longlink_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_longlink_t {
               u_long          addr;
       } cistpl_longlink_t;

  ̃^v͑AʃȂǂւ̑ CIS ^v`F[ւ
  |C^ɂȂĂ܂Bꂼ CIS ^v́AȂƂ 1 ȏ̒
  ̃NłBCISTPL_LONGLINK_A ^v́AAgr[gւ̃|
  C^łACISTPL_LONGLINK_C ^v͈ʃւ̃|C^łB
  ̃AhX 0 n܂W CIS `F[́AɈʃ
  AhX 0 ւ̃NӖĂ܂B(@@) ̂悤ȃftH[g̃
  NLZꍇɂ CISTPL_NOLINK Ƃ^vg܂B

  ONɂĎw`F[̍ŏ̃^v
  ́ACISTPL_LINKTARGET łȂ΂Ȃ܂BCS ^vR[h͎
  IɃONǂAN(^[Qbg)𒲂ׂ
  BGetNextTuple ɂāA TUPLE_RETURN_LINK w肳ĂȂ
  Ã^v̓[U[͌܂B

  4.1.3.  CISTPL_LONGLINK_MFC

  cistpl_longlink_mfc_t \̂̒`͎̂Ƃ:

  typedef struct cistpl_longlink_mfc_t {
          int     nfn;
          struct {
                  u_char  space;
                  u_long  addr;
          } fn[CISTPL_MAX_FUNCTIONS;
  } cistpl_longlink_mfc_t;

  ̃^v̓}`t@NV(@\)J[hʂ̂Ɏg
  Bꂼ̋@\Ƃ CIS `F[ւ̃ON|C^w肵
  ܂B space ϐ́Ȁꍇ CISTPL_MFC_ATTR Aʃ̏ꍇ
   CISTPL_MFC_COMMON w肳܂B

  4.1.4.  CISTPL_DEVICE, CISTPL_DEVICE_A

  cistpl_device_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_device_t {
               int             ndev;
               struct device_info {
                       u_char          type;
                       u_char          wp;
                       u_long          speed;
                       u_long          size;
               } dev[CISTPL_MAX_DEVICES];
       } cistpl_device_t;

  CISTPL_DEVICE ^v̓J[ḧʃ̃AhẌɊւċLq
  ܂BCISTPL_DEVICE_A ^v͑̈LqĂ܂B type
  tO̗͂̈Ɋւ郁foCX̎ނ܂B wp tÓA
  ̗̈悪CgveNgĂ邩ǂ܂B speed ϐ
  imbPʂŁAsize ̓oCgPʂŎ܂BAhẌ̓AhX 0
  ԒnÄł邱Ƃ肳Ă܂B̂悤ȃfoCX^
  Cv`Ă܂B

     CISTPL_DTYPE_NULL
        ȂɂfoCX݂ȂA܂́ÃJ[h̃AhXԂ̒
        Łuvł邱Ƃ܂B

     CISTPL_DTYPE_ROM
        }XN ROM łB

     CISTPL_DTYPE_OTPROM
        x݉\ ROM łB(: uOne-typev
        uOne-timev̊ԈႢłƎv܂B)

     CISTPL_DTYPE_EPROM
        O\ PROM łB(UV-EPROM)

     CISTPL_DTYPE_EEPROM
        dCIɏ\ PROM łB

     CISTPL_DTYPE_FLASH
        tbV EPROM łB

     CISTPL_DTYPE_SRAM
        X^eBbN܂͕s RAM łB

     CISTPL_DTYPE_DRAM
        _Ci~bN܂͊ RAM łB

     CISTPL_DTYPE_FUNCSPEC
        @\`\ȃfoCXł邱Ƃ܂B܂Aėp̋L
        ͂ȂāAႦ [}bvhI/O foCXobt@̂悤
        ̂łB

     CISTPL_DTYPE_EXTEND
        g^̃foCX^Cv܂B͏̊ĝ߂ɗ\
        Ă܂B

  4.1.5.  CISTPL_VERS_1

  cistpl_vers_1_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_vers_1_t {
               u_char          major;
               u_char          minor;
               int             ns;
               int             ofs[CISTPL_VERS_1_MAX_PROD_STRINGS];
               char            str[254];
       } cistpl_vers_1_t;

  ns ϐ́Ã^v̒Ɋ܂܂Ă鐻i񕶎̒Ă
  ܂B str ƂzɊi[Ă܂Bꂼ̕
  ̓kŏIĂAofs ͂ꂼ̎̕n܂ւ̃ItZbg
  Ă܂B

  4.1.6.  CISTPL_ALTSTR

  cistpl_altstr_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_altstr_t {
               int             ns;
               int             ofs[CISTPL_ALTSTR_MAX_STRINGS];
               char            str[254];
       } cistpl_altstr_t;

  ns ϐ́Ã^vɊ܂܂Ă֗pꕶ̐Ă܂B
  ۂ́̕Astr zɊi[Ă܂Bꂼ̓̕k
  ŏIĂAofs ͂ꂼ̎̕n܂ւ̃ItZbgĂ
  B

  4.1.7.  CISTPL_JEDEC_C, CISTPL_JEDEC_A

  cistpl_jedec_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_jedec_t {
               int             nid;
               struct jedec_id {
                       u_char  mfr;
                       u_char  info;
               } id[CISTPL_MAX_DEVICES];
       } cistpl_jedec_t;

  jedec_id (JEDEC ʎq) ́APCMCIA 邽߂Ɏg
  ̃foCX^CvLqĂ܂B nid ϐ͂̃^v̒ɂ
  jedec_id ܂܂Ă邩܂Bjedec_id (JEDEC identifier)
  ƁAɑΉ CISTPL_DEVICE ^v̒̃foCX`́AΈ
  ΉƂĂȂ΂Ȃ܂B

  4.1.8.  CISTPL_CONFIG

  cistpl_config_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_config_t {
               u_char          last_idx;
               u_long          base;
               u_long          rmask[4];
               u_char          subtuples;
       } cistpl_config_t;

  last_idx ϐ́A\e[üԍŌ̍ڂ̃CfbNX
  ܂B base ϐ́AɂJ[h̍\񃌃WX^ւ̃It
  Zbg܂B rmask z͂ǂ̍\񃌃WX^݂̂
  rbg}XNłB rmask[0] ̃rbg 0 ́ACOR ɑΉArbg 1 
  CCSR ɑΉ...  ƂłBsubtuple ϐ́Aʏ̃^v
  eɑĉoCg̃^v݂邩AĂ܂B

  4.1.9.  CISTPL_CFTABLE_ENTRY

  cistpl_cftable_entry_t \̂̒`͎̂Ƃ:

  typedef struct cistpl_cftable_entry_t {
          u_char          index;
          u_char          flags;
          u_char          interface;
          cistpl_power_t  vcc, vpp1, vpp2;
          cistpl_timing_t timing;
          cistpl_io_t     io;
          cistpl_irq_t    irq;
          cistpl_mem_t    mem;
          u_char          subtuples;
  } cistpl_cftable_entry_t;

  CISTPL_CFTABLE_ENTRY \̂͂̃J[hɑ΂銮Sȓ샂[hLq
  Ă܂B̕ȗ\łBindex ϐ͂̓샂[hɂ
  Ă̍\CfbNX܂BJ[h Configuration Option
  Register ɂ̒lނƂł̃[hI邱Ƃł
  Bflags ϐɂ́A̒l`Ă܂:

     CISTPL_CFTABLE_DEFAULT
        ftH[g̍\e[u̍ڂł邱Ƃ܂B

     CISTPL_CFTABLE_BVDS
        ̐ݒ sփWX^  BVD1  BVD2 MĂ
        Ƃ܂B

     CISTPL_CFTABLE_WP
        ̐ݒ sփWX^  ݋֎~Ă邱
        ܂B

     CISTPL_CFTABLE_RDYBSY
        ̐ݒ sփWX^  Ready/Busy MĂ邱
        Ƃ܂B

     CISTPL_CFTABLE_MWAIT
        [ANZXɁAWAIT MgKv邱Ƃ܂B

     CISTPL_CFTABLE_AUDIO
        ̐ݒ̓I[fBIM𔭐AzXgVXẽXs[J[ɏo
        ͂邱Ƃł邱Ƃ܂B

     CISTPL_CFTABLE_READONLY
        ̐ݒł̓J[hɓǂ݂p̃̈悪݂邱Ƃ
        ܂B

     CISTPL_CFTABLE_PWRDOWN
        J[h\ƏԃWX^ ʂāAp[_E[hT|
        [gĂ邱Ƃ܂B

  cistpl_power_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_power_t {
               u_char          present;
               u_char          flags;
               u_long          param[7];
       } cistpl_power_t;

  present ϐ̓rbg}bv`ɂȂĂA̓dMɊւāAǂ
  p[^݂Ă邩A܂B̂悤ȃCfbNX`
  Ă܂:

     CISTPL_POWER_VNOM
        WIȓdd

     CISTPL_POWER_VMIN
        Œdd

     CISTPL_POWER_VMAX
        ōdd

     CISTPL_POWER_ISTATIC
        AKvȓdd

     CISTPL_POWER_IAVG
        1 bԂʂĕςő募d

     CISTPL_POWER_IPEAK
        10m bԂʂĕςő募d

     CISTPL_POWER_IDOWN
        p[_E[hŕKvȋd

  d 10 }CN{gPʁAd 100 imAyAPʂŕ\Ă
  ܂B

  cistpl_timing_t \̂̒`͎̂Ƃ:

       typedef cistpl_timing_t {
               u_long          wait, waitscale;
               u_long          ready, rdyscale;
               u_long          reserved, rsvscale;
       } cistpl_timing_t;

  ꂼ̎Ԃ̓imbƂlƁAړx搔\Ă܂B
  `ĂȂ(Unspecified) Ԃ̒l 0 łB

  cistpl_io_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_io_t {
               u_char          flags;
               int             nwin;
               struct {
                       u_long          base;
                       u_long          len;
               } win[CISTPL_IO_MAX_WIN;
       } cistpl_io_t;

  nwin  o͗̈̐܂Bꂼ̗̈͊AhX: baseA
  oCgPʂł̒: len ŋLq܂B flags ł́Â悤ȃrbg
  }bv`Ă܂:

     CISTPL_IO_LINES_MASK
        ̃J[hŃfR[ho̖͂{B

     CISTPL_IO_8BIT
        ̃J[h 16 rbg̓o̓WX^ɑ΂āAƗ 8 rb
        gANZXT|[gĂ邱ƂB

     CISTPL_IO_16BIT
        ̃J[h͓o̓WX^ɑ΂ 16 rbgANZXT|[g
        Ă邱ƂB

  cistpl_irq_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_irq_t {
               u_long          IRQInfo1;
               u_long          IRQInfo2;
       } cistpl_irq_t;

  IRQInfo1 ł͎̃rbg}bv`Ă܂:

     IRQ_MASK
        ̃J[hgׂ荞ݔԍB

     IRQ_NMI_ID, IRQ_IOCK_ID, IRQ_BERR_ID,
        IRQ_VEND_ID" IRQ_INFO2_VALID ZbgĂ鎞Ãrb
        g}bv͂ꂼ̓ꊄ荞݂̃J[hɊ蓖ĂĂ
        ǂB4̃tO͂ꂼA}XNs\A IO
        `FbNAoXG[Ax_[L̊荞݂Ӗ܂B

     IRQ_INFO2_VALID
        IRQInfo2 AꂽA荞ݔԍ܂ł邱Ƃ
        B

     IRQ_LEVEL_ID
        ̃J[h̓x荞݂T|[gĂ邱ƂB

     IRQ_PULSE_ID
        ̃J[h̓pX荞݂T|[gĂ邱ƂB

     IRQ_SHARE_ID
        ̃J[h͊荞݋LT|[gĂ邱ƂB

  IRQInfo1  0 ̏ꍇA荞݂Ɋւ݂͑ȂƂӖ
  B

  cistpl_mem_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_mem_t {
               u_char          nwin;
               struct {
                       u_long          len;
                       u_long          card_addr;
                       caddr_t         host_addr;
               } win[CISTPL_MEM_MAX_WIN;
       } cistpl_mem_t;

  nwin ̓̈̐Bꂼ̗̈́AJ[h̃Ԓ
  AhX: card_addrAzXg̃Ԓ̃AhX: host_addrAoCg
  Pʂł̒: len Œ`BzXgAhX 0 ̏ꍇÄ̈ʒu
  ͔C (arbitrary) ł邱ƂӖB

  4.1.10.  CISTPL_MANFID

  cistpl_manfid_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_manfid_t {
               u_short         manf;
               u_short         card;
       } cistpl_manfid_t;

  manf ϐ͂̃J[h̐Ǝ҂\܂B card ϐ͂ꂼ̃x
  _[ɂĒ`AJ[h̎ނƁAfʂł悤ɂȂ
  ΂Ȃ܂B

  4.1.11.  CISTPL_FUNCID

  cistpl_funcid_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_funcid_t {
               u_char          func;
               u_char          sysinit;
       } cistpl_funcid_t;

  func ϐ͂̃J[h̋@\\܂Bsysinit ϐ̓u[gɂ̃J
  [hǂ̂悤ɐݒ肳ׂrbg}bvtOŎĂ܂B

  ̋@\`Ă܂:

     CISTPL_FUNCID_MULTI
        }`t@NV(@\)J[h

     CISTPL_FUNCID_MEMORY
        PȃfoCX

     CISTPL_FUNCID_SERIAL
        VA|[g܂̓ffoCX

     CISTPL_FUNCID_PARALLEL
        p|[gfoCX

     CISTPL_FUNCID_FIXED
        ŒfBXNfoCX(n[hfBXNȂ)

     CISTPL_FUNCID_VIDEO
        rfIC^[tF[X

     CISTPL_FUNCID_NETWORK
        lbg[NA_v^

     CISTPL_FUNCID_AIMS
        @\̂eʋLu

  sysinit ł͎̃tO`Ă:

     CISTPL_SYSINIT_POST
        VXẽp[Iɂ̃J[h̐ݒ݂Kv
        ƂB

     CISTPL_SYSINIT_ROM
        ̃J[h́Au[gɐݒ肷Kv̂VXeg ROM 
        ł邱ƂB

  4.1.12.  CISTPL_DEVICE_GEO

  cistpl_device_geo_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_device_geo_t {
               int             ngeo;
               struct geo {
                       u_char          buswidth;
                       u_long          erase_block;
                       u_long          read_block;
                       u_long          write_block;
                       u_long          partition;
                       u_long          interleave;
               } geo[CISTPL_MAX_DEVICES];
       } cistpl_device_geo_t;

  erase_block, read_block, write_block ̑傫́Aꂼ buswidth 
  l interleave ̒l悶oCgPʂƂĕ\B partition
  ̑傫́Aerase_block ̑傫PʂƂĕ\B

  4.1.13.  CISTPL_VERS_2

  cistpl_vers_2_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_vers_2_t {
               u_char          vers;
               u_char          comply;
               u_short         dindex;
               u_char          vspec8, vspec9;
               u_char          nhdr;
               int             vendor, info;
               char            str[244];
       } cistpl_vers_2_t;

  vers ϐ͏ 0 łȂ΂Ȃ܂Bcomply ϐ͕Wւ̏̓x
  ܂A 0 łȂ΂Ȃ܂B dindex ϐ͈ʃ
  ̍ŏ̉oCg\񂳂Ă邩܂Bvspec8  vspec9 ϐ
  ɂ̓x_[L̏񂪊܂܂Ăꍇ܂Bnhdr ϐ͂̃J
  [hɂ CIS ̃Rs[݂Ă邩܂B str źA
  ̕܂ł܂: x_[̖OƁÃJ[hɂċLq
  ĂȂ炩̏łBx_[̕ւ̃ItZbg vendor 
  Ai̕ւ̃ItZbg info Ŏ܂B

  4.1.14.  CISTPL_ORG

  cistpl_org_t \̂̒`͎̂Ƃ:

       typedef struct cistpl_org_t {
               u_char          data_org;
               char            desc[30];

  ̃^v̓p[eBbṼf[^̍\`܂B
  data_org ɂ͎̒l`Ă܂:

     CISTPL_ORG_FS
        ̃p[eBbV̓t@CVXe܂ł܂B

     CISTPL_ORG_APPSPEC
        ̃p[eBbV̓AvP[VĽ`łB

     CISTPL_ORG_XIP
        ̃p[eBbV́ȕŎsv(Execute-In-Place)dlɏ]
        ܂B

  desc ϐɂ́Af[^̍\ɂĂ̕ɂLq܂܂Ă܂B

  4.2.  CIS \WX^

  PCMCIA WKíAJ[h̑ԒɁA̕WIȍ\
  񃌃WX^`Ă܂B̃WX^̂Aǂ̃WX^
  Ă邩́AJ[h CONFIG ^vɋLqĂ܂B̒
  `gKv̂vO͎CN[hKv܂:

       #include "cisreg.h"

  4.2.1.  Configuration Option Register

  ̃WX^ɏނƂɂāA\e[u̍ڂIAJ
  [h̓o͋@\g悤ɂȂ܂B

  ̃rbgϐ`Ă܂:

     COR_CONFIG_MASK
        \e[uCfbNX́AJ[ȟ݂̓샂[hw
        邱ƂB

     COR_LEVEL_REQ
        ̃J[h̓x(GbWgK[)荞݂𐶐邱Ƃ
        B̓ftH[głB

     COR_SOFT_RESET
        ̃rbgZbg邱ƂŁAu\tgvZbgs
        BJ[hZbgɂ́AhCo͂̃WX^ɒڂ
        ނ̂ł͂ȂAResetCard ĂяogׂłB

  4.2.2.  J[h̍\ƏԃWX^

  ̃rbgϐ`Ă܂:

     CCSR_INTR_ACK
        ̃rbgݒ肳ĂꍇACCSR_INTR_PENDING rbg͗zɃN
        A܂ŃZbgꂽ܂܂ɂȂ܂B

     CCSR_INTR_PENDING
        ̃J[h݊荞ݗvĂ邱ƂB̐M͊
        ݋LړIƂĎg邱Ƃ܂B

     CCSR_POWER_DOWN
        ̃rbgZbgƁAJ[hɑ΂ăp[_E[hɓ
        Ƃv܂B

     CCSR_AUDIO_ENA
        ̃rbgZbgƁAJ[h̃I[fBIo͂\ɂ܂B

     CCSR_IOIS8
        ̃rbgZbg邱ƂŁÃzXg 8 rbgo͂s
        ȂȂ̂ŁA16 rbg̓o͓͂ɕ 8 rbgo͂Ŏ
        s邱Ƃʒm܂B

     CCSR_SIGCHG_ENA
        ̃rbgZbg邱ƂŁAJ[h WP, READY, BVD1, BVD2 M
        ̕ωASIGCHG Mʂē`悤ɗv܂B

     CCSR_CHANGED
        ̃rbgZbg邱ƂŁAsփWX^̂ꂩ̃rb
        g̏ԂωƂzXgɒʒm܂B

  4.2.3.  sփWX^

  \Pbg/o̓[hœ삷鎞ɎgȂȂĂ܂(s
  ) M̃WX^̒̐MŒu邱Ƃł܂B (: s
  ȂȂĂ܂āA\PbgoRňoƂłȂȂ
  M\tgEGAIɂ̃WX^ʂēǂݏoƂłƂ
  ł傤) ̃WX^̒̐M̂ǂꂩωɂ͒ʏAJ[h
   SIGCHG MAT[gAhCo͂̃WX^ǂݏoƂŁA
  N̂m邱Ƃł܂B

  ̃rbgϐ`Ă܂:

     PRR_WP_STATUS
        ݐM݂̌̏ԁB

     PRR_READY_STATUS
        fBM݂̌̏ԁB

     PRR_BVD2_STATUS
        drxM݂̌̏ԁB

     PRR_BVD1_STATUS
        dr؂M݂̌̏ԁB

     PRR_WP_EVENT
        Ō PRR WX^ǂݏoĂA݋֎~Mω
        ƂB

     PRR_READY_EVENT
        Ō PRR WX^ǂݏoĂAfBMω
        B

     PRR_BVD2_EVENT
        Ō PRR WX^ǂݏoĂAdrxMω
        ƂB

     PRR_BVD1_EVENT
        Ō PRR WX^ǂݏoĂAdr؂Mω
        ƂB

  ̃WX^͏݂\łB̏ꍇɂ STATUS rbg̓}XN
  ċ@\܂B܂A STATUS rbgZbgĂꍇɂ́A
  ΉEVENT ̃rbg݂ɂčXV܂B

  4.2.4.  \PbgƃRs[WX^

  ̃WX^́A̓J[h͈͂̓o̓|[gL
  悤Ȑݒ\ɂ悤ȏꍇA̃foCX𐧌䂷 ISA
  oX̃J[hG~[gꍇɎg܂BႦ΁Aꖇ ISA n
  [hfBXNRg[́Ao̓|[gɃhCuԍނƂ
  ̃hCu𐧌䂷邱Ƃł܂B PCMCIA hCuJ[h
  ɂĂ̂悤ȃRg[G~[g邽߂ɂ́Aǂ̓o͑
  삪ǂɑ΂̂ł邩ʂł悤ɁAꂼ̃J[h
  ǂ̃hCuł邩umvKv܂B

  ̃rbgϐ`Ă܂:

     SCR_SOCKET_NUM
        J[ḧʒu\Pbgԍ\ĂKv܂B

     SCR_COPY_NUM
        ̓J[hVXeɑ݂鎞ɂ́A̕ϐ͂̃J
        [ĥǂł̂ʂ邽߂̓LȔԍɐݒ肳ĂK
        v܂B

  4.2.5.  gԃWX^

  ̃rbgϐ`Ă܂:

     ESR_REQ_ATTN_ENA
        ZbgƁAESR_REQ_ATTN rbgZbgꂽ
        CCSR_CHANGED rbgZbĝƓlɂǂĂԕω
        荞݂܂B

     ESR_REQ_ATTN
        f֒MƂȂǁAȂ炩̃J[hCxg
        Ƃ܂B

  5.  J[hT[rXCxg̈ɂ

  J[hT[rXCxg͂̏񌹂Ă܂B:

  o  J[h̏ԕύXʂ̃\PbghCo񍐂܂B

  o  J[hT[rXglדIȃCxg𔭐܂B

  o  AhoXhp[}l[Wg(APM) ̃CxgB

  o  ̑̃J[hT[rXNCAgCxgB

  \PbghCõCxg͊荞݋쓮܂̓|[Ôǂ炩Ƃ
  ܂B

  5.1.  Cxgnh̑

  J[hT[rXCxgFɁAꂼ̃NCA
  gCxgʒm󂯂Cxg}XN𒲍܂BJ[hT[rX
  ɃNCAgo^ꂽACxgnh̉(callback)֐w
  肵܂B̃nh͎̗lĂ܂B:

       int (*event_handler)(event_t event, int priority, event_callback_args_t *args);

  priority ϐ͒ʏ̃Cxgp CS_EVENT_PRI_LOW ṽC
  xgp CS_EVENT_PRI_HIGH Ȃ̂ݒ肵܂BD揇ʂ̃Cxg
  ̂ CS_EVENT_CARD_REMOVAL ݒ肵܂BNCAgCxgnh
  ͂̍D揇ʂ̃Cxgɏo邾J[hT[rX̃N
  CAgɒʒmo悤ɏ܂B

  event_callback_args_t \̂̒`͎̂Ƃ:

       typedef struct event_callback_args_t {
               client_handle_t         client_handle;
               void                    *info;
               void                    *mtdrequest;
               void                    *buffer;
               void                    *misc;
               void                    *client_data;
       } event_callback_args_t;

  client_handle o̓CxgɑΉ\Pbg̃NCAg̃nh
  ݒ肵܂B̕@̓hCo̃\PbgƌĂ
  ɗLvłBinfo ϐ͌ł ResetCard ֓nďȍIԂ
  ̂Ɏg邾łBclient_data ϐ͊YfoCXƊ֘A郍
  [Jȃf[^\̂ŵɃhCog܂B̕ϐ͎gĂ
  ܂B

  5.2.  Cxg̐

     CS_EVENT_CARD_INSERTION
        J[h}ꂽ\CxgMBhCogp̃\Pb
        gɌĂꍇ́AJ[hT[rX̓hCoɐlדIɑ}
        Cxg𑗏o܂B

     CS_EVENT_CARD_REMOVAL
        J[hꂽ\CxgMB̃Cxg̓J[hT[r
        XSẴNCAgɉ\Ȍ葬ʒmׂɍŏ̒x
        Ŏ舵܂B

     CS_EVENT_BATTERY_LOW
        ``drs''Ԃɕω\CxgMB

     CS_EVENT_BATTERY_DEAD
        ``dr؂''Ԃɕω\CxgMB

     CS_EVENT_READY_CHANGE
        ``''Ԃɕω\CxgMB

     CS_EVENT_WRITE_PROTECT
        ``݋֎~''Ԃɕω\CxgMB

     CS_EVENT_REGISTRATION_COMPLETE
        RegisterClient ̌ĂяoɃhCoɑCxgB

     CS_EVENT_RESET_REQUEST
        NCAg ResetCard Ă񂾎ɑCxgBCxgn
        h͌Ăяos烊Zbgۂł܂B

     CS_EVENT_RESET_PHYSICAL
        ZbgMJ[hɑ钼OɑSẴNCAgɑ܂B

     CS_EVENT_CARD_RESET
        Zbg삪I瑗CxgMBZbg
        s GetStatus gpĔF܂B

     CS_EVENT_RESET_COMPLETE
        ResetCard ĂŃZbg̊ƂNCAgɒʒm
        CxgB

     CS_EVENT_PM_SUSPEND
        J[hT[rX[Ȕ܂ APM TXyhv
        \CxgMBCxgnh͌Ăяos
        TXyhۂł܂B

     CS_EVENT_PM_RESUME
        TXyh/W[߂̌ŃVXe~Ƃ\M
        B

     CS_EVENT_MTD_REQUEST
        MTD ̏Ɏg܂Bv̎ނ callback 
        mtdrequest ϐ̒ɓn܂BzXg̃obt@AhX
        buffer ϐɓn܂B

     CS_EVENT_ERASE_COMPLETE
        L[ɓꂽ삪INCAgɒʒm̂Ɏg
        p܂BL[ւ̃|C^ callback  info ϐɕ
        ܂B

  5.3.  NCAghCõCxg̖ɂ

  NCAghCo̓\Pbgݒ肳ꂽꂽɂĔ
   CS_EVENT_CARD_INSERTION Cxg CS_EVENT_CARD_REMOVAL Cxg
  ܂B]ăJ[h͍̏Dx̃CxgȂ̂ŃhCo͑
  Ƀ\PbgƂ̓o͂ՒfAdevice \̂ɃtOݒ肵Ȃ
  SĂ̏Ŕ鎞Ԋ荞݂gpĒ~悤ɗ\ɑg
  ݂܂B

  CS_EVENT_PM_RESET_REQUEST Cxg󂯎́AhCo͓o͂
  ՒfbN\Pbg̐ݒAhCo̓\Pbg̐ݒƎՒf
  O̓o͂i[܂BCS_EVENT_CARD_RESET 󂯎́AhCo
  \i[o͂̕܂B

  o͂Ւfꂩ\Pbg̍\ꂽꍇ
  CS_EVENT_PM_SUSPEND Cxg͑ CS_EVENT_PM_RESET_REQUEST Cxg
  ̂悤Ɉ܂B CS_EVENT_PM_RESUME Cxg󂯎̓hC
  oJ[h̍Đݒ̏oĂꍇāACS_EVENT_CARD_RESET
  Cxg󂯎ƓlłB

  6.  eNmWhCo

  eNmWhCo (``MTD'') ́ÃfoCXł܂
  ܂ȃT[rX邽߂ɁAJ[hT[rXgp܂B MTD
  ́ARegisterClient ĂяoāAʏ̃J[hT[rX̃NCAg
  ēo^Ȃ΂Ȃ܂BJ[h}̃Cxg󂯎AǗ
  郁͈̔͂m邽߂ɁAGetFirstRegion  GetNextRegion Ăяo
  ܂BARegisterMTD gĂ͈̔͂𐧌䂵܂BMTD
  ̓ǂݏoA݁A̗v́AJ[hT[rXɂ
  CS_EVENT_MTD_REQUEST ɃpbP[WAMTD ̃Cxgnhɓn
  ď܂B

  6.1.  MTD v̏

  MTD ́AJ[hT[rX̗v CS_EVENT_MTD_REQUEST CxgƂ
  󂯎܂BJ[hT[rX́Av̓eCxgR[obN̈
   mtdrequest ϐɓēn܂Bf[^zXgƎ󂯓nv
  ɂẮAzXg̃obt@̃AhX buffer ϐɓn܂B

  mtd_request_t \̂̒`͎̂Ƃ:

       typedef struct mtd_request_t {
               u_long          SrcCardOffset;
               u_long          DestCardOffset;
               u_long          TransferLength;
               u_long          Function;
               u_long          MediaID;
               u_long          Status;
               u_long          Timeout;
       } mtd_request_t;

  Function ̕ϐ̓rbg}bvŁA̗vŎs铮Ă
  B

     MTD_REQ_ACTION
        MTD_REQ_ERASE, MTD_REQ_READ, MTD_REQ_WRITE, MTD_REQ_COPY ̂
        ꂩB

     MTD_REQ_NOERASE
        ubN̋EƑ傫ɂ҂͂܂悤ȏ݃R}ĥ
        AsvȂƂ܂B

     MTD_REQ_VERIFY
        ݊mF(verify) w肵܂B

     MTD_REQ_READY
        ̗vAO̗vJ[hԂ܂ŉꂽ
        Ďsł邱Ƃ܂B

     MTD_REQ_TIMEOUT
        ̗vAO̗vԐ؂ŉꂽ̍Ďsł邱
        ܂B

     MTD_REQ_FIRST
        ̗vAA̗v̍ŏ̂̂ł邱Ƃ܂B

     MTD_REQ_LAST
        ̗vAA̗v̍Ō̂̂ł邱Ƃ܂B

     MTD_REQ_KERNEL
        ǂݏR}h̃zXgobt@A[UłȂJ[l
        ɂ邱Ƃ܂B

  MediaID ϐ́Ã͈͂\킷߂ RegisterMTD v̒Ŏw
  肳ꂽlłBStatus ϐ́AfoCX炩̏sŗv
  邱ƂłȂƂ\킷߂ MTD g܂BMTD v
  ́Aʏ͕܂Bvʏ͕悤ȏꍇłAۂɂ͕
  AG[R[hƂ CS_BUSY ԂAStatus Ɏ̂ꂩ̒l
  ݒ肷͂łB󒍁Fuv́ublockv̖łBuv̈Ӗ
  uubNv (uf[^ubNvȂ) Ƃ̍邽߂ɎgĂ
  BgpFFË{FEcWuIy[eBOVXe̊TOv
  (1987NE{)

     MTD_WAITREQ
        ݎs̕ʂ̗v̏IɁAvĎsׂ
        ł邱Ƃ܂B

     MTD_WAITTIMER
        timeout ϐŎ鎞Ԃo߂ɁAvpׂł
        Ƃ܂B

     MTD_WAITRDY
        J[hԂɂȂ邩C邢 timeout ϐŎ鎞
        Ԃo߂邩Aǂ炩ɋNɁAvpׂł
        Ƃ܂B

     MTD_WAITPOWER
        \Pbg̓d̋ɉe鉽NɁAvĎs
        ׂł邱Ƃ܂B

  MTD_WAITTIMER  MTD_WAITRDY ł́ATimeout ϐ̒l̓~bPʂ̃^C
  AEg̎ԂłB

  6.2.  MTD x֐

  MTD ̓J[hT[rXv̂ŁAMTD ̃Cxgnh
  SɎsłJ[hT[rXĂяo̎ނɂ͐邩
  ܂B MTD ̎x֐́AMTD KvƂ邩Ȃʏ̃J[
  hT[rXĂяogĎƂƈɂł낤ʂȃT[
  rXA肳ꂽZbgƂĒ񋟂܂B Linux ɂ PCMCIA ̎
  ł́AقƂǂ̃J[hT[rXĂяo MTD SɌĂяo
  ł܂A݊̂߂ MTD ̎xC^[tFCX܂܂Ă
  B

  #include "cs_types.h"
  #include "cs.h"
  #include "bulkmem.h"

  int MTDHelperEntry(int subfunc, void *arg1, void *arg2);

  6.2.1.  MTDRequestWindow, MTDReleaseWindow

       int MTDHelperEntry(MTDRequestWindow, client_handle_t *handle, win_req_t *mod);
       int MTDHelperEntry(MTDReleaseWindow, window_handle_t handle);

  These services are identical to the standard Card Services
  RequestWindow and ReleaseWindow calls.

  6.2.2.  MTDModifyWindow

       int MTDHelperEntry(MTDModifyWindow, memory_handle_t handle, mtd_mod_req_t *mod);

  mtd_mod_req_t ̍\͎̂̂Ƃ:

       typedef struct mtd_mod_req_t {
               u_long          Attributes;
               u_long          AccessSpeed;
               u_long          CardOffset;
       } mtd_mod_req_t;

  MTDModifyWindow ́Aʏ ModifyWindow  MapMemPage ̌ďog
  Ɩ{IɓłB

  Attributes Ŏwłê͎ƂB:

     WIN_MEMORY_TYPE
        WIN_MEMORY_TYPE_CM ňʃA܂
        WIN_MEMORY_TYPE_AM ő܂B

     WIN_USE_WAIT
        Rg[J[h MWAIT MĎKv邱Ƃ
        ܂B

  MTDModifyWindow Őݒ肳ꂽ̈͏Ɏgp\łA16 rbg̃f[
  ^܂B

  ߂l :

     CS_BAD_HANDLE
        nhsłB

  6.2.3.  MTDSetVpp

       int MTDHelperEntry(MTDSetVpp, client_handle_t client, mtd_vpp_req_t *req);

       typedef struct mtd_vpp_req_t {
               u_char          Vpp1, Vpp2;
       } mtd_vpp_req_t;

  MTDSetVpp ̓\Pbg̃vOdύX܂BVpp1  Vpp2  1/10
  {gPʂŗ^܂B݂̂ƂAVpp1  Vpp2 ͏ɓȂ
  ΂Ȃ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhsłB

     CS_BAD_VPP
        w肳ꂽ Vpp ȂA܂ Vpp1  Vpp2 
        B

  6.2.4.  MTDRDYMask

       int MTDHelperEntry(MTDRDYMask, client_handle_t client, mtd_rdy_req_t *req);

       typedef struct mtd_rdy_req_t {
               u_long          Mask;
       } mtd_rdy_req_t;

  MTDRDYMask ́ACS_EVENT_READY_CHANGE Cxggpł悤ɂ邩
  ǂI܂BNCAǵARegisterClient  SetEventMask
  ̂ꂩ̌ďogāAJ[hT[rXɑ΂ẴCxg
  邱Ƃ\ĂȂ΂Ȃ܂BMask 
  CS_EVENT_READY_CHANGE rbgZbgĂƁACxg̕ύXł
  悤ɂȂ܂B

  ߂l :

     CS_BAD_HANDLE
        NCAgnhsłB

  7.  hCoT[rXC^tF[X

  hCoT[rX́AJ[hT[rX̃NCAghCo cardmgr 
  悤ȃ[U[h̃eBeBѕt܂BJ[hT[rX́uX[
  pNCAgvƂĂ悢ł傤BhCoT[rX́A
  BindDevice ֐gāÃNCAghCoꂼ PCMCIA
  J[hƌѕt܂B̃NCAgƂ͈قȂAhCoT[rX́A
  J[h̔sĂAƑS̃\PbgɍSꂽ܂܎c
  ܂B

  7.1.  ̃NCAghCoւ̃C^tF[X

  hCoT[rX́AĂă\PbgɌłԂɂȂĂ
  ׂẴNCAghCocĂ܂BNCAghCo
  ́AfoCX́úv̍쐬ƍ폜邽߂̍ڂȂ΂Ȃ܂
  BŌfoCX̎̂Ƃ́A PCMCIA J[h𐧌䂷邽߂ɕK
  vȂׂĂӖ܂B

  efoCX́Acs_types.h ɒ`ꂽʂȌ^ dev_info_t Aj
  [N1 6 ̃^OŎʂ܂BefoCX̎̂́A dev_link_t \
  ̂ŋLq܂B

  7.1.1.  dev_link_t \

  dev_link_t ̃f[^\͎̂̂Ƃ:

       #include "ds.h"

       typedef struct dev_node_t {
               char                    dev_name[8];
               u_char                  major, minor;
               struct dev_node_t       *next;
       }

       typedef struct dev_link_t {
               dev_node_t              *dev;
               u_long                  state, open;
               struct wait_queue       *pending
               struct timer_list       release
               client_handle_t         handle;
               io_req_t                io;
               irq_req_t               irq;
               config_req_t            conf;
               window_handle_t         win;
               void                    *priv;
               struct dev_link_t       *next;
       } dev_link_t;

  dev_link_t \̂ dev ϐ̓NXg dev_node_t \̂|C
  gĂ܂Bdev_node_t  dev_name ϐ́AhCoɂāÃf
  oCXANZX邽߂̃t@C܂܂(\ȏꍇ̂)B
  Ⴆ΁Aserial_cs ́uttyS1v̗lȖOg܂Bmajor  minor ̕
  ́ÃfoCXANZX邽߂̃W[ԍƃ}Ci[ԍłB
  hCoT[rX́A̕ϐ DS_GET_DEVICE_INFO ioctl Ń[U
  [hvOɕԂ܂B

  dev_link_t  state ϐ́Ã݂foCX̏Ԃc邽߂Ɏg
  ܂B̃tO`Ă܂B:

     DEV_PRESENT
        J[h݂邱Ƃ܂B̃rbǵAhCõCxg
        nhɂāAJ[h̔̃CxgɑΉăZbg܂
        NA܂B

     DEV_CONFIG
        J[hݒς݂ł邱Ƃ܂B

     DEV_CONFIG_PENDING
        J[h̐ݒƂsł邱Ƃ܂B

     DEV_SUSPEND
        J[hꎞIɎgpłȂƂ܂B

     DEV_BUSY
        o͓삪sł邱Ƃ܂B̃rbǵAANZX
        Փ˂h߂̃C^[bNƂĎgƂł܂B

     DEV_STALE_CONFIG
        hCoɂẮAs̃J[hꂽɂ́ÃJ[h
        Ή邷ׂẴfoCX܂ł́A\Pbgׂł
        ܂B̃tÓAfoCXNɃ\Pbg
        Ȃ΂ȂȂƂ܂B

     DEV_STALE_LINK
        hCo̎̂́ÂׂĂ PCMCIA \[X܂ō
        Ă͂Ȃ܂B̃tÓA\Pbgꂽ炷
        hCo̎̂폜Ȃ΂ȂȂƂ܂B

  open ϐ́ÃfoCXdɎgĂ邩𐔂܂BfoCX
  ́ÃJEg[ɂȂ܂ŉĂ͂Ȃ܂B pending ϐ
  ́ÃfoCXg߂ɑ҂ĂvZX̑҂sǗ邽
  ɎgƂł܂B

  release ϐ́AJ[hꂽɁAfoCX̃Vbg_E\
  ɓ邽߂Ɏg܂BJ[ḧ̃Cxg͍DxŎs
  Ȃ΂Ȃ܂BhCõCxgnh́AʏfoCX
   DEV_PRESENT rbgZbgA̎Vbg_EŎs
  悤ɗ\肷邱ƂŃCWFNg̏܂B

  handleAioAirqAconf win ̊eϐ́Aʏ PCMCIA o̓J[h
  gݍނ߂ɕKvȕʂ PCMCIA f[^\ɑΉ܂B

  priv ϐ́AfoCXǗ邽߂ɕKvȂǂȎIȃf[^\̖
  Î߂ɂłgƂł܂Bnext ϐ́A̎̂Ƃ
  łhCoŁAdev_link_t \̂̌Xg邽߂ɎgƂ
  ł܂B

  7.1.2.  register_pcmcia_driver

       int register_pcmcia_driver(dev_info_t *dev_info,
                                  dev_link_t *(*attach)(void),
                                  void (*detach)(dev_link_t *));

  register_pcmcia_driver ́AhCoT[rXɁANCAghCo
  ݂Ăă\PbgɌѕtԂł邱Ƃm点܂BhC
  oT[rX̃hCo dev_info ɓ DS_BIND_REQUEST
  ioctl 󂯎ƁAhCoT[rX̓hCo attach() ֐Ăяo
  ܂BDS_UNBIND_REQU EST ioctl 󂯎Ƃ́Adetach() Ăяo
  ܂B

  7.1.3.  unregister_pcmcia_driver

       int unregister_pcmcia_driver(dev_info_t *dev_info);

  ̊֐́AhCoT[rXɁAw肳ꂽNCAghCoɂ̓\
  PbgѕtĂ͂ȂȂƂm点܂B

  7.2.  [U[h PCMCIA eBeBƂ̃C^tF[X

  hCoT[rX́A[U[h PCMCIA eBeBƒʐM邽߂
  ^foCX܂B̃foCX̃W[ԍ͓IɑI
  APCMCIA eBeB /proc/devices ǂł̒l𓾂Ȃ΂Ȃ
  ܂B}Ci[ԍ 0 n܂\Pbg̔ԍɑΉ܂B

  ̃vZXA\PbgǏ̂߂ɃI[v邱
  ł܂B̃vZX́AǏop[hł̂݁Ã\PbgI[
  vł܂BǏô݂̐ڑł́Aꕔ ioctl @\g܂B
  Ǐ̐ڑł́AׂĂ ioctl @\gAJ[hT[rX
  Cxg̒ʒm󂯎邱Ƃł܂B

  7.2.1.  J[hT[rX̃Cxgʒm

  hCoT[rX́ACxg̒ʒm̂߂ read()  select() ̊֐
  Ă܂B PCMCIA foCXǏosƁAO read()
  ȍ~hCoT[rXMׂẴCxg unsigned long ̒l
  ĕԂ܂BCxgĂȂ΁ACxg
  ܂ŁAďo͕܂Bselect() gāÃ\Pbg̐VK
  CxgĎ邱Ƃł܂B

  hCoT[rX́ÃCxgĎ܂B:
  CS_EVENT_CARD_INSERTION, CS_EVENT_CARD_REMOVAL,
  CS_EVENT_RESET_PHYSICAL, CS_EVENT_CARD_RESET 
  CS_EVENT_RESET_COMPLETE.

  7.2.2.  ioctl ̐

  قƂǂ̃hCoT[rX ioctl ̓́AJ[hT[rX̊֐ɒ
  ڑΉ܂Bioctl ̌ďóǍ`łB:

       int ioctl(int fd, int cmd, ds_ioctl_arg_t *arg);

  ds_ioctl_arg_t ̍\͎̂̂Ƃ:

       typedef union ds_ioctl_arg_t {
               servinfo_t      servinfo;
               adjust_t        adjust;
               config_info_t   config;
               tuple_t         tuple;
               tuple_parse_t   tuple_parse;
               client_req_t    client_req;
               status_t        status;
               conf_reg_t      conf_reg;
               cisinfo_t       cisinfo;
               region_info_t   region;
               bind_info_t     bind_info;
               mtd_info_t      mtd_info;
       } ds_ioctl_arg_t;

   ioctl ̃R}h́AΉJ[hT[rX̊֐s܂B:

     DS_GET_CARD_SERVICES_INFO
        CardServices(GetCardServicesInfo, ..., &arg->servinfo) Ăяo
        ܂B

     DS_ADJUST_RESOURCE_INFO
        CardServices(AdjustResourceInfo, ..., &arg->adjust) Ăяo
        B

     DS_GET_CONFIGURATION_INFO
        CardServices(GetConfigurationInfo, ..., &arg->config) Ăяo
        ܂B

     DS_GET_FIRST_TUPLE
        CardServices(GetFirstTuple, ..., &arg->tuple) Ăяo܂B

     DS_GET_NEXT_TUPLE
        CardServices(GetNextTuple, ..., &arg->tuple) Ăяo܂B

     DS_GET_TUPLE_DATA
        CardServices(GetTupleData, ..., &arg->tuple_parse.tuple) Ă
        o܂B^vf[^ arg->tuple_parse.data ̒ɕԂ܂B

     DS_PARSE_TUPLE
        CardServices(ParseTuple, ..., &arg->tuple_parse.tuple,
        &arg->tuple_parse.parse) Ăяo܂B

     DS_RESET_CARD
        CardServices(ResetCard, ...) Ăяo܂B

     DS_GET_STATUS
        CardServices(GetStatus, ..., &arg->status) Ăяo܂B

     DS_ACCESS_CONFIGURATION_REGISTER
        CardServices(AccessConfigurationRegister, ..., &arg->conf_reg)
        Ăяo܂B

     DS_VALIDATE_CIS
        CardServices(ValidateCIS, ..., &arg->cisinfo) Ăяo܂B

     DS_SUSPEND_CARD
        CardServices(SuspendCard, ...) Ăяo܂B

     DS_RESUME_CARD
        CardServices(ResumeCard, ...) Ăяo܂B

     DS_EJECT_CARD
        CardServices(EjectCard, ...) Ăяo܂B

     DS_INSERT_CARD
        CardServices(InsertCard, ...) Ăяo܂B

     DS_GET_FIRST_REGION
        CardServices(GetFirstRegion, ..., &arg->region) Ăяo܂B

     DS_GET_NEXT_REGION
        CardServices(GetNextRegion, ..., &arg->region) Ăяo܂B

   ioctl ̃R}h́AʂȃhCoT[rX̊֐Ăяo܂B
  ̃R}h́Abind_info_t \̂ɍp܂B:

       typedef struct bind_info_t {
               dev_info_t              dev_info;
               u_char                  function;
               struct dev_info_t       *instance;
               char                    name[8];
               u_char                  major, minor;
               void                    *next;
       } bind_info_t;

     DS_BIND_REQUEST
        ̃R}h́A\PbgNCAghCoɐڑ܂Bw
        ꂽfoCXʎq dev_info Ao^ꂽhCõXg
        猟܂B̃J[h@\J[h̏ꍇ́A function
        ϐǂ̃J[h@\ڑ邩w肵܂BhCo
        ƁAhCo͂̃\PbgƋ@\A BindDevice Ăяo
        ƂɂĐڑ܂B̌AhCoT[rX̓hCo
        attach() ڂĂяoăfoCX̎̂쐬܂BV
        dev_link_t  instance ̒ɕԂ܂B

     DS_GET_DEVICE_INFO
        ̃R}h́Ainstance w dev_link_t \̂A
        dev_nameAmajorA minor ̍ڂ܂B

     DS_UNBIND_REQUEST
        ̃R}h̓hCo instance w肵 detach() ֐Ă
        oăfoCXVbg_E܂B

  Ō DS_BIND_MTD v́A mtd_info_t ̌^Ƃ܂B:

       typedef struct mtd_info_t {
               dev_info_t      dev_info;
               u_long          Attributes;
               u_long          CardOffset;
       } mtd_info_t;

  ̌ĂяóAdev_info ɂĎʂ MTD  Attributes 
  CardOffset ɂċLq郁͈͂֘AÂ܂B Attributes 
  CardOffset ́AJ[hT[rX BindMTD ̌ďôƂƓӖłB
  8.  J[hT[rXNCAghCỏU

  Linux PCMCIA pbP[Ŵꂼ̔ł́AŏVKɃhCo
  悤ɗǂꂽ``^''̃NCAghCoƈꏏɒ񋟂
  ܂B modules/skeleton.c ɒuĂ܂B

  8.1.  W[̏ƃZbg

  SẴ[_uW[ init_module()  cleanup_module() ֐
  Ȃ΂܂B̓W[𒅒EƂɃW[x
  vOKvƂ邩łBPCMCIA NCAghCȍ
  ֐ register_pcmcia_driver() ĂяooRŃhCoT[rX
  ăhCoo^܂Bď(cleanup) ֐
  unregister_pcmcia_driver() gpăhCoT[rXɂēo^
  ܂BhCoɂẮAď֐̓Vbg_Eɑ݂f
  oCX̍\ׂ̂ɂĂ΂邩܂B

  8.2.  *_attach()  *_detach() ֐

  *_attach() ֐̓hCo ``'' 쐬A1 PCMCIA J[h̊
  ɕKvȃf[^\̂̐ݒsȂڂ܂B*_attach() ֐
  dev_link_t \̂̊蓖ĂƏsȂARegisterClient Ăяo
  ăJ[hT[rXƂ̌m܂BRegisterClient ͐Vo
  dev_link_t \̂ւ̃|C^ԂA쐬łȂ NULL Ԃ
  ܂B

  *_detach() ֐͈ȑOɔs *_attach 쐬hCo̎̂
  ܂B܂AJ[hT[rXƂ̌ DeregisterClient gĉ
  ܂B

  *_attach() ֐ DS_BIND_REQUEST ioctl() ňvhCoʂ
  At܂ɃhCoT[rXɂČĂ΂܂B
  *_detach() ֐ DS_UNBIND_REQUEST ioctl() ĂԂƂɉN
  B

  8.3.  *_config()  *_release() ֐

  *_config() ֐̓J[hɑ΂oׂ͂̏̈ɌĂ΂܂Bwǂ
  hCo͏ڍׂȏ̓J[hgǂݏo܂Aǂ̂悤ɃfoCX
  ݒ肷邩̍ŏ̒m̓hCoɑgݍ܂Ă܂BႦ΁AV
  AJ[h̃hCo̓J[h CFTABLE_ENTRY ^vvo
  |[g̊AhXƈvݒwWǂݍ݂܂A CIS ̊
  ݏ͖܂B*_config ֐̓J[h CIS ̊֘A镔
  ܂B RequestIO, RequestIRQ  RequestWindow Ăяo܂B
  ꂩ RequestConfiguration Ăт܂B

  J[h̐ݒ肪܂A*_config() [` dev_link_t \
   dev_name, major  minor ϐɏ݂܂B̕ϐ
  DS_GET_DEVICE_INFO ioctl () ̉ƂăhCoT[rX[UvO
  ɕԂ܂B

  *_release() ֐͈ȑOɌĂ *_config() 蓖Ă\[X
  AfoCX dev_name ϐ󔒂ɂ܂B

  *_config()  *_release ֐͒ʏJ[hԂ̕ύXCxg܂̓^C}
  [荞݂ɔČĂ΂܂B̎Å֐̓X[vo
  ÃJ[l֐Ă΂Ȃ悤ɎՒfĂ܂B

  8.4.  PCMCIA Cxgnh

  *_event() ֐̓J[hT[rXJ[hԎύXCxgʒm
  ɌĂ΂܂B

  8.5.  bNƓɂ

  ݒ肵\Pbg͑SĂ̊֘AfoCXꂽɂ̂݉
  B\Pbg̉̓\Pbg̃VXe𑼂̃foCXŎgpo
  ɂ܂Bꂽ̃foCXœo͂ɎgpĂꍇ́A
  ̃hCo͐VfoCXgpĂ܂B

  hCo͈̎̂v\Pbg̍\ꂽ̂݉܂B
  J[hT[rX DeregisterClient ׂɂ̓NCAg炩
  Ɋ蓖ĂKv܂B

  SẴ[_uW[͈SɃW[鎞ɃVXeg
  p ``gp(use count)'' Ă܂BPCMCIA NCAgh
  Co̊K̓foCXI[vƎgp񐔂𑝉AfoCXN
  [YƎgp񐔂܂B]ăhCoɂ͑SĂ̊
  AfoCX͕ĂKv܂BɁA\PbgڑĂ
  ɃhCoo܂BW[ďvO͓K؂ȉ
  Ɋς݂̎KvƂ܂B͎gp񐔂[ŁASẴf
  oCXĂāA܂SẴ\PbgłԂőSẴfoC
  XOꍇɈSȕ@łB

  foCXJĂԂ *_release() ֐Ă΂ꂽAfoCX
   DEV_STALE_CONFIG tOݒ肳 close() ֐Ă΂ꂽɃfoC
  X悤ɒʒm܂B\foCX*_detach() ֐ŌĂ
  oADEV_STALE_LINK tO *_release() ֐Ă΂ꂽɎ̂
  悤ɒʒm悤ɐݒ肳܂B

  8.6.  L Linux ̃hCo PCMCIA foCXANZX@

  ݂ PCMCIA NCAghCo͌L Linux ̃hCofoCX
  ̓o͑sȂ܂BJ[hT[rXNCAgW[̓J[h
  ̍\ƃJ[hԂ̕ύXCxg̊ĎsȂ܂Aʏ ISA oX
  ̃J[h̃hCoƌ݊̂o͂sȂ܂B̏ꍇ
  ́Aʂ̃hCoύXɎgo܂BȂA
  p[}l[Wĝ悤 PCMCIA ̋@\ׂ͂Ă̓T|[gĂ
  ܂̂ŁAPCMCIA NCAgvOƃfoCXo̓vO
  ԂŒʐMKv܂B

  wǂ̃hCo̓u[gɃfoCXTm̂ƒEofoCX
  悤ɐ݌vĂ܂BhCõW[̕p͒ʏ풅E
  \ȃfoCX̂ɃW[hCo͊ȒPɎ󂯓
  ƂłB

  dvȎ́AK؂łȂɃfoCX苎Ă܂foCXhCo
  gȂȂ鎖łBőP̕@̓hCoo͑o͊荞݂
  sȂOɃfoCXOɊmF鎖łBfoCX̏Ԃ̊mF̌JԂ
  ͎Ԑ؂ɂȂĂ܂AǃfoCXȂꍇ͏I܂B

  9.  Ȃ͂ǂɂ邩H

  Michael Johnson  Linux J[lnbJ[̎ (Linux Kernel
  Hackers' Guide)  Linux ̃foCXhCoׂ̗ǂʓIȏ
  łBʂ Linux  FTP TCgɂ܂Ƃ߂ꂽ Linux ƂƂɂ
  Ă܂B

  { PCMCIA W PCMCIA ꎩgsĂ܂rȂ
  łBV PC Card 95 W 399 hłÂ 2.1 W͂Ȃ
  loƎv܂B

       Personal Computer Memory Card International Association
       1030 East Duane Avenue, Suite G
       Sunnyvale, CA 94086 USA
       (408) 720-0107, (408) 720-9416 FAX, (408) 720-9388 BBS
       http://www.pc-card.com

  ̑Michael Mori  PCMCIA J҂̎ (PCMCIA
  Developer's Guide)  Sycard Technology 甭sA ISBN
  0-9640342-1-2 ŁA悻 89.95 hłB

       Sycard Technology
       1180-F Miraloma Way
       Sunnyvale, CA 94086 USA
       (408) 749-0130, (408) 749-1323 FAX

  Dana Beatty, Steven Kipisz  Brian Moore  PCMCIA \tgEFA
  J҂̃nhubN (PCMCIA Software Developer's Handbook) PCMCIA
  W̊TvƃNCAghCȍ̐Ă܂B
  ALinux PCMCIA vO}̎t^ɓYtĂ܂Bs
  Peer-to-Peer Communications  ISBN 1-57398-010-2 łB

  Larry Levine ͂ʓI PCMCIA ւ̏Љł 1995 N̉ĂɏX
  ɕ PCMCIA (PCMCIA Primer)Ă܂B M & T Books o
  AISBN 1-55828-437-0 łB

  e PCMCIA 䑕uɊւvO͊Y`bvx_[
  񂹂܂傤BF

       Intel Corporation
       (800) 628-8686

       Cirrus Logic
       (510) 623-8300

       Vadem
       (408) 943-9301

       Databook Inc.
       (716) 889-4204

  [EOF]

