Commit 6972f93538fc3ad18e791c69ffa1342da11d7159
1 parent
5f8712aa
Native FreeBSD parallel port (Juergen Lock)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5779 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
65 additions
and
0 deletions
qemu-char.c
| ... | ... | @@ -63,6 +63,8 @@ |
| 63 | 63 | #include <sys/stat.h> |
| 64 | 64 | #ifdef __FreeBSD__ |
| 65 | 65 | #include <libutil.h> |
| 66 | +#include <dev/ppbus/ppi.h> | |
| 67 | +#include <dev/ppbus/ppbconf.h> | |
| 66 | 68 | #else |
| 67 | 69 | #include <util.h> |
| 68 | 70 | #endif |
| ... | ... | @@ -1269,6 +1271,65 @@ static CharDriverState *qemu_chr_open_pp(const char *filename) |
| 1269 | 1271 | } |
| 1270 | 1272 | #endif /* __linux__ */ |
| 1271 | 1273 | |
| 1274 | +#if defined(__FreeBSD__) | |
| 1275 | +static int pp_ioctl(CharDriverState *chr, int cmd, void *arg) | |
| 1276 | +{ | |
| 1277 | + int fd = (int)chr->opaque; | |
| 1278 | + uint8_t b; | |
| 1279 | + | |
| 1280 | + switch(cmd) { | |
| 1281 | + case CHR_IOCTL_PP_READ_DATA: | |
| 1282 | + if (ioctl(fd, PPIGDATA, &b) < 0) | |
| 1283 | + return -ENOTSUP; | |
| 1284 | + *(uint8_t *)arg = b; | |
| 1285 | + break; | |
| 1286 | + case CHR_IOCTL_PP_WRITE_DATA: | |
| 1287 | + b = *(uint8_t *)arg; | |
| 1288 | + if (ioctl(fd, PPISDATA, &b) < 0) | |
| 1289 | + return -ENOTSUP; | |
| 1290 | + break; | |
| 1291 | + case CHR_IOCTL_PP_READ_CONTROL: | |
| 1292 | + if (ioctl(fd, PPIGCTRL, &b) < 0) | |
| 1293 | + return -ENOTSUP; | |
| 1294 | + *(uint8_t *)arg = b; | |
| 1295 | + break; | |
| 1296 | + case CHR_IOCTL_PP_WRITE_CONTROL: | |
| 1297 | + b = *(uint8_t *)arg; | |
| 1298 | + if (ioctl(fd, PPISCTRL, &b) < 0) | |
| 1299 | + return -ENOTSUP; | |
| 1300 | + break; | |
| 1301 | + case CHR_IOCTL_PP_READ_STATUS: | |
| 1302 | + if (ioctl(fd, PPIGSTATUS, &b) < 0) | |
| 1303 | + return -ENOTSUP; | |
| 1304 | + *(uint8_t *)arg = b; | |
| 1305 | + break; | |
| 1306 | + default: | |
| 1307 | + return -ENOTSUP; | |
| 1308 | + } | |
| 1309 | + return 0; | |
| 1310 | +} | |
| 1311 | + | |
| 1312 | +static CharDriverState *qemu_chr_open_pp(const char *filename) | |
| 1313 | +{ | |
| 1314 | + CharDriverState *chr; | |
| 1315 | + int fd; | |
| 1316 | + | |
| 1317 | + fd = open(filename, O_RDWR); | |
| 1318 | + if (fd < 0) | |
| 1319 | + return NULL; | |
| 1320 | + | |
| 1321 | + chr = qemu_mallocz(sizeof(CharDriverState)); | |
| 1322 | + if (!chr) { | |
| 1323 | + close(fd); | |
| 1324 | + return NULL; | |
| 1325 | + } | |
| 1326 | + chr->opaque = (void *)fd; | |
| 1327 | + chr->chr_write = null_chr_write; | |
| 1328 | + chr->chr_ioctl = pp_ioctl; | |
| 1329 | + return chr; | |
| 1330 | +} | |
| 1331 | +#endif | |
| 1332 | + | |
| 1272 | 1333 | #else /* _WIN32 */ |
| 1273 | 1334 | |
| 1274 | 1335 | typedef struct { |
| ... | ... | @@ -2110,6 +2171,10 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename) |
| 2110 | 2171 | if (strstart(filename, "/dev/parport", NULL)) { |
| 2111 | 2172 | chr = qemu_chr_open_pp(filename); |
| 2112 | 2173 | } else |
| 2174 | +#elif defined(__FreeBSD__) | |
| 2175 | + if (strstart(filename, "/dev/ppi", NULL)) { | |
| 2176 | + chr = qemu_chr_open_pp(filename); | |
| 2177 | + } else | |
| 2113 | 2178 | #endif |
| 2114 | 2179 | #if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \ |
| 2115 | 2180 | || defined(__NetBSD__) || defined(__OpenBSD__) | ... | ... |