GSC(4)

명칭
gsc - 핸디 스캐너용 디바이스 드라이버

서식
#include <machine/gsc.h>

마이나 번호 비트: uu d g p ...
uu  유니트 gsc0 .. gsc3
d   디버그 메세지의 기록을 선택
g   비트 맵 또는 회색 MAP 출력을 선택
p   raw 또는 portable pnm 출력을 선택

해설
gsc 캐릭터 디바이스 드라이버는, 현재 Genius GS-4500 핸디 스캐너 만을 취급하고 있습니다. 이 드라이버는 하드웨어가 irq 를 사용해 동작 가능해도, 완전하게 dma 방식에서 제어를 행합니다. 나에게는 끼어들어 구동형의 디바이스 드라이버를 쓰는데 충분한 문서도 경험도 없습니다.

디바이스는, 다음의 4 개가 달랐다 해상도 그리고 동작 가능합니다: 100, 200, 300, 400dpi. 디바이스는 최상정도의 비트가 왼쪽으로 오는 심플한 비트 맵을 생성합니다. 드라이버는 Jef Poskanzer 에 의한, 잘 알려져 있어 적당히 심플한 휴대용 비트 맵 파일 형식 pbm(5) 그리고 출력할 수도 있습니다. 따라서 스캔의 결과는 그쯤 있는 어떠한 그래픽 패키지 (일부의 이름을 든다면 xpaint(1), xv(1), xli(1) 등)으로 간단하게 처리할 수가 있습니다. raw 모드에서는, 스캐너는 흰 지상의 검은 점을 검출하기 위해(때문에), 세트 된 비트는 검은 픽셀을 의미합니다. 반대로, pnm 포맷은 비디오 화면의 전자빔의 광도를 기술하기 위해(때문에), pbm 모드에 대해서는, 세트 된 비트는 흰 픽셀을 의미합니다.

출력된 비트 맵의 폭 (은)는 주어진 해상도치에 의해 고정됩니다. 그렇지만 pnm 모드에서는, 드라이버는 언제 '파일의 마지막'가 검출되었는지를 알고 있다 (은)는 두이므로, 비트 맵의 높이 (은)는 자동으로 설정됩니다. 이 기능에 의해, cat (을)를 이용해 스캐너 출력을 pbm 파일에 직접 카피할 수가 있습니다. 물론 드라이버를 raw 모드로 사용해 dd(1) (을)를 이용해 닮은 효과를 얻을 수 있습니다.

회색 MAP 출력 모드는 아직 드라이버에 실장되고 있지 않습니다. 외부 프로그램이 이 작업을 보다 잘 할 수 있을지 어떨지는 이상합니다만, 그 결과 커널의 크기가 줄어들지 어떨지는 의문으로 생각하고 있습니다. 다만 비록 그랬다고 해도 , 중간조비트 맵으로부터 회색 MAP를 생성하는 툴을 나는 모릅니다.

gsc 하지만 처리하는 ioctl 리퀘스트는 이하에 열거되고 있습니다. sgsc(1)로 불리는 유틸리티를 사용하면(자), 쉘로부터 이러한 리퀘스트에 액세스 할 수 있습니다.

GSC_SRES int
    해상도 의 값을 설정합니다. 디바이스에의 최초의 읽기 액세스의 뒤에, 이 호출을 행했을 경우는, 디바이스를 클로우즈 해 다시 오픈하지 않는 한 효과를 가지지 않습니다.

GSC_GRES int
    현재의 해상도를 1 인치 근처의 닷수 (dpi)로 취득합니다.

GSC_SRESSSW void
    해상도의 값을 실렉터 스윗치로 설정합니다. 드라이버는 오픈되고 있지만 접할 수 있지 않은 상태일 필요가 있습니다. 그렇지 않은 경우는 리퀘스트는 실패해, errno(2) 에는 EBUSY 가 들어갑니다.

GSC_SWIDTH int
    비트 맵의 폭 (을)를 설정합니다. 어떠한 설정 가능한 해상도도 바야흐로 하나의 폭에 대응하므로, 실제는 이 리퀘스트는 해상도를 설정하는 대신의 수단이 됩니다. 설정 가능한 값은 아래의 겉(표)에 열거되고 있습니다.
    해상도 폭
    100 dpi
        424 픽셀
    200 dpi
        840 픽셀
    300 dpi
        1264 픽셀
    400 dpi
        1648 픽셀
    ?   1696 픽셀
    ?   2544 픽셀
    ?   3648 픽셀

    위의 겉(표)에 쓰여지지 않은 값은 ioctl 호출해에 실패해, errno(2) 에는 EINVAL 하지만 들어갑니다.

    보았던 대로, 1696 보다 큰 폭의 값이 있습니다. 그러나, 이것은 스캐너의 폭보다 긴 라인을 스캔 할 수 있거나 좀 더 높은 해상도로 스캔 할 수 있거나 하는 것을 의미하는 것은 아닙니다. 실제, 해상도는 하드웨어 스윗치에만 따라 선택됩니다. 실제의 해상도로 정의되고 있는 이상의 길이의 라인으로, 표준의 라인의 길이를 넘었다 위 부분은 정의되고 있지 않습니다 (통상은 흰색이 됩니다).

GSC_GWIDTH int
    현재의 비트 맵의 폭을 픽셀수로 취득합니다.

GSC_SHEIGHT int
    pnm 모드에서의 비트 맵의 높이 (을)를 설정합니다. 실제로는 이 리퀘스트는 최초의 읽기 조작의 뒤, 스캔 할 수 있는 라인수의 합계를 제한합니다. 제한치에 이르렀을 때, 읽기는 0 을 돌려줍니다. 그러나, (호출 프로세스의 종료시에, 명시적 혹은 암묵적으로) 디바이스가 클로우즈 되었을 때에게만, 전원은 절단 됩니다.

