pc_serial: Drop BeOS stuff
Even I don't use it anymore...
This commit is contained in:
@@ -1,54 +0,0 @@
|
||||
#ifndef _BEOS_COMPATIBILITY_H_
|
||||
#define _BEOS_COMPATIBILITY_H_
|
||||
#ifndef HAIKU_TARGET_PLATFORM_HAIKU
|
||||
|
||||
typedef struct mutex {
|
||||
sem_id sem;
|
||||
int32 count;
|
||||
} mutex;
|
||||
|
||||
|
||||
static inline status_t
|
||||
mutex_init(mutex *ben, const char *name)
|
||||
{
|
||||
if (ben == NULL || name == NULL)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
ben->count = 1;
|
||||
ben->sem = create_sem(0, name);
|
||||
if (ben->sem >= B_OK)
|
||||
return B_OK;
|
||||
|
||||
return ben->sem;
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
mutex_destroy(mutex *ben)
|
||||
{
|
||||
delete_sem(ben->sem);
|
||||
ben->sem = -1;
|
||||
}
|
||||
|
||||
|
||||
static inline status_t
|
||||
mutex_lock(mutex *ben)
|
||||
{
|
||||
if (atomic_add(&ben->count, -1) <= 0)
|
||||
return acquire_sem(ben->sem);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
static inline status_t
|
||||
mutex_unlock(mutex *ben)
|
||||
{
|
||||
if (atomic_add(&ben->count, 1) < 0)
|
||||
return release_sem(ben->sem);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
#endif // HAIKU_TARGET_PLATFORM_HAIKU
|
||||
#endif // _BEOS_COMPATIBILITY_H_
|
||||
@@ -26,14 +26,7 @@ char *gDeviceNames[DEVICES_COUNT + 1];
|
||||
config_manager_for_driver_module_info *gConfigManagerModule = NULL;
|
||||
isa_module_info *gISAModule = NULL;
|
||||
pci_module_info *gPCIModule = NULL;
|
||||
#ifdef __HAIKU__
|
||||
tty_module_info *gTTYModule = NULL;
|
||||
#else
|
||||
tty_module_info_v1_bone *gTTYModule = NULL;
|
||||
#endif
|
||||
#ifdef __BEOS__
|
||||
struct ddomain gSerialDomain;
|
||||
#endif
|
||||
sem_id gDriverLock = -1;
|
||||
bool gHandleISA = false;
|
||||
|
||||
@@ -470,11 +463,8 @@ next_split:
|
||||
supported->name);
|
||||
|
||||
|
||||
#ifdef __HAIKU__
|
||||
device = new(std::nothrow) SerialDevice(supported, ioport, irq, master);
|
||||
#else
|
||||
device = new SerialDevice(supported, ioport, irq, master);
|
||||
#endif
|
||||
|
||||
if (pc_serial_insert_device(device) < B_OK) {
|
||||
TRACE_ALWAYS("can't insert device\n");
|
||||
continue;
|
||||
@@ -620,11 +610,8 @@ next_split_alt:
|
||||
|
||||
|
||||
/**/
|
||||
#ifdef __HAIKU__
|
||||
device = new(std::nothrow) SerialDevice(supported, ioport, irq, master);
|
||||
#else
|
||||
device = new SerialDevice(supported, ioport, irq, master);
|
||||
#endif
|
||||
|
||||
if (pc_serial_insert_device(device) < B_OK) {
|
||||
TRACE_ALWAYS("can't insert device\n");
|
||||
continue;
|
||||
@@ -670,52 +657,6 @@ init_driver()
|
||||
if (status < B_OK)
|
||||
goto err_tty;
|
||||
|
||||
#ifndef __HAIKU__
|
||||
// due to BONE having a different function count and ordering,
|
||||
// but the same version, to avoid crashing we detect it at runtime.
|
||||
{
|
||||
static tty_module_info_v1_bone sTTYModuleBONE;
|
||||
static tty_module_info_v1_r5 *ttyModuleR5 =
|
||||
(tty_module_info_v1_r5 *)gTTYModule;
|
||||
image_info info;
|
||||
int32 cookie = 0;
|
||||
while (get_next_image_info(/*B_KERNEL_TEAM*/1, &cookie, &info) == B_OK) {
|
||||
//dprintf(DRIVER_NAME ": checking image %32s\n", info.name);
|
||||
if ((char *)(gTTYModule->ttyopen) >= (char *)info.text
|
||||
&& (char *)(gTTYModule->ttyopen) < ((char *)info.text + info.text_size)) {
|
||||
void *symbol;
|
||||
dprintf(DRIVER_NAME ": detected tty module %32s\n", info.name);
|
||||
if (get_image_symbol(info.id, "ttydeselect",
|
||||
B_SYMBOL_TYPE_ANY, &symbol) != B_OK) {
|
||||
dprintf(DRIVER_NAME ": no ttydeselect() in tty module, assuming R5\n");
|
||||
// let's fake a BONE module with NULL select hooks
|
||||
memcpy(&sTTYModuleBONE.mi, &ttyModuleR5->mi, sizeof(ttyModuleR5->mi));
|
||||
sTTYModuleBONE.ttyopen = ttyModuleR5->ttyopen;
|
||||
sTTYModuleBONE.ttyclose = ttyModuleR5->ttyclose;
|
||||
sTTYModuleBONE.ttyfree = ttyModuleR5->ttyfree;
|
||||
sTTYModuleBONE.ttyread = ttyModuleR5->ttyread;
|
||||
sTTYModuleBONE.ttywrite = ttyModuleR5->ttywrite;
|
||||
sTTYModuleBONE.ttycontrol = ttyModuleR5->ttycontrol;
|
||||
sTTYModuleBONE.ttyinit = ttyModuleR5->ttyinit;
|
||||
sTTYModuleBONE.ttyilock = ttyModuleR5->ttyilock;
|
||||
sTTYModuleBONE.ttyhwsignal = ttyModuleR5->ttyhwsignal;
|
||||
sTTYModuleBONE.ttyin = ttyModuleR5->ttyin;
|
||||
sTTYModuleBONE.ttyout = ttyModuleR5->ttyout;
|
||||
sTTYModuleBONE.ddrstart = ttyModuleR5->ddrstart;
|
||||
sTTYModuleBONE.ddrdone = ttyModuleR5->ddrdone;
|
||||
sTTYModuleBONE.ddacquire = ttyModuleR5->ddacquire;
|
||||
// no select hooks
|
||||
sTTYModuleBONE.ttyselect = NULL;
|
||||
sTTYModuleBONE.ttydeselect = NULL;
|
||||
|
||||
gTTYModule = &sTTYModuleBONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
status = get_module(B_PCI_MODULE_NAME, (module_info **)&gPCIModule);
|
||||
if (status < B_OK)
|
||||
goto err_pci;
|
||||
@@ -742,11 +683,6 @@ init_driver()
|
||||
|
||||
status = ENOENT;
|
||||
|
||||
#ifdef __BEOS__
|
||||
memset(&gSerialDomain, 0, sizeof(gSerialDomain));
|
||||
ddbackground(&gSerialDomain);
|
||||
#endif
|
||||
|
||||
scan_bus(B_ISA_BUS);
|
||||
//scan_bus(B_PCI_BUS);
|
||||
scan_pci_alt();
|
||||
@@ -808,7 +744,6 @@ uninit_driver()
|
||||
}
|
||||
|
||||
|
||||
#ifdef __HAIKU__
|
||||
bool
|
||||
pc_serial_service(struct tty *tty, uint32 op, void *buffer, size_t length)
|
||||
{
|
||||
@@ -827,23 +762,6 @@ pc_serial_service(struct tty *tty, uint32 op, void *buffer, size_t length)
|
||||
TRACE_FUNCRET("< pc_serial_service() returns: false\n");
|
||||
return false;
|
||||
}
|
||||
#else /* __HAIKU__ */
|
||||
bool
|
||||
pc_serial_service(struct tty *ptty, struct ddrover *ddr, uint flags)
|
||||
{
|
||||
TRACE_FUNCALLS("> pc_serial_service(0x%08x, 0x%08x, 0x%08x)\n", ptty, ddr, flags);
|
||||
|
||||
for (int32 i = 0; i < DEVICES_COUNT; i++) {
|
||||
if (gSerialDevices[i] && gSerialDevices[i]->Service(ptty, ddr, flags)) {
|
||||
TRACE_FUNCRET("< pc_serial_service() returns: true\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE_FUNCRET("< pc_serial_service() returns: false\n");
|
||||
return false;
|
||||
}
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
|
||||
int32
|
||||
@@ -931,7 +849,6 @@ pc_serial_control(void *cookie, uint32 op, void *arg, size_t length)
|
||||
}
|
||||
|
||||
|
||||
#if defined(B_BEOS_VERSION_DANO) || defined(__HAIKU__)
|
||||
/* pc_serial_select - handle select start */
|
||||
status_t
|
||||
pc_serial_select(void *cookie, uint8 event, uint32 ref, selectsync *sync)
|
||||
@@ -952,7 +869,6 @@ pc_serial_deselect(void *cookie, uint8 event, selectsync *sync)
|
||||
SerialDevice *device = (SerialDevice *)cookie;
|
||||
return device->DeSelect(event, sync);
|
||||
}
|
||||
#endif // DANO, HAIKU
|
||||
|
||||
|
||||
/* pc_serial_close - handle close() calls */
|
||||
@@ -1028,10 +944,8 @@ find_device(const char *name)
|
||||
pc_serial_control, /* -> control entry point */
|
||||
pc_serial_read, /* -> read entry point */
|
||||
pc_serial_write, /* -> write entry point */
|
||||
#if defined(B_BEOS_VERSION_DANO) || defined(__HAIKU__)
|
||||
pc_serial_select, /* -> select entry point */
|
||||
pc_serial_deselect /* -> deselect entry point */
|
||||
#endif
|
||||
};
|
||||
|
||||
TRACE_FUNCALLS("> find_device(%s)\n", name);
|
||||
|
||||
@@ -20,29 +20,18 @@
|
||||
#include <config_manager.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __HAIKU__
|
||||
#include <lock.h>
|
||||
#include <new>
|
||||
#else
|
||||
#include "BeOSCompatibility.h"
|
||||
#include "kernel_cpp.h"
|
||||
#endif
|
||||
|
||||
#include "Tracing.h"
|
||||
|
||||
extern "C" {
|
||||
#ifdef __HAIKU__
|
||||
#include <tty_module.h>
|
||||
#else
|
||||
#include <ttylayer.h>
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// whether we should handle default COM ports
|
||||
// not for BeOS, it has a "zz" driver for this.
|
||||
#ifdef __HAIKU__
|
||||
#define HANDLE_ISA_COM
|
||||
#endif
|
||||
|
||||
#define DRIVER_NAME "pc_serial" // driver name for debug output
|
||||
#define DEVICES_COUNT 20 // max simultaneously open devices
|
||||
@@ -139,67 +128,10 @@ typedef struct pc_serial_line_coding_s {
|
||||
#define CLS_LINE_RTS 0x0002
|
||||
|
||||
|
||||
|
||||
#ifdef __BEOS__
|
||||
|
||||
// All this mess is due to BeOS R5 and BONE having
|
||||
// an incompatible module API for the same version
|
||||
|
||||
typedef bool (*beos_tty_service_func)(struct tty *tty, struct ddrover *rover, uint op);
|
||||
|
||||
// this version is compatible with BeOS R5
|
||||
struct tty_module_info_v1_r5 {
|
||||
// not a real bus manager... no rescan() !
|
||||
module_info mi;
|
||||
status_t (*ttyopen)(struct ttyfile *, struct ddrover *, beos_tty_service_func);
|
||||
status_t (*ttyclose)(struct ttyfile *, struct ddrover *);
|
||||
status_t (*ttyfree)(struct ttyfile *, struct ddrover *);
|
||||
status_t (*ttyread)(struct ttyfile *, struct ddrover *, char *, size_t *);
|
||||
status_t (*ttywrite)(struct ttyfile *, struct ddrover *, const char *, size_t *);
|
||||
status_t (*ttycontrol)(struct ttyfile *, struct ddrover *, ulong, void *, size_t);
|
||||
void (*ttyinit)(struct tty *, bool);
|
||||
void (*ttyilock)(struct tty *, struct ddrover *, bool );
|
||||
void (*ttyhwsignal)(struct tty *, struct ddrover *, int, bool);
|
||||
int (*ttyin)(struct tty *, struct ddrover *, int);
|
||||
int (*ttyout)(struct tty *, struct ddrover *);
|
||||
struct ddrover *(*ddrstart)(struct ddrover *);
|
||||
void (*ddrdone)(struct ddrover *);
|
||||
void (*ddacquire)(struct ddrover *, struct ddomain *);
|
||||
};
|
||||
|
||||
// BeOS BONE has a different module with the same version...
|
||||
struct tty_module_info_v1_bone {
|
||||
// not a real bus manager... no rescan() !
|
||||
module_info mi;
|
||||
status_t (*ttyopen)(struct ttyfile *, struct ddrover *, beos_tty_service_func);
|
||||
status_t (*ttyclose)(struct ttyfile *, struct ddrover *);
|
||||
status_t (*ttyfree)(struct ttyfile *, struct ddrover *);
|
||||
status_t (*ttyread)(struct ttyfile *, struct ddrover *, char *, size_t *);
|
||||
status_t (*ttywrite)(struct ttyfile *, struct ddrover *, const char *, size_t *);
|
||||
status_t (*ttycontrol)(struct ttyfile *, struct ddrover *, ulong, void *, size_t);
|
||||
status_t (*ttyselect)(struct ttyfile *, struct ddrover *, uint8, uint32, selectsync *);
|
||||
status_t (*ttydeselect)(struct ttyfile *, struct ddrover *, uint8, selectsync *);
|
||||
|
||||
void (*ttyinit)(struct tty *, bool);
|
||||
void (*ttyilock)(struct tty *, struct ddrover *, bool );
|
||||
void (*ttyhwsignal)(struct tty *, struct ddrover *, int, bool);
|
||||
int (*ttyin)(struct tty *, struct ddrover *, int);
|
||||
int (*ttyout)(struct tty *, struct ddrover *);
|
||||
struct ddrover *(*ddrstart)(struct ddrover *);
|
||||
void (*ddrdone)(struct ddrover *);
|
||||
void (*ddacquire)(struct ddrover *, struct ddomain *);
|
||||
};
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
|
||||
extern config_manager_for_driver_module_info *gConfigManagerModule;
|
||||
extern isa_module_info *gISAModule;
|
||||
extern pci_module_info *gPCIModule;
|
||||
#ifdef __HAIKU__
|
||||
extern tty_module_info *gTTYModule;
|
||||
#else
|
||||
extern tty_module_info_v1_bone *gTTYModule;
|
||||
#endif
|
||||
extern struct ddomain gSerialDomain;
|
||||
|
||||
extern "C" {
|
||||
@@ -207,12 +139,9 @@ extern "C" {
|
||||
status_t init_hardware();
|
||||
void uninit_driver();
|
||||
|
||||
#ifdef __BEOS__
|
||||
bool pc_serial_service(struct tty *ptty, struct ddrover *ddr, uint flags);
|
||||
#else
|
||||
bool pc_serial_service(struct tty *tty, uint32 op, void *buffer,
|
||||
size_t length);
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
int32 pc_serial_interrupt(void *arg);
|
||||
|
||||
status_t pc_serial_open(const char *name, uint32 flags, void **cookie);
|
||||
|
||||
@@ -38,20 +38,13 @@ SerialDevice::SerialDevice(const struct serial_support_descriptor *device,
|
||||
fDoneWrite(-1),
|
||||
fControlOut(0),
|
||||
fInputStopped(false),
|
||||
#ifdef __HAIKU__
|
||||
fMasterTTY(NULL),
|
||||
fSlaveTTY(NULL),
|
||||
fSystemTTYCookie(NULL),
|
||||
fDeviceTTYCookie(NULL),
|
||||
#endif /* __HAIKU__ */
|
||||
fDeviceThread(-1),
|
||||
fStopDeviceThread(false)
|
||||
{
|
||||
#ifdef __BEOS__
|
||||
memset(&fTTYFile, 0, sizeof(ttyfile));
|
||||
memset(&fTTY, 0, sizeof(tty));
|
||||
memset(&fRover, 0, sizeof(ddrover));
|
||||
#endif /* __BEOS__ */
|
||||
}
|
||||
|
||||
|
||||
@@ -95,17 +88,6 @@ SerialDevice::Init()
|
||||
}
|
||||
|
||||
|
||||
#ifdef __BEOS__
|
||||
void
|
||||
SerialDevice::SetModes()
|
||||
{
|
||||
struct termios tios;
|
||||
memcpy(&tios, &fTTY.t, sizeof(struct termios));
|
||||
SetModes(&tios);
|
||||
}
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
|
||||
void
|
||||
SerialDevice::SetModes(struct termios *tios)
|
||||
{
|
||||
@@ -233,9 +215,6 @@ SerialDevice::SetModes(struct termios *tios)
|
||||
}
|
||||
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
|
||||
bool
|
||||
SerialDevice::Service(struct tty *tty, uint32 op, void *buffer, size_t length)
|
||||
{
|
||||
@@ -351,121 +330,11 @@ SerialDevice::Service(struct tty *tty, uint32 op, void *buffer, size_t length)
|
||||
}
|
||||
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
|
||||
bool
|
||||
SerialDevice::Service(struct tty *ptty, struct ddrover *ddr, uint flags)
|
||||
{
|
||||
uint8 msr;
|
||||
status_t err;
|
||||
|
||||
if (&fTTY != ptty)
|
||||
return false;
|
||||
|
||||
TRACE("%s(,,0x%08lx)\n", __FUNCTION__, flags);
|
||||
|
||||
switch (flags) {
|
||||
case TTYENABLE:
|
||||
TRACE("TTYENABLE\n");
|
||||
|
||||
SetModes();
|
||||
err = install_io_interrupt_handler(IRQ(), pc_serial_interrupt, this, 0);
|
||||
TRACE("installing irq handler for %d: %s\n", IRQ(), strerror(err));
|
||||
msr = ReadReg8(MSR);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWDCD, msr & MSR_DCD);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWCTS, msr & MSR_CTS);
|
||||
//
|
||||
WriteReg8(MCR, MCR_DTR | MCR_RTS | MCR_IRQ_EN /*| MCR_LOOP*//*XXXXXXX*/);
|
||||
// enable irqs
|
||||
WriteReg8(IER, IER_RLS | IER_MS | IER_RDA);
|
||||
//WriteReg8(IER, IER_RDA);
|
||||
break;
|
||||
|
||||
case TTYDISABLE:
|
||||
TRACE("TTYDISABLE\n");
|
||||
// remove the handler
|
||||
remove_io_interrupt_handler(IRQ(), pc_serial_interrupt, this);
|
||||
// disable IRQ
|
||||
WriteReg8(IER, 0);
|
||||
WriteReg8(MCR, 0);
|
||||
msr = ReadReg8(MSR);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWDCD, msr & MSR_DCD);
|
||||
break;
|
||||
|
||||
case TTYISTOP:
|
||||
TRACE("TTYISTOP\n");
|
||||
MaskReg8(MCR, MCR_RTS);
|
||||
//fInputStopped = true;
|
||||
//gTTYModule->ttyhwsignal(ptty, ddr, TTYHWCTS, false);
|
||||
break;
|
||||
|
||||
case TTYIRESUME:
|
||||
TRACE("TTYIRESUME\n");
|
||||
OrReg8(MCR, MCR_RTS);
|
||||
//gTTYModule->ttyhwsignal(ptty, ddr, TTYHWCTS, true);
|
||||
//fInputStopped = false;
|
||||
break;
|
||||
|
||||
case TTYGETSIGNALS:
|
||||
TRACE("TTYGETSIGNALS\n");
|
||||
msr = ReadReg8(MSR);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWDCD, msr & MSR_DCD);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWCTS, msr & MSR_CTS);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWDSR, msr & MSR_DSR);
|
||||
gTTYModule->ttyhwsignal(ptty, ddr, TTYHWRI, msr & MSR_RI);
|
||||
break;
|
||||
|
||||
case TTYSETMODES:
|
||||
TRACE("TTYSETMODES\n");
|
||||
SetModes();
|
||||
//WriteReg8(IER, IER_RLS | IER_MS | IER_RDA);
|
||||
break;
|
||||
|
||||
case TTYOSTART:
|
||||
TRACE("TTYOSTART\n");
|
||||
// enable irqs
|
||||
WriteReg8(IER, IER_RLS | IER_MS | IER_RDA | IER_THRE);
|
||||
break;
|
||||
case TTYOSYNC:
|
||||
TRACE("TTYOSYNC\n");
|
||||
return (ReadReg8(LSR) & (LSR_THRE | LSR_TSRE)) == (LSR_THRE | LSR_TSRE);
|
||||
break;
|
||||
case TTYSETBREAK:
|
||||
TRACE("TTYSETBREAK\n");
|
||||
OrReg8(LCR, LCR_BREAK);
|
||||
break;
|
||||
case TTYCLRBREAK:
|
||||
TRACE("TTYCLRBREAK\n");
|
||||
MaskReg8(LCR, LCR_BREAK);
|
||||
break;
|
||||
case TTYSETDTR:
|
||||
TRACE("TTYSETDTR\n");
|
||||
OrReg8(MCR, MCR_DTR);
|
||||
break;
|
||||
case TTYCLRDTR:
|
||||
TRACE("TTYCLRDTR\n");
|
||||
MaskReg8(MCR, MCR_DTR);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
|
||||
int32
|
||||
SerialDevice::InterruptHandler()
|
||||
{
|
||||
int32 ret = B_UNHANDLED_INTERRUPT;
|
||||
#ifdef __HAIKU__
|
||||
//XXX: what should we do here ? (certainly not use a mutex !)
|
||||
#else /* __HAIKU__ */
|
||||
gTTYModule->ddrstart(&fRover);
|
||||
gTTYModule->ttyilock(&fTTY, &fRover, true);
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
uint8 iir, lsr, msr;
|
||||
|
||||
@@ -487,11 +356,7 @@ SerialDevice::InterruptHandler()
|
||||
fifoavail = 64;
|
||||
for (int i = 0; i < fifoavail; i++) {
|
||||
int chr;
|
||||
#ifdef __HAIKU__
|
||||
chr = 'H';//XXX: what should we do here ? (certainly not call tty_read() !)
|
||||
#else /* __HAIKU__ */
|
||||
chr = gTTYModule->ttyout(&fTTY, &fRover);
|
||||
#endif /* __HAIKU__ */
|
||||
if (chr < 0) {
|
||||
//WriteReg8(THB, (uint8)chr);
|
||||
break;
|
||||
@@ -506,11 +371,7 @@ SerialDevice::InterruptHandler()
|
||||
TRACE(("IIR_TO/RDA\n"));
|
||||
// while data is ready... get it
|
||||
while (ReadReg8(LSR) & LSR_DR)
|
||||
#ifdef __HAIKU__
|
||||
ReadReg8(RBR);//XXX: what should we do here ? (certainly not call tty_write() !)
|
||||
#else /* __HAIKU__ */
|
||||
gTTYModule->ttyin(&fTTY, &fRover, ReadReg8(RBR));
|
||||
#endif /* __HAIKU__ */
|
||||
break;
|
||||
case IIR_RLS:
|
||||
TRACE(("IIR_RLS\n"));
|
||||
@@ -541,12 +402,7 @@ SerialDevice::InterruptHandler()
|
||||
}
|
||||
|
||||
|
||||
#ifdef __HAIKU__
|
||||
//XXX: what should we do here ? (certainly not use a mutex !)
|
||||
#else /* __HAIKU__ */
|
||||
gTTYModule->ttyilock(&fTTY, &fRover, false);
|
||||
gTTYModule->ddrdone(&fRover);
|
||||
#endif /* __HAIKU__ */
|
||||
TRACE_FUNCRET("< IRQ:%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -563,7 +419,6 @@ SerialDevice::Open(uint32 flags)
|
||||
if (fDeviceRemoved)
|
||||
return B_DEV_NOT_READY;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
fMasterTTY = gTTYModule->tty_create(pc_serial_service, true);
|
||||
if (fMasterTTY == NULL) {
|
||||
TRACE_ALWAYS("open: failed to init master tty\n");
|
||||
@@ -598,25 +453,6 @@ SerialDevice::Open(uint32 flags)
|
||||
|
||||
ResetDevice();
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
gTTYModule->ttyinit(&fTTY, false);
|
||||
fTTYFile.tty = &fTTY;
|
||||
fTTYFile.flags = flags;
|
||||
|
||||
|
||||
ResetDevice();
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
gTTYModule->ddacquire(ddr, &gSerialDomain);
|
||||
status = gTTYModule->ttyopen(&fTTYFile, ddr, pc_serial_service);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
if (status < B_OK) {
|
||||
TRACE_ALWAYS("open: failed to open tty\n");
|
||||
return status;
|
||||
@@ -657,8 +493,6 @@ SerialDevice::Read(char *buffer, size_t *numBytes)
|
||||
|
||||
status_t status;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
status = mutex_lock(&fReadLock);
|
||||
if (status != B_OK) {
|
||||
TRACE_ALWAYS("read: failed to get read lock\n");
|
||||
@@ -670,19 +504,6 @@ SerialDevice::Read(char *buffer, size_t *numBytes)
|
||||
|
||||
mutex_unlock(&fReadLock);
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr) {
|
||||
*numBytes = 0;
|
||||
return B_NO_MEMORY;
|
||||
}
|
||||
|
||||
status = gTTYModule->ttyread(&fTTYFile, ddr, buffer, numBytes);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -695,8 +516,6 @@ SerialDevice::Write(const char *buffer, size_t *numBytes)
|
||||
|
||||
status_t status = EINVAL;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
status = mutex_lock(&fWriteLock);
|
||||
if (status != B_OK) {
|
||||
TRACE_ALWAYS("write: failed to get write lock\n");
|
||||
@@ -707,19 +526,6 @@ SerialDevice::Write(const char *buffer, size_t *numBytes)
|
||||
//status = gTTYModule->tty_write(fSystemTTYCookie, buffer, numBytes);
|
||||
mutex_unlock(&fWriteLock);
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr) {
|
||||
*numBytes = 0;
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
status = gTTYModule->ttywrite(&fTTYFile, ddr, buffer, numBytes);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
#if 0
|
||||
status_t status = mutex_lock(&fWriteLock);
|
||||
if (status != B_OK) {
|
||||
@@ -781,21 +587,8 @@ SerialDevice::Control(uint32 op, void *arg, size_t length)
|
||||
if (fDeviceRemoved)
|
||||
return B_DEV_NOT_READY;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
status = gTTYModule->tty_control(fSystemTTYCookie, op, arg, length);
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
status = gTTYModule->ttycontrol(&fTTYFile, ddr, op, arg, length);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -806,22 +599,7 @@ SerialDevice::Select(uint8 event, uint32 ref, selectsync *sync)
|
||||
if (fDeviceRemoved)
|
||||
return B_DEV_NOT_READY;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
return gTTYModule->tty_select(fSystemTTYCookie, event, ref, sync);
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
status_t status = gTTYModule->ttyselect(&fTTYFile, ddr, event, ref, sync);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
return status;
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
}
|
||||
|
||||
|
||||
@@ -831,22 +609,7 @@ SerialDevice::DeSelect(uint8 event, selectsync *sync)
|
||||
if (fDeviceRemoved)
|
||||
return B_DEV_NOT_READY;
|
||||
|
||||
#ifdef __HAIKU__
|
||||
|
||||
return gTTYModule->tty_deselect(fSystemTTYCookie, event, sync);
|
||||
|
||||
#else /* __HAIKU__ */
|
||||
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
status_t status = gTTYModule->ttydeselect(&fTTYFile, ddr, event, sync);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
return status;
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
}
|
||||
|
||||
|
||||
@@ -865,18 +628,8 @@ SerialDevice::Close()
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __HAIKU__
|
||||
gTTYModule->tty_destroy_cookie(fSystemTTYCookie);
|
||||
gTTYModule->tty_destroy_cookie(fDeviceTTYCookie);
|
||||
#else /* __HAIKU__ */
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
status = gTTYModule->ttyclose(&fTTYFile, ddr);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
fDeviceOpen = false;
|
||||
return status;
|
||||
@@ -887,17 +640,10 @@ status_t
|
||||
SerialDevice::Free()
|
||||
{
|
||||
status_t status = B_OK;
|
||||
#ifdef __HAIKU__
|
||||
|
||||
gTTYModule->tty_destroy(fMasterTTY);
|
||||
gTTYModule->tty_destroy(fSlaveTTY);
|
||||
#else /* __HAIKU__ */
|
||||
struct ddrover *ddr = gTTYModule->ddrstart(NULL);
|
||||
if (!ddr)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
status = gTTYModule->ttyfree(&fTTYFile, ddr);
|
||||
gTTYModule->ddrdone(ddr);
|
||||
#endif /* __HAIKU__ */
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -957,12 +703,8 @@ SerialDevice::SetLineCoding(usb_serial_line_coding *coding)
|
||||
status_t
|
||||
SerialDevice::SignalControlLineState(int line, bool enable)
|
||||
{
|
||||
#ifdef __HAIKU__
|
||||
gTTYModule->tty_hardware_signal(fSystemTTYCookie, line, enable);
|
||||
#else
|
||||
// XXX: only works for interrupt handler, Service func must pass the ddrover
|
||||
gTTYModule->ttyhwsignal(&fTTY, &fRover, line, enable);
|
||||
#endif
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,17 +43,10 @@ static SerialDevice * MakeDevice(struct serial_config_descriptor
|
||||
char * WriteBuffer() { return fWriteBuffer; };
|
||||
size_t WriteBufferSize() { return fWriteBufferSize; };
|
||||
|
||||
#ifdef __BEOS__
|
||||
void SetModes();
|
||||
#endif
|
||||
void SetModes(struct termios *tios);
|
||||
#ifdef __HAIKU__
|
||||
|
||||
bool Service(struct tty *tty, uint32 op,
|
||||
void *buffer, size_t length);
|
||||
#else
|
||||
bool Service(struct tty *ptty, struct ddrover *ddr,
|
||||
uint flags);
|
||||
#endif
|
||||
|
||||
int32 InterruptHandler();
|
||||
|
||||
@@ -147,16 +140,11 @@ static void InterruptCallbackFunction(void *cookie,
|
||||
|
||||
uint16 fControlOut;
|
||||
bool fInputStopped;
|
||||
#ifdef __HAIKU__
|
||||
|
||||
struct tty * fMasterTTY;
|
||||
struct tty * fSlaveTTY;
|
||||
struct tty_cookie * fSystemTTYCookie;
|
||||
struct tty_cookie * fDeviceTTYCookie;
|
||||
#else
|
||||
struct ttyfile fTTYFile;
|
||||
struct tty fTTY;
|
||||
struct ddrover fRover;
|
||||
#endif
|
||||
|
||||
/* device thread management */
|
||||
thread_id fDeviceThread;
|
||||
|
||||
@@ -119,73 +119,3 @@ trace_termios(struct termios *tios)
|
||||
tios->c_cc[8], tios->c_cc[9], tios->c_cc[10]);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __BEOS__
|
||||
|
||||
|
||||
void
|
||||
trace_ddomain(struct ddomain *dd)
|
||||
{
|
||||
TRACE("struct ddomain:\n"
|
||||
"\tddrover: 0x%08x\n"
|
||||
"\tbg: %d, locked: %d\n", dd->r, dd->bg, dd->locked);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
trace_str(struct str *str)
|
||||
{
|
||||
TRACE("struct str:\n"
|
||||
"\tbuffer: 0x%08x\n"
|
||||
"\tbufsize: %d\n"
|
||||
"\tcount: %d\n"
|
||||
"\ttail: %d\n"
|
||||
"\tallocated: %d\n",
|
||||
str->buffer, str->bufsize, str->count, str->tail, str->allocated);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
trace_winsize(struct winsize *ws)
|
||||
{
|
||||
TRACE("struct winsize:\n"
|
||||
"\tws_row: %d\n"
|
||||
"\tws_col: %d\n"
|
||||
"\tws_xpixel: %d\n"
|
||||
"\tws_ypixel: %d\n",
|
||||
ws->ws_row, ws->ws_col, ws->ws_xpixel, ws->ws_ypixel);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
trace_tty(struct tty *tty)
|
||||
{
|
||||
TRACE("struct tty:\n"
|
||||
"\tnopen: %d, flags: 0x%08x,\n", tty->nopen, tty->flags);
|
||||
|
||||
TRACE("ddomain dd:\n");
|
||||
trace_ddomain(&tty->dd);
|
||||
TRACE("ddomain ddi:\n");
|
||||
trace_ddomain(&tty->ddi);
|
||||
|
||||
TRACE("\tpgid: %08x\n", tty->pgid);
|
||||
TRACE("termios t:");
|
||||
trace_termios(&tty->t);
|
||||
|
||||
TRACE("\tiactivity: %d, ibusy: %d\n", tty->iactivity, tty->ibusy);
|
||||
|
||||
TRACE("str istr:\n");
|
||||
trace_str(&tty->istr);
|
||||
TRACE("str rstr:\n");
|
||||
trace_str(&tty->rstr);
|
||||
TRACE("str ostr:\n");
|
||||
trace_str(&tty->ostr);
|
||||
|
||||
TRACE("winsize wsize:\n");
|
||||
trace_winsize(&tty->wsize);
|
||||
|
||||
TRACE("\tservice: 0x%08x\n", tty->service);
|
||||
}
|
||||
|
||||
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
@@ -32,11 +32,4 @@ extern bool gLogFunctionResults;
|
||||
|
||||
void trace_termios(struct termios *tios);
|
||||
|
||||
#ifdef __BEOS__
|
||||
void trace_ddomain(struct ddomain *dd);
|
||||
void trace_str(struct str *str);
|
||||
void trace_winsize(struct winsize *ws);
|
||||
void trace_tty(struct tty *tty);
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
#endif //_PC_SERIAL_TRACING_H_
|
||||
|
||||
Reference in New Issue
Block a user