








		      Linux ׫дʽʹ I/O 

		 : Riku Saikkonen <Riku.Saikkonen@hut.fi>

		   : Da-Wei Chiang <dawei@sinica.edu.tw>

	      v, 28 December 1997 : 22 Jul. - 1 Aug. 1998



				   Abstract

     ĵ˵ Intel x86 ܹʹģʽ (user-mode)
     ׫дʽʹӲ I/O ԼȴһСεʱ.



1.  

ĵ˵ Intel x86 ܹʹģʽ (user-mode)
׫дʽʹӲ I/O ԼȴһСεʱ. Դһƪǳ̵
IO-Port mini-HOWTO 뱾ͬ.

 1995-1997 İȨ Riku Saikkonen . Ȩҳ Linux HOWTO
copyright1 .

Աκָ̲Ǵݲ, ӭŸ (Riku.Saikko
nen@hut.fi)...

Ķǰһηеİ汾 (Mar 30 1997) µ:

     inb_p/outb_p Ͳλַ 0x80 ֮Ĺϵ˳.

    ɾ˹ udelay() ʽ, Ϊ nanosleep() ʽ
     ṩ˱Ƚȷʹ÷.

    ת Linuxdoc-SGML ʽ, Щı.

    ԺܶطЩĲ.


2.   C ʹ I/O 

2.1  ķ

ȡ I/O ĳʽ (Routine) ڵ /usr/include/asm/io.h 
(ںԭʼʽ linux/include/asm-i386/io.h ).
ЩʽԵо޼ (inline macros) ķʽдɵ, ʹʱֻҪ #include
<asm/io.h> ķʽþ͹; Ҫκκʽ (libraries).

____________________

1. <URL:http://sunsite.unc.edu/pub/Linux/docs/HOWTO/COPYRIGHT>

 Linux ׫дʽʹ I/O 					      1





 Linux ׫дʽʹ I/O 					      2



ע: ʽ(Routine) ָͨϵͳ(System Call)뺯ʽ(Function)ܳ.

Ϊ gcc (ٳ 2.7.2.3 ǰİ汾) Լ egcs (еİ汾) ,
ڱκʹõЩʽԭʼʱ  ѻѡ (gcc -O1
ϸ߲ε),  #include <asm/io.h> ǰʹ #define extern 
extern ɿհ.

Ϊ˳Ŀ, ʱʹ gcc -g -O (ڵ gcc 汾),
ѻ֮ʱܻó (debugger) Ϊе.
״Ǹ, Խʹõ I/O
ĳʽзһﲢֻڱõʱѻѡ.

ȡκ I/O ֮ǰ, ĳʽȨ. ҪĿ
ĳʽһʼĵط (Ҫκ I/O ȡ֮ǰ)  ioperm()
ʽ (úʽ춵 unistd.h , ұ ). ʹ﷨ iop
erm(from, num, turn_on),  from ǵһȡ I/O λַ, num
ǽȡ I/O λַĿ. , ioperm(0x300, 5, 1)
˼˵ȡ 0x300  0x304 (һλַ).
һһִֵָǷ ʽȡ I/O Ȩ (true (1))
ǳȥȡȨ (false (0)).  Զκкʽ ioperm()
ԱʹöĲλַ. ﷨ϸ ο ioperm(2) ʹ˵ļ.

ĳʽӵ root Ȩޡܺкʽ ioperm() ;  root
ִиóʽ, ǵýóʽ setuid  root. йʽ ioperm() 
I/O ĴȡȨõ root Ȩ. ĳʽ֮Ტر Ҫ
ioperm(..., 0) ʽõ I/O ĴȡȨ; Ϊĳʽ
ִ֮Զ.

кʽ setuid() ĿǰִгʽЧʹʶ (ID) 趨ɷ root
ʹ߲Ӱǰ ioperm() ķʽȡõ I/O ȡȨ, Ǻкʽ
fork() ķʽȴӰ (Ȼг (parent process) дȡȨ, г
(child process) ȴ޷ȡôȡȨ).

