
        Linux I/O ݡȥץߥ ߥ˥ϥġ

             : rjs@spider.compart.fi (Riku Saikkonen)
        ǽ : Aug 26 1996

                  :         (kei@sm.sony.co.jp)
        ζ̣/ :   (hiro@koneeko.linux.or.jp)


ΥɥȤ 1995-1996 Riku Saikkonsen °ޤ
ܺ٤˴ؤƤ̾ Linux  HOWTO COPYRIGHT 

 ϥġǤϡƥ x86 ץåץΡ
ϡɥ I/O ݡȤΥץߥ󥰤ȡLinux Υ桼⡼ɤû
Ԥ򤪤ʤץࡢʤɤˤĤƽҤ٤ޤ

ˤƱ褦(ȤƤ⾮) IO-Port-mini-HOWTO 񤭤ޤ
ʸϤ³ԤǤ

⤷ʤˤְ㤤äꡢդä뤳Ȥʤɤޤ餼
˥ᥤ뤷Ƥ(rjs@spider.compart.fi)...

ΥС (Dec 26 1995) ѹ:
	* ݡȤΥץߥ󥰤˴ؤ
	* C ʳθ
	* nanosleep()
	* ڥƥץåΥߥ
	* ǥɲ
	* ξʽ
ʤɤǤ




        C ץफ I/O ݡȤȤ ... ̤ˡ

I/O ݡȤ򥢥뤿Υ롼/usr/include/asm/io.h (ޤ
ͥΥѥå linux/include/asm-i386/io.h)
ޤɬפʥ롼ϡǥ饤ޥȤƤޤΤǡ
	#include <asm/io.h>
ȤǽʬǤ礦
̤ʥ饤֥ʤɤפǤ

Υ롼ȤǤϡgcc (ʤȤ 2.7.2 ޤϤ
ΥС)ȤȤˡΤ褦¤ޤ

Ŭ򥪥ˤ(-O1 ޤϤʾ)
Ǥʤ asm/io.h 򥤥󥯥롼ɤ
	#define extern
Ȥ򤪤ʤäƤɬפޤ

ǥХåΤˡgcc -g -OפȤȤǤޤ(ʤȤǶ
gccǤ) Ŭ줿ɤǤϥǥХåѤʵư򼨤Ȥ
ޤΤ褦ʾˤϡI/O ݡȥޤɤΩ
եˤƤơΥեΥѥλˤŬ
ˤȤˡȤȤǤޤ



ݡȤ򥢥ˡΥݡȤ򥢥ĤץͿ
ʤФʤޤ󡣤ˤϡioperm(2) ؿ(unistd.h 졢ͥ
Ƥ)ƤӽФޤ
δؿϥץκǽǸƤӽФɬפޤ(I/O ݡȥ
)
δؿν񼰤 ioperm(from, num, turn_on) Ǥ
	from  ݡȤκǽΥɥ쥹
	num ϡfrom 餤ĤϢ³ɥ쥹Υ
ꤷޤ
㤨Сioperm(0x300, 5, 1) ϡ0x300  0x304 (פ5ĤΥݡ)
ФĤꤷǸΥѥ᡼ǤϡΥݡȤФ륢Ĥ
ͿΤػߤΤ(true : 1 = ĤͿ, false : 0 = Ĥ
ػߤ)ǻꤷޤ
Ϣ³ƤʤݡȤξˤϡʣ ioperm() ƤӽФơŬڤʵĤ
ꤷޤ
ioperm() ξܺ٤ʸˡ˴ؤƤ ioperm(2) Υޥ˥奢ڡ򻲾ȤƲ



ioperm() ƤӽФˤϡΥץब root øäƤ뤳Ȥ
ɬפǤĤޤꡢΥץ롼ȥ桼Ǽ¹Ԥ뤫å UID
root (: ¹ԥեΥʡ root ˤƤchmod 4755 hogehoge Ȥ
ĤǤ)ˤƤɬפޤ

ɬפʥݡȤФĤ ioperm() ͿȤˡroot ø
Ǥޤ
ץκǸǡۤ ioperm(..., 0) ƤӽФƵĤɬפ
ޤ󡣤ϥץνλ˼ưŪ˹Ԥʤޤ顣

