lptctl.c revision 1.4 1 1.4 jdolecek /* $NetBSD: lptctl.c,v 1.4 2004/01/28 09:21:55 jdolecek Exp $ */
2 1.3 bjh21
3 1.1 jdolecek #include <stdio.h>
4 1.1 jdolecek #include <fcntl.h>
5 1.1 jdolecek #include <string.h>
6 1.1 jdolecek #include <unistd.h>
7 1.2 jdolecek #include <stdlib.h>
8 1.2 jdolecek #include <err.h>
9 1.1 jdolecek
10 1.1 jdolecek #include <sys/ioctl.h>
11 1.1 jdolecek
12 1.1 jdolecek #include <dev/ppbus/lptio.h>
13 1.1 jdolecek
14 1.1 jdolecek /* Prototypes */
15 1.2 jdolecek static void usage(int status);
16 1.2 jdolecek static void print_lpt_info(int);
17 1.1 jdolecek
18 1.1 jdolecek int
19 1.1 jdolecek main(const int argc, const char * const * argv) {
20 1.1 jdolecek unsigned long ioctl_cmd = 0;
21 1.1 jdolecek int fd;
22 1.1 jdolecek int i;
23 1.1 jdolecek
24 1.2 jdolecek setprogname(argv[0]);
25 1.2 jdolecek
26 1.1 jdolecek /* N = command name + device name + number of command-arg pairs */
27 1.1 jdolecek /* Check number of arguments: at least 2, always even */
28 1.2 jdolecek if((argc < 2) || (argc % 2 != 0))
29 1.2 jdolecek usage(1);
30 1.1 jdolecek
31 1.2 jdolecek if ((fd = open(argv[1], O_RDONLY, 0)) == -1)
32 1.2 jdolecek err(2, "device open");
33 1.1 jdolecek
34 1.1 jdolecek /* Get command and arg pairs (if any) and do an ioctl for each */
35 1.1 jdolecek for(i = 2; i < argc; i += 2) {
36 1.2 jdolecek if (strcmp("dma", argv[i]) == 0) {
37 1.2 jdolecek if (strcmp("on", argv[i + 1]) == 0) {
38 1.1 jdolecek printf("Enabling DMA...\n");
39 1.1 jdolecek ioctl_cmd = LPTIO_ENABLE_DMA;
40 1.2 jdolecek } else if (strcmp("off", argv[i + 1]) == 0) {
41 1.1 jdolecek printf("Disabling DMA...\n");
42 1.1 jdolecek ioctl_cmd = LPTIO_DISABLE_DMA;
43 1.2 jdolecek } else {
44 1.2 jdolecek errx(2, "invalid '%s' command argument '%s'",
45 1.2 jdolecek argv[i], argv[i + 1]);
46 1.1 jdolecek }
47 1.2 jdolecek } else if (strcmp("mode", argv[i]) == 0) {
48 1.2 jdolecek if (strcmp("standard", argv[i + 1]) == 0) {
49 1.1 jdolecek printf("Using standard mode...\n");
50 1.1 jdolecek ioctl_cmd = LPTIO_MODE_STD;
51 1.2 jdolecek } else if (strcmp("ps2", argv[i + 1]) == 0) {
52 1.1 jdolecek printf("Using ps2 mode...\n");
53 1.1 jdolecek ioctl_cmd = LPTIO_MODE_PS2;
54 1.2 jdolecek } else if (strcmp("nibble", argv[i + 1]) == 0) {
55 1.1 jdolecek printf("Using nibble mode...\n");
56 1.1 jdolecek ioctl_cmd = LPTIO_MODE_NIBBLE;
57 1.2 jdolecek } else if (strcmp("fast", argv[i + 1]) == 0) {
58 1.1 jdolecek printf("Using fast centronics mode...\n");
59 1.1 jdolecek ioctl_cmd = LPTIO_MODE_FAST;
60 1.2 jdolecek } else if (strcmp("ecp", argv[i + 1]) == 0) {
61 1.1 jdolecek printf("Using ecp mode...\n");
62 1.1 jdolecek ioctl_cmd = LPTIO_MODE_ECP;
63 1.2 jdolecek } else if (strcmp("epp", argv[i + 1]) == 0) {
64 1.1 jdolecek printf("Using epp mode...\n");
65 1.1 jdolecek ioctl_cmd = LPTIO_MODE_EPP;
66 1.2 jdolecek } else {
67 1.2 jdolecek errx(2, "invalid '%s' command argument '%s'",
68 1.2 jdolecek argv[i], argv[i+1]);
69 1.1 jdolecek }
70 1.2 jdolecek } else if (strcmp("ieee", argv[i]) == 0) {
71 1.2 jdolecek if (strcmp("yes", argv[i + 1]) == 0) {
72 1.1 jdolecek printf("Using IEEE...\n");
73 1.1 jdolecek ioctl_cmd = LPTIO_ENABLE_IEEE;
74 1.2 jdolecek } else if (strcmp("no", argv[i + 1]) == 0) {
75 1.1 jdolecek printf("Not using IEEE...\n");
76 1.1 jdolecek ioctl_cmd = LPTIO_DISABLE_IEEE;
77 1.2 jdolecek } else {
78 1.2 jdolecek errx(2, "invalid '%s' command argument '%s'",
79 1.2 jdolecek argv[i], argv[i+1]);
80 1.1 jdolecek }
81 1.2 jdolecek } else {
82 1.2 jdolecek errx(2, "invalid command '%s'", argv[i]);
83 1.1 jdolecek }
84 1.1 jdolecek
85 1.1 jdolecek /* Do the command */
86 1.2 jdolecek if (ioctl(fd, ioctl_cmd, NULL) == -1)
87 1.2 jdolecek err(2, "%s: ioctl", __func__);
88 1.1 jdolecek }
89 1.1 jdolecek
90 1.1 jdolecek /* Print out information on device */
91 1.1 jdolecek print_lpt_info(fd);
92 1.1 jdolecek
93 1.1 jdolecek exit(0);
94 1.2 jdolecek /* NOTREACHED */
95 1.1 jdolecek }
96 1.1 jdolecek
97 1.2 jdolecek static void
98 1.1 jdolecek print_lpt_info(int fd) {
99 1.1 jdolecek LPT_INFO_T lpt_info;
100 1.1 jdolecek
101 1.2 jdolecek if (ioctl(fd, LPTIO_GET_STATUS, &lpt_info) == -1) {
102 1.4 jdolecek warnx("%s: ioctl", __func__);
103 1.4 jdolecek return;
104 1.4 jdolecek }
105 1.4 jdolecek
106 1.4 jdolecek printf("dma=%s ", (lpt_info.dma_status) ? "on" : "off");
107 1.1 jdolecek
108 1.4 jdolecek printf("mode=");
109 1.4 jdolecek switch(lpt_info.mode_status) {
110 1.4 jdolecek case standard:
111 1.4 jdolecek printf("standard ");
112 1.4 jdolecek break;
113 1.4 jdolecek case nibble:
114 1.4 jdolecek printf("nibble ");
115 1.4 jdolecek break;
116 1.4 jdolecek case fast:
117 1.4 jdolecek printf("fast ");
118 1.4 jdolecek break;
119 1.4 jdolecek case ps2:
120 1.4 jdolecek printf("ps2 ");
121 1.4 jdolecek break;
122 1.4 jdolecek case ecp:
123 1.4 jdolecek printf("ecp ");
124 1.4 jdolecek break;
125 1.4 jdolecek case epp:
126 1.4 jdolecek printf("epp ");
127 1.4 jdolecek break;
128 1.4 jdolecek }
129 1.1 jdolecek
130 1.4 jdolecek printf("ieee=%s ", (lpt_info.ieee_status) ? "yes" : "no");
131 1.1 jdolecek
132 1.4 jdolecek printf("\n");
133 1.1 jdolecek }
134 1.1 jdolecek
135 1.2 jdolecek static void
136 1.2 jdolecek usage(int status) {
137 1.2 jdolecek printf("usage:\t%s /dev/device [[command arg] ...]"
138 1.1 jdolecek "\n\t commands are:\n\tdma [on|off]\n\tieee [yes|no]"
139 1.2 jdolecek "\n\tmode [standard|ps2|nibble|fast|ecp|epp]\n",
140 1.2 jdolecek getprogname());
141 1.2 jdolecek exit(status);
142 1.1 jdolecek }
143