MOUSE(4)

명칭
mouse - 마우스, pointing device용 드라이버

서식
#include <machine/mouse.h>

해설
마우스 드라이버 mse(4), psm(4), sysmouse(4) (은)는 유저 프로그램에 마우스의 움직임이나 버튼 상태의 정보를 제공합니다. 현재로서는, 버스 마우스용, InPort 마우스용, PS/2 마우스용의 특유의 디바이스 드라이버가 있습니다. 시리얼 마우스는, 전용의 드라이버에서는 직접 서포트되고는 있지 않습니다만, 시리얼 디바이스 드라이버를 개입시켜, 혹은 moused(8) (이)나 sysmouse(4) (을)를 경유해 액세스 할 수 있습니다.

유저 프로그램에서는, 단순하게 open(2) 호출로 마우스 디바이스를 오픈해, read(2) 그리고 디바이스로부터 마우스의 데이터를 읽어냅니다. 움직임과 버튼 상태는 통상, 고정장의 데이터 패킷에 encode 됩니다. 마우스 디바이스에 따라서는, 가변장의 패킷으로 데이터를 보낼지도 모릅니다. 각각의 드라이버가 실제로 이용하는 프로토콜 (데이터 형식)은 크게 다릅니다.

마우스 드라이버는 ``비블로킹''속성을 가질 수가 있습니다. 그 경우, 마우스 데이터를 취득할 수 없으면 드라이버는 곧바로 돌아옵니다.

마우스 디바이스 드라이버는 대체로 몇개의 레벨의 조작을 제공합니다. 현재의 조작 레벨은 ioctl(2) 명령로 조사, 변경할 수가 있습니다. 레벨 0 이 가장 낮은 레벨이며, 이 때 드라이버는 유저 프로그램에 기본적인 서비스를 제공합니다. 이 레벨에서는, 대부분의 드라이버가 마우스의 수평 이동과 수직 이동, 및 3 개(살)까지의 버튼 상태를 제공합니다. 레벨 1 에서는, 드라이버가 서포트하고 있는 경우, 마우스 데이터는 표준적인 형식의 MOUSE_PROTO_SYSMOUSE 에 encode 됩니다. 그 형식은 다음과 같습니다:

바이트 1
    비트 7
        항상 1 입니다.
    비트 6..3
        항상 0 입니다.
    비트 2
        왼쪽 버튼 상태: 밀리고 있으면 클리어 되어 그렇지 않으면 세트 됩니다.
    비트 1
        안버튼 상태: 밀리고 있으면 클리어 되어 그렇지 않으면 세트 됩니다. 디바이스가 안버튼을 가지지 않으면, 항상 1 입니다.
    비트 0
        오른쪽 버튼 상태: 밀리고 있으면 클리어 되어 그렇지 않으면 세트 됩니다.
바이트 2
    수평 이동량의 전반 부분의, 2 의 보수 표현입니다. -128 (으)로부터 127 의 범위가 됩니다.
바이트 3
    수직 이동량의 전반 부분의, 2 의 보수 표현입니다. -128 (으)로부터 127 의 범위가 됩니다.
바이트 4
    수평 이동량의 후반 부분의, 2 의 보수 표현입니다. -128 (으)로부터 127 의 범위가 됩니다. 수평 이동량 전체를 얻으려면 , 바이트 2 로 아르바이트 4 를 더해 주세요.
바이트 5
    수직 이동량의 후반 부분의, 2 의 보수 표현입니다. -128 (으)로부터 127 의 범위가 됩니다. 수직 이동량 전체를 얻으려면 , 바이트 3 으로 아르바이트 5 를 더해 주세요.
바이트 6
    비트 7 은 항상 0 입니다. 하위 7 비트는 Z 축이동량의 전반 부분을 2 의 보수 표현으로 encode 합니다. -64 (으)로부터 63 의 범위가 됩니다.
바이트 7
    비트 7 은 항상 0 입니다. 하위 7 비트는 Z 축이동량의 후반 부분을 2 의 보수 표현으로 encode 합니다. -64 (으)로부터 63 의 범위가 됩니다. 전체의 Z 축이동량을 얻으려면 , 바이트 6 으로 아르바이트 7 을 더해 주세요.
바이트 8
    비트 7 은 항상 0 입니다. 비트 0 에서 6 은 버튼 4 에서 10 상태를 나타냅니다. 버튼이 밀리고 있으면 대응하는 비트가 클리어 되어 그렇지 않으면 세트 됩니다.