ioperm() ꤷ I/O Ф륢Ĥϡfork() 䡢exec() ̤
Ѥޤ
ޤroot ʳΥ桼 setuid ˤѤޤ

ioperm() Ǥϡ0x000  0x3ff ޤǤΥݡȤФ륢Ĥ
Ϳ뤳ȤϤǤޤ󡣤ΥݡȤФƤϡiopl(2) 
Ȥɬפޤ(iopl(2) ȤȰ٤ˤ٤ƤΥݡȤФ
ĤͿ뤳Ȥˤʤޤ)
٤ƤΥݡȤФƥĤͿˤϡ٥ѥ᡼Ȥ
3פȤޤĤޤꡢiopl(3);פȤؿƤӽФ򤷤ޤ
iopl() ƤӽФˤ root øɬפǤ



ơºݤ˥ݡȤ򥢥֤Ǥ

ݡȤϤˤinb(port); ƤӽФޤ
ϥݡȤȤäƤХȥǡ֤ޤ

ݡȤ˽Ϥˤϡoutb(value, port); ƤӽФޤ
(ѥ᡼ν֤դƲ)(:֥䡢MS-DOS Υѥ
饤֥ʤɤξȤϵդǤ) 

ݡȥɥ쥹 x  x+1 ɥǡϤˤ inw(x);
ƤӽФޤ(֥INW ȤޤäƱ褦ˤ줾ΥݡȤ
1ХȤɤǤơɥǡ櫓Ǥ)
դĤΥݡȤ˥(2Х)Ϥˤ outw(value, x); Ȥޤ

inb_p(), outb_p(), inw_p(), outw_p() Ȥäޥϡ˽Ҥ٤Τ
Ʊư򤷤ޤݡȤ˥˾(1ޥ)
Ȥޤ
asm/io.h 򥤥󥯥롼ɤ REALLY_SLOW_IO  #define ȡ
ΥȻ֤4ޥäѤ뤳ȤǤޤ

Υޥ̾0x80 Ϥ I/O ݡȤ˽Ϥ뤳ȤǥȤ
¸Ƥޤ(#define SLOW_IO_BY_JUMPING Ƥˤ̤ˡ
ȤޤϤޤΤٱ򤪤ʤȤǤʤϤǤ)
Τ褦ͳ顢0x80 ϤΥݡȤФ ioperm()˼¹ԤƤɬפ
ޤ(0x80 ϤΥݡȤФϤϥƥФƤʤƶ
Ϳ뤳ȤϤʤϤǤ)
ˤޤޤٱԤʤˡˤĤƤϡʲɤ߿ʤƲ

ǶΥ꡼ man ڡˤϡΥޥ˴ؤޤ




ȥ֥륷塼ƥ:

Q1. ݡȤ򥢥 segmentation faults Ƥޤޤ

A1. ץब root øäƤʤʤ餫ͳ ioperm()
    ƤӽФ˼ԤƤΤǤ礦ioperm() ֤ͤĴ٤Ƥߤ
    

Q2. in*() Ȥ out*() ȤδؿɤˤߤĤޤgcc 
    undefined reference ȤʸäƤޤ

A2. ѥλ˺Ŭ򥪥 (-O) ˤʤäΤǤ? η̡
    gcc  asm/io.h ˤޥ褹뤳ȤǤʤäΤǤ
    Ȥ⡢#include <asm/io.h> ˺Ƥޤ?

Q3. out*() ¹ԤƤʤˤ⤪ʤޤϤʤѤʤΤǤ

A3. ѥ᡼ν֤åƲoutb(value, port) Ȥ
    ֤ǤMS-DOS Ǥʤߤ outportb(port,value) ȤϵդǤ




        I/O ݡȥ򤹤̤ˡ

⤦Ĥˡϡopen() Ȥä /dev/port (饯ǥХ᥸㡼
ֹ 1ޥʡֹ4)򥪡ץ󤷤ơread/write 򤪤ʤȤˡǤ
(stdio  f*()ؿ(: fwrite() Ȥ fread() Ȥ...)ǥХåե
򤷤ƤΤǡȤޤ͡)
ץ󤷤ˡϤݡȤΥɥ쥹ޤ lseek() ޤ
(file position 0  ݡ 0 ˡfile position 1  ݡ 1 ... Ȥä
ޤ)
θ read(), write() ȤäƥХ/ɤɤ߽񤭤ޤ