ʽ ioperm() ֻȡòλַ 0x000  0x3ff ĴȡȨ;  ϸλַĲ,
ʹúʽ iopl()  (úʽһοԴȡеĲλַ).
Ȩ޵ȼֵΪ 3 (, iopl(3)) Աĳʽܹȡ е I/O 
(ҪС --- ȡĲλַĵɸֲԤڵ.
ͬ, кʽ iopl() ӵ root Ȩ.﷨ϸο iopl(2)
ʹ˵ļ.

, ʵʵشȡ I/O ... Ҫĳλַһ byte (8  bits)
, úкʽ inb(port) , úʽᴫȡõһ byte .
Ҫһ  byte , úкʽ outb(value, port)  (סĴ).
Ҫĳλַ x  x+1 ( byte һ word, ʹ ָ inw)
һ word (16  bits) , úкʽ inw(x) ; Ҫһ word
ϵλַ, úкʽ outw(value, x) .  㲻ȷʹǸָ
(byte  word), Ҫ inb()  outb() ָ ---
Ϊװöǲ byte СĲȡʽƵ.
עеĲȡָҪԼһ΢ʱִ.

ʹõ inb_p(), outb_p(), inw_p(), Լ outw_p() Ⱦ޼ָ,
Բλַȡ̵ֻ֮ܶ(Լһ΢)ӳʱͿ;
ҲӳʱɴԼ΢뷽ʹ #include <asm/io.h> ֮ǰʹ
#define REALLY_SLOW_IO. Щ޼ָͨ (ʹõ #define








 Linux ׫дʽʹ I/O 					      3



SLOW_IO_BY_JUMPING, ܽϲ׼ȷ) ϵλַ 0x80
ԱﵽӳʱĿ, Ժʽ ioperm() ȡòλַ 0x80 ʹȨ
(ϵλַ 0x80 ӦûϵͳӰ). 
ͨõӳʱķ, ȥ.

ioperm(2), iopl(2) Ⱥʽ, ľ޼ָʹ˵¼ 
Linux ʹ˵ļ.

2.2  һķ: /dev/port

һȡ I/O ķԺʽ open()  /dev/port
(һԪװ,ҪװñΪ 1, ҪװñΪ 4) Աִж/дĶ
(ע׼ (stdio) ʽ f*() ڲĻ (buffering), Ҫʹ).
ʹ lseek() ʽԱڸԪװõҵĳ byte ϵȷλ
(λ 0 = λַ 0x00, λ 1 = λַ 0x01, Դ), Ȼʹ
read()  write() ʽĳλַдһ byte  word ϵĶ.

ķĳʽʹ read/write ʽȡ /dev/port
Ԫװõ. ִٶȻǰһ㷽, ǲҪ
ѻҲҪʹúʽ ioperm() .  root ʹ߻Ⱥȡ
/dev/port Ԫװð, ʱͲӵ root Ȩ -- Ƕϵͳȫ
Ǹǳ, Ϊ˺ϵͳ, ȡ root Ȩ,
 /dev/port ԪװõֱӴȡӲ, ·, 豸.


3.  Ӳж (IRQs)  DMA ȡ

ĳʽʹģʽ (user-mode) ִвֱʹӲж (IRQs) 
DMA.  ׫дһʽ; صϸοҳ The Linux Kernel
Hacker's Guide2  Լúĳʽԭʼ.

Ҳ˵, ʹģʽ (user-mode) дĳʽ޷ӲжϵĲ.


4.  ߾ȷʱ

4.1  ӳʱ

, һ˵֤ʹģʽ (user-mode) ִег (process)
ܹȷؿʱΪ Linux Ǹ๤ҵ. ִег (process)
ʱΪԭͣԼ 10 뵽 (ϵͳɷǳߵʱ). Ȼ,
춴ʹ I/O Ӧö, ӳʱʵ㲻ʲ. Ҫӳʱ,
ʹúʽ nice ִег (process ) 趨ɸȨ(ο nice(2)
ʹ˵ļ) ʹüʱų̷ (real-time scheduling) (뿴).