이 형식의 최초의 5 바이트는 MouseSystems 형식과 호환이 되어 있습니다. 나머지의 3 바이트는, 최상정도 비트가 항상 0 에 세트 되고 있습니다. 그 때문에, 유저 프로그램이 MouseSystems 데이터 형식을 해석할 수 있어, 비트 패턴 10000xxxb 를 검출하는 것으로 이 데이터 형식의 1 바이트째를 찾아내려 하고 있는 경우, 추가 분의 바이트를 버리는 것에 의해, x, y 및 3 개의 버튼 상태를 올바르게 디코드할 수 있습니다.

디바이스 드라이버가 2 이상의 조작 레벨을 제공하는 일도 있습니다. 자세하게는 개개의 드라이버의 메뉴얼 페이지를 참조해 주세요.

IOCTL
다음의 ioctl(2) 명령이 마우스 드라이버용으로 정의되고 있습니다. 서포트의 상황은 드라이버에 의해 바뀝니다. 본섹션에서는 명령의 일반적인 해설을 적습니다. 특정의 드라이버의 상세한 것에 대하여는, 개개의 드라이버의 메뉴얼 페이지를 참조해 주세요.

MOUSE_GETLEVEL int *level
MOUSE_SETLEVEL int *level
    이러한 명령은 마우스 드라이버의 조작 레벨을 취급합니다.

MOUSE_GETHWINFO mousehw_t *hw
    접속되고 있는 디바이스의 하드웨어 정보를 다음의 구조체에 돌려줍니다. iftype 필드 이외는, 디바이스 드라이버가 반드시 올바른 값으로 구조몸을 묻는다고는 할 수 없습니다. 서포트의 자세한 것은 개개의 드라이버의 메뉴얼 페이지를 참조해 주세요.

        typedef struct mousehw {
            int buttons;    /* 버튼수 */
            int iftype;     /* I/F 의 형태 */
            int type;       /* 마우스/트랙볼/track pad... */
            int model;      /* I/F 의존의 모델 ID */
            int hwid;       /* I/F 의존의 하드웨어 ID */
        } mousehw_t;

    buttons 필드는 드라이버가 검출한 버튼수를 보관 유지합니다. 드라이버가 정확한 수를 검출할 수 없으면, 2 등이 적당한 값이 이 필드에 대입되는 일도 있습니다.

    iftype (은)는 인터페이스의 형태로, MOUSE_IF_SERIAL, MOUSE_IF_BUS, MOUSE_IF_INPORT, MOUSE_IF_PS2, MOUSE_IF_SYSMOUSE, MOUSE_IF_UNKNOWN 의 머지않아인가입니다.

    type (은)는 디바이스의 형태를 나타내, MOUSE_MOUSE, MOUSE_TRACKBALL, MOUSE_STICK, MOUSE_PAD, MOUSE_UNKNOWN 의 머지않아인가입니다.

    model 하 MOUSE_MODEL_GENERIC 인가, 혹은 정수 MOUSE_MODEL_XXX 중 1 개입니다.

    hwid (은)는 그 pointing device가 돌려주는 ID 치입니다. 이것은 인터페이스의 형태에 의. 취할 수 있는 값에 대해서는 특정의 마우스 드라이버의 메뉴얼 페이지를 참조해 주세요.

MOUSE_GETMODE mousemode_t *mode
    본명령은 마우스 드라이버의 현재의 조작 파라미터를 보고합니다.

        typedef struct mousemode {
            int protocol;    /* MOUSE_PROTO_XXX */
            int rate;        /* 보고 빈도 (초단위) */
            int resolution;  /* MOUSE_RES_XXX, 불명하면 -1 */
            int accelfactor; /* 가속화의 요소 */
            int level;       /* 드라이버의 조작 레벨 */
            int packetsize;  /* 데이터 패킷의 길이 */
            unsigned char syncmask[2]; /* 동기 비트 */
        } mousemode_t;

    protocol 필드는, 유저 프로그램이 마우스 데이터를 읽어낼 때에, 디바이스 상태가 돌려주어지는 형식을 나타냅니다. 이것은 정수 MOUSE_PROTO_XXX 중 하나입니다.

    rate 필드는 상태 보고의 빈도 (회/초)이며, 디바이스는 이 빈도로 호스트 컴퓨터에 이동 보고를 보냅니다. 불명한가 또는 적용할 수 없으면 -1 입니다.

    resolution 필드는 pointing device의 해상도를 나타내는 값을 보관 유지합니다. 정의 값인가, 정수 MOUSE_RES_XXX 중 1 개입니다.

    accelfactor 필드는, 가속화 기능을 제어하기 위한 치를 보관 유지합니다. 이 값은 0 이상이 아니면 안됩니다. 0 이면 가속화 기능은 무효입니다.

    packetsize 필드는, 고정 사이즈의 데이터 패킷의 길이 또는 가변장 패킷의 고정부의 길이를 나타냅니다. 이 사이즈는, 인터페이스의 형태, 디바이스의 형태나 모델, 드라이버의 프로토콜이나 조작 레벨에 의존합니다.

    배열 syncmask (은)는, 데이터 패킷의 1 바이트째를 검출하기 위한 비트 마스크와 비트 패턴을 보관 유지합니다. syncmask[0] (은)는 비트 마스크로, 데이터의 바이트와의 적 (AND)을 취하기 위한 것입니다. 그 결과가 syncmask[1] 에 동일하면, 아마 그 바이트는 데이터 패킷의 1 바이트째지요. 단 이 1 바이트째의 검출법은 100% 신뢰성이 있다고는 말할 수 없습니다. 그러므로, 단지 보조적인 수단이라고 파악해 주세요.