ˡȤˤϡ Υץब /dev/port Ф read/write
ĤäƤʤФʤޤ
ˡϾ˽Ҥ٤̾ˡ⤪餯٤Ǥ礦(ѥ)
Ŭ ioperm() פǤȤޤ





         (IRQ)  DMA 

桼⡼ɤΥץफľܤ˳ߤ DMA ȤȤϤǤޤ
ˤϡͥɥ饤Фɬפޤξܺ٤ˤĤƤ
Linux ͥϥå ɡפ򡢤ޤȤƤϡͥ
ɤɤǲ

ޤ桼⡼ɥץǳߤػߤʤ⤢ޤ




        ⤤٤Υߥ: ǥ쥤

ޤǽǤäƤޤ桼ץˤΤʥߥݾ
򤹤뤳ȤϤǤޤ󡣤ϡLinux ޥץꥨץƥ
ʥƥǤʤΥץ20mä(٤
⤤ƥʤɤ)ϤäƤʤ餫ͳǥ塼оݤ
뤳ȤϡĤǤ⤢ޤ

I/O ݡȤȤۤȤɤΥץꥱǤϡϼºݤˤ
ˤϤʤʤǤ礦

λ֤Ǥ뤿ˤϡnice Ȥäơץͥ
⤯ȤȤǤޤ(: å󥰤Ƥ褦ʾ
Ǥ nice θ̤ϤۤȤɤʤȻפޤñ٤⤤褦ʾ
(ĤޤꡢCPU ꥽­ʤȤ)ˤϸ̤Τʡ)

Linux ͥ˥ꥢ륿ൡǽɲäȤײ⤢ޤ
ˤĤƤϡhttp://luz.cs.nmt.edu/~rtlinux 

ơäȴñʥߥ󥰤ˤĤƤäޤ礦äΥǥ쥤
ߤˤϡ餯 sleep(3) Ǥ礦ߥðʾ
ǥ쥤(ǾΥǥ쥤20ߥäΤ褦Ǥ)ξˤ usleep(3)
Ǥ

δؿƤӽФȡCPU ¾Υץ˳ƤޤΤǡ
CPU ब̵̤ˤʤ뤳ȤϤޤ
ܺ٤ˤĤƤ man ڡ



 20 ߥä⾮ǥ쥤˴ؤƤ(餯ץåޥ
®١ƥ٤ˤ¸ޤ)˽Ҥ٤褦 CPU Ƥޤ
ȤץǤϤޤޤ̾Linux Υ塼餬ʤ
ץФ᤹˾ʤȤ 20 ߥäϤ뤫Ǥ

ͳ顢ٱξˤ usleep(3) ˻ꤷٱ⤤֤
Ĺٱ䤹뤳Ȥˤʤޤޤꤹѥ᡼κǾͤ 20 ߥ
ǤΤ⡢줬ͳǤ

ûǥ쥤(ޥä 20 ߥ)ɬפʾ˰ִñ
ˡϡ/usr/include/asm/delay.h (linux/include/asm-i386/delay.h)
Ƥ udelay() ȤȤˡǤ

udelay() Ϥѥ᡼ϡޥåǥ쥤뤫Ȥ (unsigned
long)Ǥѥ᡼ϤҤȤĤǡ֤ͤϤޤ
ɤ줯餤ǥ쥤٤׻뤿ΥСإåɤ뤿ᡢ
ꤷͤޥ;פ˥ǥ쥤Ƥޤǽޤ
(ܺ٤ delay.h 򻲾ȤΤȡ)

ͥʳ udelay() Ȥˤϡunsigned long ѿ loops_per_sec 
ŬڤͤꤷƤɬפޤ

ͤ򥫡ͥ뤫ĥäƤˡϡ(Τ¤Ǥ)/proc/cpuinfo
ɤߤơBogoMips ͤΤꡢ 500000 褸ơ
loops_per_sec ͤˤȤˡǤ(ΤǤɡ)
(: Linux 2.0.20 λδĶ cat /proc/cpuinfo ȡ
	processor       : 0
	cpu             : 586
	model           : 7
	vendor_id       : GenuineIntel
	stepping        : unknown
	fdiv_bug        : no
	hlt_bug         : no
	fpu             : yes
	fpu_exception	: yes
	cpuid           : yes
	wp              : yes
	flags           : fpu vme de pse tsc msr mce cx8
	bogomips        : 40.03
Ȥʤޤ)