ñһʹģʽ (user-mode) ִег (process)
Ҫȷʱ, һЩʹģʽ (user-mode)  `ʱ'
ų̵֧Ԯ. Linux 2.x 汾ĺ巽ʽļʱų֧Ԯ; ϸ˵ο
sched_setscheduler(2) ʹ˵ļ.  һĺ֧ԮӲļʱų;
ϸѶοҳ <URL:http://luz.cs.nmt.edu/~rtlinux/>


____________________

2. <URL:http://www.redhat.com:8080/HyperNews/get/khg.html>







 Linux ׫дʽʹ I/O 					      4



4.1.1  Ϣ (Sleeping) : sleep()  usleep()

, ǿʼϼ򵥵ʱʽ. Ҫӳʱ, ѵķ
ʹúʽ sleep() . Ҫӳʮʱ (10 ms ƺ̵
ӳʱ), ʽ usleep() Ӧÿʹ. Щʽó CPU ʹȨ
Ҫִег (processes)  (``ԼϢȥ''), û˷ѵ CPU
ʱ. ϸο sleep(3)  usleep(3) ˵ļ.

ó CPU ʹȨʹʱӳ˴Լ 50 
(ȡ춴ٶ, Լϵͳĸ), ˷ѵ CPU ̫ʱ, Ϊ
Linux ų (scheduler) ( x86 ܹ) ڽȨг (pro
cess) ֮ǰͨҪ 10-30 ʱ. , ʱӳ, ʹúʽ
usleep(3) õӳٽͨڲֵָ, Լ 10 ms.

4.1.2  nanosleep()

 Linux 2.0.x һϵеĺķа汾, һµϵͳ (system call),
nanosleep() (ο nanosleep(2) ˵ļ), ܹ Ϣӳһ̵ʱ
(΢).

ӳٵʱ <= 2 ms, (Ψ)ִег (process) 趨ļʱ
ų (ʹúʽ tt/sched_setscheduler()/), кʽ nanosleep()  ʱ
ʹһæµȦӳʱ; ǻʽ usleep() һó CPU
ʹȨϢȥ.

æµȦʹúʽ udelay() (һʽõĺڲĺʽ) ,
ʹ BogoMips ֵ (BogoMips ׼ȷæµȦٶ)
Ȧӳٵʱ䳤. ζϸο /usr/include/asm/delay.h).

4.1.3  ʹ I/O ӳʱ

һӳ΢ķʹ I/O . ǴӲλַ 0x80 κ byte
 (οǰ) ȴʱӦüֻҪ 1 ΢ҪĴͱٶ.
Ҫӳ΢ʱԽ. κα׼Ļϵ
λַӦòв (Щĵ豸ʽҲʹ).
{in|out}[bw]_p() Ⱥʽʹʱӳٵ (ο asm/io.h).

ʵ, һʹõλַΧΪ 0-0x3ff  I/O ָֻҪ 1 ΢ʱ,
Ҫ, , ֱʹòв, ֻҪϼ inb() ʽӸ
λַΧ byte ϼ.

4.1.4  ʹӳʱ

ִ֪гʽڻĴͱʱٶ,
ִĳЩָԱý϶̵ӳʱ (Ǽס, ִег
(process) ʱᱻͣ,  ʱӳٵʱʵʳ).  ıʾ,
ڲٶȾҪʹõʱ; , һ 50 MHz Ĵ (486DX-50
 486DX2-50), һʱҪ 1/50000000  (=200 ).














 Linux ׫дʽʹ I/O 					      5



     ָ	   i386 ʱ	 i486 ʱ
     nop		   3		       1
     xchg %ax,%ax	   3		       3
     or %ax,%ax 	   2		       1
     mov %ax,%ax	   2		       1
     add %ax,0		   2		       1

(Բ, Ҳ֪ Pentiums ,  i486 ӽ. ޷ i386
ҵֻһʱڵָ. ܹʹûһʱڵָ,
ҪȻʹù߼ʽҲǿʱ.)

ıָ nop  xchg Ӧòв. ָܻ
ıݴ, ûϵΪ gcc ᴦ. ָ nop Ǹõѡ.

ҪĳʽʹõЩָ, ʹ asm('instruction').
ָ﷨ͬ÷; Ҫڵһ asm() ʹöָ,
ʹ÷ֺŽǸ. , asm('nop ; nop ; nop ; nop') ִĸ nop ָ,
 i486  Pentium лӳĸʱ ( i386 ӳ 12 ʱ).

gcc Ὣ asm() ɵԳʽ, Բккʽĸ.

 Intel x86 ܹвбһʱڻ̵ʱӳ.

4.1.5   Pentiums ʹúʽ rdtsc

 Pentiums , ʹ C ԳʽȡԴϴ¿
ھ˶ٸʱ:


	     extern __inline__ unsigned long long int rdtsc()
	     {
	       unsigned long long int x;
	       __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
	       return x;
	     }

ѯʲοֵԱӳҪʱ.

4.2  ʱ

Ҫʱ侫ȷһ, ʹúʽ time() 򵥵ķ.  Ҫʱȷ, ʽ
gettimeofday() ԼԾȷ΢ (ǰܵ CPU ų̵Ӱ). 
Pentiums , ʹĳʽƬϾͿԾȷһʱ.

Ҫִег (process) һʱ䵽ܹ֪֮ͨ (get a signal),
ʹúʽ setitimer()  alarm() .  ϸοʽʹ˵ļ.


5.  ʹʽ

˵ C ʽ. ӦÿֱӦ C++  Objective C ֮.
Բ, Ȼ C ккʽ ioperm()  iopl() ,
֮Ϳֱʹ I/O дָ.









 Linux ׫дʽʹ I/O 					      6



ʽ, ڸóʽв뵥Ի C
֮ʽʹ˵ϵͳ, 򵹲׫дһںдȡ I/O
ӳʱ躯ʽ֮򵥵 C ԭʼʽȽ,
֮ĳʽ.  ҪȻʹǰ˵ /dev/port Ԫװõ.


6.  һЩõ I/O 

ṩһЩ I/O ĳʽ׫дѶЩǿֱõһĿ TTL (
CMOS) ߼λ׼ I/O .

ҪԭʼĿʹЩõI/O  (,
һӡݻ), Ӧûʹֳɵװʽ (ͨں)
籾˵ȥ׫д I/O ʽ.  ҪṩЩҪ LCD ʾ,
, ҵӲƷ ӵ PC ׼ I/O .

Ҫƴгװɨ (Ѿгһڼ),
ȥҿǷֳɵ Linux װʽ.  ҳ Hardware-HOWTO3
ǸõĲο.

Ҫ֪йӵװõ(Լһĵѧԭ)Ѷҳ
<URL:http://www.hut.fi/Misc/Electronics/> ǸõԴ.

6.1  в (parallel port)

вĻλַ (³֮Ϊ ``BASE'') ֮ /dev/lp0  0x3bc , ֮ /dev/lp1
 0x378 , ֮ /dev/lp2  0x278 .
ֻҪһЩһӡĶ, Բοҳ Printing-HOWTO4 .

漴ı׼ (output-only) ģʽ, Ĳв `'
˫ (bidirectional) ģʽ. 춽µ ECP/EPP ģʽ (Լһ IEEE 1284 ׼)
ڵ, Բοҳ <URL:http://www.fapo.com/> Լ
<URL:http://www.senet.com.au/~cpeacock/parallel.htm>.  Ϊʹģʽ (user-
mode) еĳʽ޷ʹ IRQs  DMA, Ҫʹ ECP/EPP
ģʽ׫дһĵװʽ; Ӧдװʽ,
Ҳ֪.