MOUSE_SETMODE mousemode_t *mode
    본명령은, 마우스 드라이버의 현재의 조작 파라미터를 mode 그리고 지정되는 대로 변경합니다. 변경 가능한 것은, rate, resolution, level, accelfactor 뿐입니다. 다른 필드에 값을 대입해도, 에러는 발생하지않고, 효과도 없습니다.

    어느 필드의 현재의 설정을 변경하고 싶지 않을 때는, 그 필드에 -1 를 넣어 주세요. 또 resolution (와)과 rate 에는 0 을 넣을 수도 있습니다. 그렇다면, 그 필드의 기본값이 선택됩니다.

MOUSE_READDATA mousedata_t *data
    본명령은 디바이스로부터 생의 데이터를 읽어냅니다.

        typedef struct mousedata {
            int len;        /* 버퍼내의 데이터수 */
            int buf[16];    /* 데이터용 버퍼 */
        } mousedata_t;

    호출원프로세스는, 버퍼에 읽히는 바이트수를 len 필드에 넣어 두지 않으면 안됩니다. 본명령은 모든 드라이버가 서포트하고 있다고는 할 수 없습니다.

MOUSE_READSTATE mousedata_t *state
    본명령은 디바이스로부터 생 상태 데이터를 읽어냅니다. 상기와 같은 구조체를 사용합니다. 본명령은 모든 드라이버가 서포트하고 있다고는 할 수 없습니다.

MOUSE_GETSTATE mousestatus_t *status
    본명령은, 현재의 버튼 상태와 이동량을 다음의 구조체에 돌려줍니다.

        typedef struct mousestatus {
            int flags;      /* 상태 변경 플래그 */
            int button;     /* 버튼 상태 */
            int obutton;    /* 이전의 버튼 상태 */
            int dx;         /* x 방향의 이동 */
            int dy;         /* y 방향의 이동 */
            int dz;         /* z 방향의 이동 */
        } mousestatus_t;

    button 필드와 obutton 필드는, mouse button의 현재 상태와 이전 상태를 보관 유지합니다. 버튼이 밀렸을 때, 대응하는 비트가 세트 됩니다. 마우스 드라이버는 0 에서 31 까지의 비트를 사용해 31 개까지의 버튼을 서포트할 수 있습니다. 몇개의 버튼 비트가 MOUSE_BUTTON1DOWN (으)로부터 MOUSE_BUTTON8DOWN (으)로서 정의되고 있습니다. 최초의 3 개의 버튼은, 왼쪽 버튼, 안버튼, 오른쪽 버튼에 대응합니다.

    전회의 MOUSE_GETSTATE 호출로부터 버튼 상태가 변하면, flags 필드의 대응하는 비트가 세트 됩니다. 전회의 호출로부터 마우스가 이동하고 있으면, flags 필드안의 MOUSE_POSCHANGED 비트도 세트 됩니다.

    그 외의 필드는, 전회의 MOUSE_GETSTATE 호출로부터의 이동량을 보관 유지합니다. 본명령이 불려 간 후에, 매회 내부 카운터가 리셋트 됩니다.

관련 파일
/dev/cuaa%d
    시리얼 포트
/dev/mse%d
    버스 마우스, InPort 마우스 디바이스
/dev/psm%d
    PS/2 마우스 디바이스
/dev/sysmouse
    가상 마우스 디바이스

관련 항목
ioctl(2), mse(4), psm(4), sysmouse(4), moused(8)

저자
본메뉴얼 페이지는 Kazutaka Yokota <yokota@FreeBSD.org> 하지만 썼습니다.