Linux ͥ 2.0.x ꡼ˤϡnanosleep(2) Ȥƥॳ
ɲäޤȤȡλ֤˱ơ꡼/ǥ쥤
ȤʬƤޤߤμǤϡ2ߥðʲΥǥ쥤ξˤ udelay()
򡢤ʾξˤϥ꡼פȤդˤʤäƤ褦Ǥ
Ǥ顢٤Ѥ餺ޥäȻפޤ˿ͥ
ǤϲȻפޤ

 nanosleep(2) ΥɥȤ򸫤Ĥ뤳ȤǤޤǤ
/usr/src/linux/kernel/sched.c 򸫤¤ꡢν(ƤӽФ):
   int nanosleep(struct timespec *rqtp, struct timespec *rmtp);
Τ褦Ǥ

ǡ¤ rqtp ˤäơɤԤꤷޤ
ޤ⤷ rmtp  NULL ʳͤǡnanaosleep() ܡȤ줿
ˤ(errno ѿ EINTR ꤵ졢֤ͤ -1 Ȥʤ)Ĥ֤
¤ rmtp ˳Ǽޤ
ǥ쥤˴λˤ 0 ֤졢ʤ餫ͳǴλʤä
ˤ -1 ֤ޤ(ξˤ errno Ŭڤͤꤵޤ)

ûǥ쥤ɬפʾˤϡĤˡޤ

ݡ 0x80 ˽(ͤϤʤǤ⤤Ǥ)ȡץåμ
®٤˴طʤۤΤ 1ޥԤĤȤǤޤ(Ϥˡ
ˤĤƤϡɤǲ)ɬפʲ֤Ȥǿޥ
ԤĤȤǤޤɸŪʥޥǤϡΥݡȽϤˤäƤʤˤѤ
ѤäꤷʤϤ(ͥɥ饤ФǤȤäƤΤ
ޤ)Ǥ
ˡ {in|out}[bw]_p() Ǥǥ쥤뤿̾˻ȤƤˡ
Ǥ(asm/io.h 򸫤Ʋ)



ΥץबޥΥץåμȥå®٤狼äƤ
ˤϡΥ֥̿ϡɥɤ뤳Ȥǡäûǥ쥤
¸뤳ȤǤޤ(ץ塼󥰤鳰졢
ǥ쥤ĹʤäƤޤȤ뤳Ȥ˺ʤǲ)

ʲɽǤϡ줾̿ǲå(å)񤵤뤫򼨤
ޤˤäƤɤ줯餤λ֤񤹤뤫Τ뤳ȤǤޤ
㤨 50MHz Υץå (486DX-50 Ȥ486DX2-50) ξˤ 1 å
1/50000000 äǤ

Instruction   i386 clock cycles   i486 clock cycles
nop                   3                   1
xchg %ax,%ax          3                   3
or %ax,%ax            2                   1
mov %ax,%ax           2                   1
add %ax,0             2                   1
[Ÿ: Borland Turbo Assembler 3.0 Quick Reference]
(ʤΤǤڥƥץåˤĤƤϻϤ狼ޤ
 餯i486 ˶ᤤȻפޤ)
(i386  1 å̿ϤߤĤޤǤ)

ɽǡnop  xchg ϲѤϤʤϤǤ¾̿ϥե饰
쥸ѹǽޤǤ⡢gcc Ϥ򸡽ФƤޤ
顢ˤϤʤʤϤǤ



Ȥˤϡץ asm("̿"); Ȥ񼰤Ȥäơ
ɽ̿ߤޤҤȤĤ asm() ʸʣ̿
ˤϡasm("̿; ̿; ̿"); Ȥ񼰤Ȥޤ

asm() ʸϡgcc ˤäơ饤󥢥֥饳ɤѴΤ
ؿƤӽФΥСإåɤϤޤ

ޤڥƥץåǤϡ֡Ȥ鸽ߤޤǤηв᥯å
Τ뤳ȤǤޤʲΥɤǤ:

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