λַ BASE+0 (ϲ) ϲźλ׼ (D0  D7 ֱ bits 0 
7, λ׼״̬: 0 = λ׼ (0 V), 1 = λ׼ (5 V)).
һдϵòĶὫźλ׼˩ס (latches) ڲĽλ (pins) .
һò϶ĶὫһԱ׼ (output-only)
ģʽдģʽ˩סźλ׼, ģʽ һ
װýλϵźλ׼.

λַ BASE+1 (״̬) Ǹ (read-only) Ĳ, Ὣźλ׼:

    Bits 0  1 .



____________________

3. <URL:http://sunsite.unc.edu/pub/Linux/docs/HOWTO/Hardware-HOWTO>

4. <URL:http://sunsite.unc.edu/pub/Linux/docs/HOWTO/Printing-HOWTO>







 Linux ׫дʽʹ I/O 					      7



    Bit 2 IRQ ״̬ (Ǹλ (pin) , Ҳ֪Ĺԭ)

    Bit 3 ERROR (1=λ׼)

    Bit 4 SLCT (1=λ׼)

    Bit 5 PE (1=λ׼)

    Bit 6 ACK (1=λ׼)

    Bit 7 -BUSY (0=λ׼)

(Ҳȷߵλ׼ĵѹ״̬.)

