Commit 6972f93538fc3ad18e791c69ffa1342da11d7159

Authored by blueswir1
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__)
... ...