ˤ衢ߤΥƥ x86 ƥǤϡ1 å
ûǥ쥤ԲǽǤ




        ⤤٤Υߥ: ֤¬

1 ä餤٤λ֤ʤСtime(2) ȤΤִñǤ礦
äΤʻ֤ɬפʾˤϡgettimeofday(2) Ȥ Ρޥ
٤ޤ(Ǥ⡢ǽҤ٤塼󥰤ΤȤ˺ʤ
Ǥ)ڥƥץåξˤϡΥɤȤ 1 å
٤Фޤ

ץַвᤷ˥ʥꤿˤϡsetitimer(2)
Ȥޤδؿξܺ٤ˤĤƤ man ڡ




        ¾Υץߥ󥰸ˤĤ

ʾǤ C òƽҤ٤ޤC++  Objective C Ǥ
Ʊ褦ˤǤϤǤ
֥ξ硢C ξƱͤ ioperm() iopl() ƤӽФʤ
ʤޤ󤬡θˤľ I/O ݡȤФ꡼/饤̿(:
in, out ̿)ȤȤǤޤ

¾θǡ⤷饤󥢥֥ C ΥɤळȤ
ǤʤˤäȤñˡϡɬפ I/O ݡȥΤ
ɤ C ǵҤƥѥ뤷ץ¾ʬȥ󥯤
ޤȤˡǤ礦




        褯Ȥݡ

ʲϡ TTL  I/O ݡȤˤĤƤΥץߥ󥰾Ǥ


ѥݡ(١ɥ쥹 = /dev/lp0  0x3bc/dev/lp1  0x378
/dev/lp2  0x278): [Ÿ: IBM PS/2 model 50/60 Technical Reference ȡ
¸̤] (ϡŪݡȤǥݡȤƤ ECP/EPP ⡼
ɤդưΤΤޤ󤬡ʲǽҤ٤(̤)ݡȤ
ݡȤƤϤǤ)
(̾Υץ󥿥ݡȤȤưǤ顢Printing-HOWTO 
ɤΤǤ礦)

ۤȤɤΥѥݡȤˤϡɸŪʽѥ⡼ɤ˲äơֳĥ
⡼ɤޤΥ⡼ɤǤϡӥåȤꤹ뤳Ȥˤä
ƱݡȤϤޤϤؤ뤳ȤǤޤ
Ǥ⡢Ϥɤäĥ⡼ɤ򥪥ˤǤΤΤޤ
(ǥեȤǤϥդΤϤǤ)...⤷ΤäƤᥤ벼

BASE + 0 (ǡݡ) ϡݡȤΥǡ椷ޤ(D0  D7 
ӥå0  7 бޤ : 0 = low (0V)1 = high (5V))
ΥݡȤФ饤ȤϥǡåƳΥԥ˽Ϥޤ
ɸޤϳĥ饤ȥ⡼ɤξˤϡ꡼ɤȡǸ˥饤Ȥ줿
ǡɤ߽Фޤĥ꡼ɥ⡼ɤξˤϡԥΥǡɤ߽
ޤ



BASE + 1 Υݡ(ơݡ) ϥ꡼ɥ꡼ǡʲΤ褦
ϿΥơ֤ޤ:

Bit 0  1 ͽ󤵤Ƥ
Bit 2   IRQ ơ (ԥͤǤϤʤɤդư뤫Τʤ)
Bit 3   ERROR (1=high)
Bit 4   SLCT  (1=high)
Bit 5   PE    (1=high)
Bit 6   ACK   (1=high)
Bit 7   -BUSY (0=high)
(high/low γդ˴ؤƤϤޤΤǤϤޤ)


BASE + 2 Υݡ(ݡ)ϥ饤ȥ꡼(꡼ɤ硢Ǹ˥饤Ȥ
ǡ֤)ǡʲΥơ椷ޤ:

Bit 0   -STROBE    (0=high)
Bit 1   AUTO_FD_XT (1=high)
Bit 2   -INIT      (0=high)
Bit 3   SLCT_IN    (1=high)
Bit 4   '1' ˤȡѥݡȤγߤĤ(ACK  low -> high 
        ܤǳȯ)