GSC_GHEIGHT int
    현재의 비트 맵의 높이를 취득합니다.

GSC_SBLEN int
    DMA 전송에 내부에서 사용하는 버퍼의 길이를 설정합니다. 버퍼의 길이는 비트 맵의 라인수로 주어집니다. 버퍼의 사이즈는 (현재) 0x3000 바이트에 제한되고 있으므로, 용서되는 라인의 최대수는 각 라인의 폭에 의해 변화합니다. 이 상한은, 현재의 값을 덧쓰기해 errno(2) 변수에 ENOMEM 를 넣어 버리기 전에 체크됩니다. 그러나, 버퍼 라인수를 선택한 후도 비트 맵의 폭을 변경하는 것은 할 수 있으므로, 버퍼 라인수가 너무 큰 것을 알 수 있었을 때는 읽기 리퀘스트는 ENOMEM 로 실패할지도 모릅니다. 일반적으로는 보다 좋은 출력을 얻기 위해서(때문에)는, 절약하는 것보다도 긴 버퍼를 선택하는 (분)편이 영리합니다.

GSC_GBLEN int
    현재의 버퍼의 길이를 라인수로 취득합니다.

GSC_SBTIME int
    1 개의 버퍼를 다 읽어들일 때까지 의 타임 아웃 시간을 설정합니다. 핸디 스캐너는 플랫 스캐너보다, 인간 / 컴퓨터 인터페이스의 타임 아웃 시간이 길기 때문에, 디폴트에서는 15 초에 되어 있습니다. 타임 아웃 시간 후는, 읽기 조작은 EBUSY 로 실패합니다. 타임 아웃 타이머는 각각의 버퍼가 읽힐 때에 새롭게 개시되므로, 긴 이미지를 빨리 스캔 할 수 있게 된다 것은 아닌 것에 주의해 주세요. BLEN/BTIME 는 termios(4)의 MIN/TIME 와 닮아 있습니다.

GSC_GBTIME int
    현재의 버퍼의 타임 아웃 시간을 취득합니다.

파라미터를 변경하는 GSC_SBTIME 이외의 모든 ioctl 리퀘스트는, 현재 진행중의 스캔 프로세스에는 영향을 주지 않습니다. 즉 최초의 읽기 리퀘스트시의 설정이 디바이스의 오픈중은 계속됩니다. 영향을 미치려면 디바이스를 클로우즈 해 다시 오픈할 필요가 있습니다. 따라서, 설정은 디바이스를 클로우즈 하는지 오픈할 때까지 리셋트 되지 않습니다.

같이 설정치를 읽는 리퀘스트는 현재 진행중의 스캔 프로세스로 사용되고 있는 값을 보고하지 않습니다. 스캔 프로세스가 필요로 하는 값은 개시시에 보존되고 있으므로, ioctl 리퀘스트에서는 액세스 할 수 없습니다.

그러나 BTIME 치는 현재 진행중의 스캔에 곧바로 반영됩니다. 따라서 타임 아웃 시간은, 예를 들면 유저가 스캔을 개시할 때까지의 긴 시간으로 설정할 수가 있습니다. 또 유저가 정지하면(자) (거의) 곧바로 반응할 수 있는 것 같은 짧은 시간에 설정할 수도 있습니다. 유저가 당황하는 일 없이 하나의 버퍼를 묻을 수 있을 뿐(만큼)의 시간은, 최악이어도 남긴다 필요가 있는 것에 주의해 주세요.

pbm (와)과 raw 의 모드 선택은, ioctl 리퀘스트가 아니고, 마이나 번호에 의해 행해진다 일로 주의해 주세요. raw 모드에서는, 선택된 비트 맵의 높이는 무슨 효과도 가지지 않습니다.

관련 파일

/dev/gsc0
    raw 출력을 위한 디바이스 노드로, 마이나 번호는 0 입니다.

/dev/gsc0d
    raw 출력을 위한 디바이스 노드로, 컴파일시에 GSCDEBUG 옵션이 설정되어 있으면(자), debug 메세지를 출력합니다. 마이나 번호는 32 입니다.

/dev/gsc0p
    pbm 파일 포맷 출력을 위한 디바이스 노드로, 마이나 번호는 8 입니다.

/dev/gsc0pd
    pbm (와)과 debug 모드를 위한 디바이스 노드로, 마이나 번호는 40 입니다.

사용예

    dd if=/dev/gsc0 of=rawfile bs=(width/8) count=(height)
    cat /dev/gsc0p > pbmfile

진단

GSCDEBUG
    커널 설정으로 이 명칭을 `option'로서 정의하면(자), 디버그 비트 (즉 7 비트중의 비트 5)가 세트 된 마이나 번호 그리고 드라이버에 액세스 했을 경우 디버그 출력을 얻을 수 있습니다.

관련 항목
cat(1), dd(1), pbmtopgm(1), pnm(1), sgsc(1), close(2), intro(2), ioctl(2), open(2), read(2), termios(4), pbm(5)

저자
Gunther Schadow <gusw@fub46.zedat.fu-berlin.de>

버그
비록 스캐너 디바이스에, 4 개의 해상도중 1 개(살)을 선택할 수 있도록(듯이) 되어 있는 작은 스윗치가 있었다고 해도, 나에게는 아직 그 상태를 알 방법이 알고 있지 않습니다. 이 문제가 해결되지 않는 이상 하드웨어로 선택한 해상도와 일치하는 프로텍션 (이)가 없는 ioctl(2)로 건네준 값에 드라이버는 의존합니다.