SUMMARY: Method to determine type 4 or 5 keyboards

From: Clayton Castle (cwc@netcom.com)
Date: Mon Jun 28 1993 - 04:52:14 CDT


This is a summary posting !
---------------------------------------------------------------------------
 Original Question:

 In comp.sys.sun.hardware you write:

>Does anyone know of a way to determine the difference
>between a sun type 4 keyboard, and the new type 5 ones.
>(or even between the two type 5 versions).

>The ioctl(KIOCTYPE) call always returns type4 for
>all of the above versions.

---------------------------------------------------------------------------
 Short and Sweet Answer:

> From: terai@mink.nri.co.jp (TERAI Kojun)

Following code segment can be used.

------ cut here -----
#include <stdio.h>
#include <fcntl.h>
#include <sundev/kbio.h>
#include <sys/ioctl.h>

void main()
{
    int fd, type,type2;

    fd = open("/dev/kbd", O_RDWR, 0);
    ioctl(fd, KIOCTYPE, &type);
    ioctl(fd, KIOCLAYOUT, &type2);
        printf("KIOCTYPE = %d\n",type);
        printf("KIOCLAYOUT = %d\n",type2);
        if( type2 == 32 ){
                fprintf(stdout,"type4\n");
        }else if( type2 == 49){
                fprintf(stdout,"type5\n");
        }else{
                fprintf(stdout,"Error\n");
        }
}

-------------------------------------------------------------------
Everything You Always Wanted To Know,
But Were Afraid To Ask !

> From: khaw@parcplace.com (Mike Khaw)

 You have to distinguish type 4 from type 5 by layout:

--- CUT HERE ---
/* tested on SunOS 4.1.3. Don't know about Solaris 2.x */
#include <stdio.h>
#include <errno.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sundev/kbio.h>
#include <sundev/kbd.h>

static char *kbdname[] =
  {
        "Micro Switch 103SD32-2", /* KB_KLUNK == 0x00 [0] */
        "Keytronics VT100 clone", /* KB_VT100 == 0x01 */
        "Sun type 2", /* KB_SUN2 == 0x02 */
        "Sun type 3", /* KB_SUN3 == 0x03 */
        "Sun type 4", /* KB_SUN4 == 0x04 && layout == 0 */
        "generic ASCII terminal", /* KB_ASCII == 0x0F [5] */
        "Sun type 5 unknown", /* KB_SUN4 && layout not in [33,49] */
        "Sun type 5 PC", /* KB_SUN4 && layout == 33 */
        "Sun type 5 Unix", /* KB_SUN4 && layout == 34 */
        "Sun type 5 French", /* KB_SUN4 && layout == 35 */
        "Sun type 5 Danish", /* KB_SUN4 && layout == 36 */
        "Sun type 5 German", /* KB_SUN4 && layout == 37 */
        "Sun type 5 Italian", /* KB_SUN4 && layout == 38 */
        "Sun type 5 Dutch", /* KB_SUN4 && layout == 39 */
        "Sun type 5 Norwegian", /* KB_SUN4 && layout == 40 */
        "Sun type 5 Portuguese", /* KB_SUN4 && layout == 41 */
        "Sun type 5 Spanish", /* KB_SUN4 && layout == 42 */
        "Sun type 5 Swedish/Finnish", /* KB_SUN4 && layout == 43 */
        "Sun type 5 Swiss/French", /* KB_SUN4 && layout == 44 */
        "Sun type 5 Swiss/German", /* KB_SUN4 && layout == 45 */
        "Sun type 5 UK", /* KB_SUN4 && layout == 46 */
        "Sun type 5 Korean", /* KB_SUN4 && layout == 47 */
        "Sun type 5 Taiwanese", /* KB_SUN4 && layout == 48 */
        "Sun type 5 Nihon-go", /* KB_SUN4 && layout == 49 */
        0
  };

#define type5index(x) ((32 < (x) && (x) < 50) ? ((x) - 33 + 7) : 6)

main()
{
        int ktype = kbdtype();

        (void) puts((ktype >= 0) ? kbdname[ktype] : "unknown");
        return 0;
}

  int
kbdtype()
{
        int fd;
        int status = 0;
        int ktype;
        int layout;

        if ((fd = open("/dev/kbd", O_RDONLY)) < 0)
                return -1;

        if (ioctl(fd, KIOCTYPE, &ktype) < 0)
          {
                (void) close(fd);
                return -1;
          }

        if (ktype == KB_SUN4 && ioctl(fd, KIOCLAYOUT, &layout) < 0)
          {
                (void) close(fd);
                return -1;
          }

        if (ktype < KB_SUN4)
                return ktype;

        if (ktype == KB_ASCII)
                return 5;

        if (ktype > KB_ASCII)
                return -1;

        /* beyond here it must be a Sun type 5 of some sort */

        if (layout == 0)
                return ktype;

        return type5index(layout);
}
--- CUT HERE ---

-- 
Michael Khaw	khaw@parcplace.com (or khaw%parcplace.com@netcom.com)
ParcPlace Systems, Sunnyvale, CA	PRODUCT INFO: info@parcplace.com

--------------------------------------------------------------------- My X11R5 directory has kbd_mode, but not kbdtype. Haven't checked old stuff yet. The person I posted this for just found a kludgy way to do it with xmodmap. It only works under X though, making the above better solutions. However, if the server knows, it has to be somewhere in the X11R5 code. Maybe it moved in R5 ?

> From: rj@rainbow.in-berlin.de (Robert Joop)

try <your X11R5 directory>/mit/server/ddx/sun/kbdtype, source is in the same directory.

rj -- =

Robert Joop rj@{rainbow.in-berlin,fokus.gmd,cs.tu-berlin}.de s=3Djoop;ou=3Dfokus;ou=3Dberlin;p=3Dgmd;a=3Ddbp;c=3Dde

---------------------------------------------------------------------

Thank you for all your help !

Clayton Castle (cwc@netcom.com)



This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:07:58 CDT