Bit 5   ĥ⡼ɤǤ(0 = , 1 = ) 椹롣ΥӥåȤ
        ˥饤ȥ꡼ǡ꡼ɻˤ֤ͤ롣
Bit 6  7 ͽ󤵤Ƥ롣
(֤ޤhigh/low γդ˴ؤƤϤޤΤǤϤޤ)



ԥ³ (25 ԥ D-sub ᥹ͥ) (i=input, o=output):
   1 io   -STROBE
   2 io   D0
   3 io   D1
   4 io   D2
   5 io   D3
   6 io   D4
   7 io   D5
   8 io   D6
   9 io   D7
  10 i    ACK
  11 i    -BUSY
  12 i    PE
  13 i    SLCT
  14 o    AUTO_FD_XT
  15 i    ERROR
  16 o    -INIT
  17 o    SLCT_IN
  18-25   

IBM εʤˤС1, 14, 16, 17 ֥ԥ()ϡ4.7k 5V 
ץ륢åפ줿ץ󥳥쥯ɥ饤 ((ۤ) 20mA, 
(ǤФ) 0.55mA, ϥ٥νϤ ץ륢åפ 5V)

¾ΥԥˤĤƤϡ(ۤ) 24mA, (ǤФ) 15mA,
ϥ٥ϤϺǤ 2.4V, ٥νϤϺǤ 0.5V

IBM ʳΥѥݡȤǤϤ餯ɸȤϾ㤦⤢Ǥ礦

Ǹ: ()ˤϵĤޤ礦ϥԥ塼Ư
ͥ³ǡѥݡȤƤޤäиޤ
ͤȡޥܡɤ˾äƤΤǤϤʤ(ĥɾ)ѥ
ݡȤȤΤ⤷ޤ͡
(: ƵΥե졼॰ɤϡȤȤޤ礦͡)