λַ BASE+2 (Ʋ) Ǹд (write-only) Ĳ
(һò϶ĶὫһдźλ׼),
״̬ź:

    Bit 0 -STROBE (0=λ׼)

    Bit 1 AUTO_FD_XT (1=λ׼)

    Bit 2 -INIT (0=λ׼)

    Bit 3 SLCT_IN (1=λ׼)

    Bit 4 趨Ϊ 1 ʱв IRQ ź ( ACK
     λλ׼ɵͱߵ˲)

    Bit 5 ģʽʱ뷽 (0 = д, 1 = ), Ǹд
     (write-only) Ĳ (һò϶ĶԴ bit һôҲû).

    Bits 6 and 7 .

(ͬ, Ҳȷߵλ׼ĵѹ״̬.)

Ľλ (Pinout) ʽ (òһ 25 ֻ D  (D-shell)
ĸͷ) (i=, o=):

     1io -STROBE, 2io D0, 3io D1, 4io D2, 5io D3, 6io D4, 7io D5, 8io D6,
     9io D7, 10i ACK, 11i -BUSY, 12i PE, 13i SLCT, 14o AUTO_FD_XT,
     15i ERROR, 16o -INIT, 17o SLCT_IN, 18-25 Ground

IBM Ĺļ˵λ 1, 14, 16,  17 (źŵ) õ羧Ŀ
(open collector) ʽʹ 4.7 Ǫŷķ (kiloohm)  5 V
ĵѹ ( 20 mA,  0.55 mA, λ׼ѹ 5.0 V
ȥĵѹ). ʣĽλ 24 mA,  15 mA,
λ׼ѹС 2.4 V. λ׼ѹ߶ 0.5 V.  Щ IBM
Ĳвƫ׼. οҳ
<URL:http://www.hut.fi/Misc/Electronics/circuits/lptpower.html>.