(祤ƥå)ݡ (ݡ 0x200-0x207): (̤Υ祤ƥå
椹ˤϡͥ٥Υ祤ƥåɥ饤Фޤ
ftp://sunsite.unc.edu/pub/Linux/kernel/patches/joystick-* )

ԥ³ (15 ԥ D-sub ᥹ͥ):
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 ٥ϤǡʲǽҤ٤륹ơݡȤ
ߤξ֤ɤ߽ФȤǤޤ

祤ƥåΥܥ󤬲Ƥ low (0V) 򡢤Ǥʤ
high (1K 񹳤̤ 5V Ÿ˥ץ륢å) ɤ߽Фޤ



륢ʥϤȤΤϡºݤˤͤפäƤΤǤ
ʲǤλȤߤҤ٤ޤ

ݡȤˤ4ܤϤ줾˥󥷥åȥޥХ֥졼
³Ƥޤ((4) 558 åװ)
줾ϤˤĤơϥԥȥޥХ֥졼νϤδ֤ 
2.2K 񹳤ޥХ֥졼νϤȥɤδ֤ 0.01uF
Υߥѥǥ󥵤³ƤޤºݤΥ祤ƥåˤϡ
X  Yξμˤ줾ݥƥ󥷥᡼ꡢ+5V Ȥ줾
ϥԥ³Ƥޤ(AX, AY 祤ƥå A ˡ
BX, BY 祤ƥå B бޤ)

(: ϩޤϤʴ:

+5V
 |       ^
 |      /          2.2K
 +---/\/\/\--IN----/\/\/\------+
       /                       |
 ݥƥ󥷥᡼              |
                  +---------+  |
                  | Multi   |  |
                  | vib.   Q|--+
                  |         |  |
                  |         |  |
                  |         |  |
                  |         | === 0.01uF
                  |         |  |
                  +---------+  |
                               |
                              GND
)

ޥХ֥졼ưȡνϤ high (5V) ˥ɥ饤֤
줾³Ƥ륿ߥ󥰥ǥ󥵤Ṳ̋ 3.3V ˤʤޤ
Ԥθ˽Ϥ low ˤޤη̡ޥХ֥졼νϤ
high λ֤ϥ祤ƥåΥݥƥ󥷥᡼ͤ㤷ޤ
(Ĥޤꡢ줾μΥ祤ƥåΰ֤ɽޤ)
ͤϰʲμΤȤǤ:
   R = (t - 24.2) / 0.011,
ǡR  ݥƥ󥷥᡼()t  high λ()
Ǥ


Ȥޤ櫓ǤΤǡʥϤɤ߽Фˤϡʲ
Ҥ٤褦ˤޤݡȤ˥饤ȤơޥХ֥졼ưɬפ
ޤ

θ4Ĥμξ֤ݡ(ݡȤ򷫤֤ɤ߽Ф)
줾ΥݡȤ high  low ˤʤޤǤλ֤¬ꤷޤ

Υݡ󥰤ˤ CPU 񤷤ޤLinux Τ褦
ꥢ륿ࡦޥƥǤϤη̤ϤޤΤǤϤޤ
ݡȤ䤨֤ʤɤ߽ФȤϤǤʤǤ(ͥ٥Υɥ饤
Ȥݡ󥰤δֳߤػߤФΤǤϹ¿
CPU 򿩤ޤ)

ơɬפΤݡȤϤġ0x201 (¾Υݡȥɥ쥹Ϥ
ݡȤƱ褦ˤդޤʤˤ⤷ʤΤɤ餫)Ǥ
ΥݡȤФ饤(񤭹ǡϤʤǤɤǤ)ˤä
ޥХ֥졼ưޤ꡼ɤϿξ֤֤ޤ:

Bit 0: AX (ޥХ֥졼Ϥξ (1=high))
Bit 1: AY (ޥХ֥졼Ϥξ (1=high))
Bit 2: BX (ޥХ֥졼Ϥξ (1=high))
Bit 3: BY (ޥХ֥졼Ϥξ (1=high))
Bit 4: BA1 (ǥ , 1=high)
Bit 5: BA2 (ǥ , 1=high)
Bit 6: BB1 (ǥ , 1=high)
Bit 7: BB2 (ǥ , 1=high)


ޤȤʥʥ I/O ɬפʾˤϡADC (ʥ -> ǥ С)
 DAC (ǥ -> ʥ С)åפѥݡȤ³Ȥ
ˡ⤢ޤ(ҥ: ŸˤϵĤƲݡȤŸ
Ȥǥɥ饤Ѥ;äƤŸͥ򥳥ԥ塼
ĥФʤɤǤ礦ѥݡȤŸȤʤС
ΥǥХȤɬפޤ)(: ˤ衢ϥǥϤŸ
Ǥ顢ʥϤ˻ȤˤϤʤ餫ˡǥǥåץ󥰤˺ʤ)
ޤϡAD/DA ɤ(ۤȤɤ I/O ݡȤǤޤ)Ȥ
⤢ޤ

⤷12ͥǽʬǤꡢޤΤǤʤƤ褯(餯)
Τ(zeroing)Ǥ褱СLinux Υɥɥ饤
ǥݡȤƤ¤ɥɤäƤƻȤȤˡ⤢ޤ
(ˡ빽®Ǥ͡)




        ץ

ϡI/O ݡȥñʥǥǤ:
(: ͤޤǤ˥ȤʬФƤޤgcc ܸ쥳
Ȥ뤫ɤԤϳǧƤޤ)

/*
 * example.c: ȤäƤñ ݡ I/O 
 *
 * ʤˤˤĤȤϤƤޤ󡣥ݡȤ˽񤭹ߡߤơ
 * ݡȤɤߤǤgcc -O2 -o example example.c
 * Ȥޥɥ饤ǥѥ뤷Ʋ
 */

#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-D7) 򥪡 low (0) ˤ */
  outb(0,BASEPORT);
  
  /* Ф餯 (100000us = 100ms) ꡼פ */
  usleep(100000);
  
  /* ơݡ (BASE + 1) ɤ߽Фơɽ */
  printf("status: %d\n",inb(BASEPORT+1));

  /* ⤦ݡȤȤʤΤǸ */
  if (ioperm(BASEPORT,3,0)) {perror("ioperm");exit(1);}

  exit(0);
}

/* end of example.c */



        ռ

ȤƤ⤿ (contribute) ޤΤǡˤϵ
ޤ󡣳󡢤ȤƤ⤢꤬Ȥ
٤Ƥ˥ץ饤뤳ȤϤǤޤǤˤ
ʤƤ⤦١ƤƤ꤬Ȥ


End of the Linux I/O port programming mini-HOWTO.