, һ: Ľӵص. ڵԻǿ״ȥ
Ūüв. ܻûǲҪв
ϵȽϺ. (ͨһƬ˵ı׼ `multi-I/O' װڶ








 Linux ׫дʽʹ I/O 					      8



в; ֻҪҪĲͣ, ȻὫƬϲвĲλַ趨
λַ. 㲻Ⲣв IRQ 趨, Ϊͨᱻõ.)

6.2  Ϸ (ݡ)  (game port)

ϷĲλַΧΪ 0x200-0x207. ҪһĲݡ,
һĲεĲݡʽ, ɲοַ <URL:ftp://sun
site.unc.edu/pub/Linux/kernel/patches/>,  joystick-*.

Ľλ (Pinout) ʽ (òһ 15 ֻ D  (D-shell)
ĸͷ):

    1,8,9,15: +5 V (Դ)

    4,5,12: ӵ

    2,7,10,14: ֱ BA1, BA2, BB1,  BB2 λ

    3,6,11,13: ֱ AX, AY, BX,  BY ``''

+5 V ĽλƺͨᱻֱӵĵԴ,
Ӧܹṩ൱ĵ, ⻹Ҫʹ, Դ,
ԼϷ.

λ춲ݡİťӶݡĸť (ݡ A  ݡ B,
жť) ϷҲλĸλ. Ӧһ TTL
ѹλ׼, ֱӴ״̬ (ο˵) ǵλ׼״̬.
һʵʵĲݡڰťѹʱᴫصλ׼ (0 V) ״̬Ǹλ׼ (5V  1
Kohm ĵӵԴλ) ״̬.

νʵ⵽迹ֵ. Ϸĸг (one-shot multi
vibrator) (һ 558 Ƭ) ӵĸλ.
ÿλг֮һ 2.2 Kohm ĵ,
Ҷг֮һ 0.01 uF ʱ (timing capacitor).
һʵʵĲݡÿ (X  Y) ϻһɱ,  +5 V
ÿԵλ֮ (λ AX  AY Ǹݡ A õ, λ BX  BY
Ǹݡ Bõ).

ʱ, г趨Ϊλ׼ (5 V) ҵȵʱϵĵѹﵽ
3.3 V ֮ὫԵ趨Ϊλ׼. ˲ݡжгĸλ׼ʱ
ɱĵֵ (Ҳ, ݡλ), ʾ:

     R = (t - 24.2) / 0.011,


 R ǿɱ迹ֵ (ohms)  t Ǹλ׼ʱڵĳ ().

Ҫλֵ, г (Բдķʽ;
뿴),
Ȼѯĸź״̬(ԳĲʽ)һֱź״̬ɸλ׼ɵλ׼,
λ׼ʱڵĳ. ѯĶ൱ CPU ʱ,
һǼʱĶ๤ (һʹģʽ (user-mode) ) Linux,
õĽǷǳ׼ȷΪ޷Թ̶ʱѯźŵ״̬
(ʹúĲεʽѯʱƵжϵĲ,








 Linux ׫дʽʹ I/O 					      9



˷Ѹ CPU ʱ). ֪źŵ״̬Ứһβ̵ʱ
(ʮ) Ϊλ׼, ڲѯ֮ǰкʽ usleep()  CPU
ʱøҪִег (processes).

ϷΨһҪȡĲλַ 0x201 (ĲλַǶһû).
κζλַд붯 (дʲ) г.
λַȡźŵ״̬:

    Bit 0: AX ( (1=λ׼) г״̬)

    Bit 1: AY ( (1=λ׼) г״̬)

    Bit 2: BX ( (1=λ׼) г״̬)

    Bit 3: BY ( (1=λ׼) г״̬)

    Bit 4: BA1 (λ, 1=λ׼)

    Bit 5: BA2 (λ, 1=λ׼)

    Bit 6: BB1 (λ, 1=λ׼)

    Bit 7: BB2 (λ, 1=λ׼)

6.3  в (serial port)

˵װ֧ԮһЩ RS-232 Ķ,
ӦÿԸʹôв.  Linux
ṩĴвʽӦܹӦκεط (ӦòҪֱ׫двʽ,
Ǻĵʽ); ൱ͨ, ʹ÷Ǳ׼ bps
ԼȵӦò.  ο termios(3) ˵ļ,
вʽԭʼʽ (linux/drivers/char/serial.c), Լҳ
<URL:http://www.easysw.com/~mike/serial/index.html> и Unix
ҵϵͳ׫двʽ.


7.  ʾ

Ҫкõ I/O Ʒֵ, ڲвװ ADC / DAC Ƭ (ʾ:
Դ, ʹϷϵĻδõĴŵԴͷ ֮,
װùĵòв䵱Դ, ȻʹⲿĵԴ),
 AD/DA Ƭ (󲿷ֽϾ/ϵٵĲƷ I/O ).  Linux
Чʽ֧ԮıЧ (ٶȻ൱Ŀ)  1  2 ȷ, (ܻ)
޷źͨԾ͹.

ʹþȷװ, Ľӵؿźŵ.
ⷽľ, ᳢ܻԹ (װ֮ е
ź) Ӹ.  ӵȡùĵԴ
(ڲδõźŽλṩ㹻ĵԴ) ﵽѵĸЧ.

Ѱ Linux ʹõӡˢ·, һΪ Pcb ѵ
X11 ӦóʽӦܹʤ, ֻҪ㲻ҪһЩ̫ӵ.   Linux а汾
(distributions) ںʽ, ͬʱҲַ <URL:ftp://sun
site.unc.edu/pub/Linux/apps/circuits/> (Ϊ pcb-*).








 Linux ׫дʽʹ I/O 					     10



8.  ų

      Q1.
	    Ҵȡ I/O ʱ segmentation faults 

      A1.
	    ĳʽû root Ȩ, ΪĳЩɵºʽ ioperm()
	    ʧ. 麯ʽ ioperm() Ĵֵ. ͬʱ,
	    ȡĲҲ ʽ ioperm() õĲλַ (ο Q3).
	    ʹõӳʱľ޼ָ (inb_p(), outb_p(), ȵ),
	    ǵҲҪкʽ ioperm() Աȡλַ 0x80.

      Q2.
	    ޷ҵ in*(), out*() Ⱥʽںδ, ͬʱ gcc
	    ҲԹοδķ (undefined references).

      A2.
	    ڱʽʱûдѻѡ (-O),  gcc ܽ asm/io.h
	    еľ޼ָ.  ûʹ #include <asm/io.h>.

      Q3.
	    out*() ûж, Ƕֵֹ.

      A3.
	    õĴ; Ӧ outb(value, port) ,  MS-
	    DOS ϳõ outportb(port, value)

      Q4.
	    Ҫһ׼ RS-232 װ/Ӳвӡ/ݡ...

      A4.
	    ֹͣ¶ʹеʽ (Ǵ Linux ĺл X
	    ŷлĵط) Ŀ.
	    Щʽͨ൱ͨ, Ծе㲻׼װ,
	    ͨ.  Щ׼ I/O
	    Ѷοǰ˵ļָ.


9.  ʽ

һȡ I/O ļ򵥵ĳʽ:





















 Linux ׫дʽʹ I/O 					     11



	  /*
	   * example.c: һȡ I/O ķǳ򵥵ġ
	   *
	   * ʽ벢ûʲô, ֻ˲д, ͣ,
	   * ԼĶ. ʱʹ `gcc -O2 -o example example.c',
	   *  root ִ `./example'.
	   */

	  #include <stdio.h>
	  #include <unistd.h>
	  #include <asm/io.h>

	  #define BASEPORT 0x378 /* lp1 */

	  int main()
	  {
	    /* ȡòλַĴȡȨ */
	    if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

	    /* 趨ź (D0-7) ȫΪ (0) */
	    outb(0, BASEPORT);

	    /* Ϣһ (100 ms) */
	    usleep(100000);

	    /* ״̬ (BASE+1) ϲʾ */
	    printf("status: %d\n", inb(BASEPORT + 1));

	    /* ǲҪЩλַ */
	    if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

	    exit(0);
	  }

	  /*  example.c */



10.  л

Эҵʵ̫޷һһг, Ҫλ˵л.
Эҵ˲ûһһظϱǸ֮, ٴллǵЭ.




















 Linux ׫дʽʹ I/O 					     12





































































				   CONTENTS



1.   .................................................................... 1

2.   C ʹ I/O  .............................................. 1
    2.1 ķ .......................................................... 1
    2.2 һķ: /dev/port ......................................... 3

3.  Ӳж (IRQs)  DMA ȡ ............................................. 3

4.  ߾ȷʱ ............................................................ 3
    4.1 ӳʱ ............................................................ 3
    4.2 ʱ .......................................................... 5

5.  ʹʽ ........................................................ 5

6.  һЩõ I/O  ....................................................... 6
    6.1 в (parallel port) .............................................. 6
    6.2 Ϸ (ݡ)  (game port) ........................................ 8
    6.3 в (serial port) ................................................ 9

7.  ʾ .................................................................... 9

8.  ų ............................................................... 10

9.  ʽ ............................................................. 10

10. л ................................................................... 11


























				       i


