mirror of https://github.com/deadw00d/AROS.git
# add the missing hidd attributes. # remove the interrupt/shutdown handlers when the unit is disposed.
This commit is contained in:
parent
357542b349
commit
0c2a5e99c5
|
@ -24,8 +24,9 @@
|
|||
|
||||
OOP_Object *PCSer__Hidd_Serial__NewUnit(OOP_Class *cl, OOP_Object *obj, struct pHidd_Serial_NewUnit *msg)
|
||||
{
|
||||
OOP_Object *su = NULL;
|
||||
struct class_static_data *csd = (&((struct IntHIDDSerialBase *)cl->UserData)->hdg_csd);
|
||||
struct HIDDSerialData * data = OOP_INST_DATA(cl, obj);
|
||||
OOP_Object *su = NULL;
|
||||
ULONG unitnum = -1;
|
||||
|
||||
EnterFunc(bug("HIDDSerial::NewSerial()\n"));
|
||||
|
@ -89,8 +90,10 @@ OOP_Object *PCSer__Hidd_Serial__NewUnit(OOP_Class *cl, OOP_Object *obj, struct p
|
|||
|
||||
VOID PCSer__Hidd_Serial__DisposeUnit(OOP_Class *cl, OOP_Object *obj, struct pHidd_Serial_DisposeUnit *msg)
|
||||
{
|
||||
OOP_Object * su = msg->unit;
|
||||
struct class_static_data *csd = (&((struct IntHIDDSerialBase *)cl->UserData)->hdg_csd);
|
||||
struct HIDDSerialData * data = OOP_INST_DATA(cl, obj);
|
||||
OOP_Object * su = msg->unit;
|
||||
|
||||
EnterFunc(bug("HIDDSerial::DisposeUnit()\n"));
|
||||
|
||||
if(su)
|
||||
|
@ -113,30 +116,23 @@ VOID PCSer__Hidd_Serial__DisposeUnit(OOP_Class *cl, OOP_Object *obj, struct pHid
|
|||
ReturnVoid("HIDDSerial::DisposeUnit");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************** Classes *****************************/
|
||||
|
||||
#define csd (&(LIBBASE->hdg_csd))
|
||||
|
||||
static int PCSer_InitAttrs(LIBBASETYPEPTR LIBBASE)
|
||||
/******* SerialUnit::New() ***********************************/
|
||||
OOP_Object *PCSer__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_New *msg)
|
||||
{
|
||||
EnterFunc(bug("PCSer_InitAttrs\n"));
|
||||
|
||||
__IHidd_SerialUnitAB = OOP_ObtainAttrBase(IID_Hidd_SerialUnit);
|
||||
|
||||
ReturnInt("PCSer_InitAttrs", ULONG, __IHidd_SerialUnitAB != 0);
|
||||
struct class_static_data *csd = (&((struct IntHIDDSerialBase *)cl->UserData)->hdg_csd);
|
||||
struct pRoot_New serhidNew;
|
||||
struct TagItem serhidTags[] =
|
||||
{
|
||||
{ aHidd_Name, (IPTR)"serial.hidd" },
|
||||
{ aHidd_HardwareName, (IPTR)"PC 16550 UART Serial-Port Controller" },
|
||||
{ TAG_DONE, 0 }
|
||||
};
|
||||
if (msg->attrList)
|
||||
{
|
||||
serhidTags[1].ti_Tag = TAG_MORE;
|
||||
serhidTags[1].ti_Data = (IPTR)msg->attrList;
|
||||
}
|
||||
serhidNew.mID = msg->mID;
|
||||
serhidNew.attrList = serhidTags;
|
||||
return (OOP_Object *)OOP_DoSuperMethod(cl, obj, (OOP_Msg)&serhidNew);
|
||||
}
|
||||
|
||||
|
||||
static int PCSer_ExpungeAttrs(LIBBASETYPEPTR LIBBASE)
|
||||
{
|
||||
EnterFunc(bug("PCSer_ExpungeAttrs\n"));
|
||||
|
||||
OOP_ReleaseAttrBase(IID_Hidd_SerialUnit);
|
||||
|
||||
ReturnInt("PCSer_ExpungeAttrs", int, TRUE);
|
||||
}
|
||||
|
||||
ADD2INITLIB(PCSer_InitAttrs, 0)
|
||||
ADD2EXPUNGELIB(PCSer_ExpungeAttrs, 0)
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
the 16550 UART.
|
||||
*/
|
||||
|
||||
#include <aros/debug.h>
|
||||
|
||||
#include <proto/exec.h>
|
||||
#include <proto/utility.h>
|
||||
|
@ -28,12 +29,8 @@
|
|||
|
||||
#include <devices/serial.h>
|
||||
|
||||
#include <SDI/SDI_interrupt.h>
|
||||
|
||||
#include "serial_intern.h"
|
||||
|
||||
#include <aros/debug.h>
|
||||
|
||||
#define DIRQ(x)
|
||||
|
||||
/* The speed of the crystal */
|
||||
|
@ -83,10 +80,18 @@ static AROS_INTH1(PCSerUnit_ResetHandler, struct HIDDSerialUnitData *, data)
|
|||
/******* SerialUnit::New() ***********************************/
|
||||
OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_New *msg)
|
||||
{
|
||||
struct class_static_data *csd = (&((struct IntHIDDSerialBase *)cl->UserData)->hdg_csd);
|
||||
struct pRoot_New serunitNew;
|
||||
struct TagItem serunitTags[] =
|
||||
{
|
||||
{ aHidd_Name, (IPTR)"serial.hidd" },
|
||||
{ aHidd_HardwareName, (IPTR)"PC 16550 UART Serial-Port" },
|
||||
{ TAG_DONE, 0 }
|
||||
};
|
||||
struct HIDDSerialUnitData * data;
|
||||
struct TagItem *tag, *tstate;
|
||||
ULONG unitnum = 0;
|
||||
|
||||
|
||||
EnterFunc(bug("SerialUnit::New()\n"));
|
||||
|
||||
tstate = msg->attrList;
|
||||
|
@ -94,9 +99,7 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
{
|
||||
ULONG idx;
|
||||
|
||||
#define csd CSD(cl->UserData)
|
||||
if (IS_HIDDSERIALUNIT_ATTR(tag->ti_Tag, idx))
|
||||
#undef csd
|
||||
{
|
||||
switch (idx)
|
||||
{
|
||||
|
@ -107,12 +110,19 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
}
|
||||
|
||||
} /* while (tags to process) */
|
||||
|
||||
obj = (OOP_Object *)OOP_DoSuperMethod(cl, obj, (OOP_Msg)msg);
|
||||
|
||||
if (msg->attrList)
|
||||
{
|
||||
serunitTags[1].ti_Tag = TAG_MORE;
|
||||
serunitTags[1].ti_Data = (IPTR)msg->attrList;
|
||||
}
|
||||
serunitNew.mID = msg->mID;
|
||||
serunitNew.attrList = serunitTags;
|
||||
|
||||
obj = (OOP_Object *)OOP_DoSuperMethod(cl, obj, (OOP_Msg)&serunitNew);
|
||||
|
||||
if (obj)
|
||||
{
|
||||
struct IntuitionBase * IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
|
||||
data = OOP_INST_DATA(cl, obj);
|
||||
|
||||
if (unitnum < 5 )
|
||||
|
@ -120,6 +130,7 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
struct Interrupt *irq;
|
||||
if ((unitnum == 1) || (unitnum == 3))
|
||||
{
|
||||
D(bug("[Serial:PC] %s: Adding IRQ handlers for COM2/4\n", __func__));
|
||||
/* Install COM2 and COM4 interrupt */
|
||||
irq = &CSD(cl->UserData)->intHandler[1];
|
||||
if (!irq->is_Node.ln_Name)
|
||||
|
@ -143,6 +154,7 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
}
|
||||
else
|
||||
{
|
||||
D(bug("[Serial:PC] %s: Adding IRQ handlers for COM1/3\n", __func__));
|
||||
/* Install COM1 and COM3 interrupt */
|
||||
irq = &CSD(cl->UserData)->intHandler[0];
|
||||
if (!irq->is_Node.ln_Name)
|
||||
|
@ -166,7 +178,11 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
}
|
||||
}
|
||||
data->baseaddr = bases[unitnum];
|
||||
data->unitnum = unitnum;
|
||||
|
||||
D(bug("[Serial:PC] %s: Base Address %08x\n", __func__, data->baseaddr));
|
||||
|
||||
struct IntuitionBase * IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
|
||||
if (NULL != IntuitionBase) {
|
||||
struct Preferences prefs;
|
||||
GetPrefs(&prefs,sizeof(prefs));
|
||||
|
@ -178,7 +194,6 @@ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_Ne
|
|||
data->parity = FALSE;
|
||||
data->baudrate = 9600; /* will be initialize in set_baudrate() */
|
||||
}
|
||||
data->unitnum = unitnum;
|
||||
|
||||
Disable();
|
||||
CSD(cl->UserData)->units[data->unitnum] = data;
|
||||
|
@ -227,6 +242,24 @@ OOP_Object *PCSerUnit__Root__Dispose(OOP_Class *cl, OOP_Object *obj, OOP_Msg msg
|
|||
|
||||
data = OOP_INST_DATA(cl, obj);
|
||||
|
||||
if (data->unitsdh.is_Node.ln_Name)
|
||||
{
|
||||
struct Interrupt *irq;
|
||||
int irqnum;
|
||||
RemResetCallback(&data->unitsdh);
|
||||
if ((data->unitnum == 1) || (data->unitnum == 3))
|
||||
{
|
||||
irq = &CSD(cl->UserData)->intHandler[1];
|
||||
irqnum = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq = &CSD(cl->UserData)->intHandler[0];
|
||||
irqnum = 4;
|
||||
}
|
||||
RemIntServer(INTB_KERNEL + irqnum, irq);
|
||||
}
|
||||
|
||||
Disable();
|
||||
CSD(cl->UserData)->units[data->unitnum] = NULL;
|
||||
Enable();
|
||||
|
|
|
@ -3,6 +3,11 @@ include $(SRCDIR)/config/aros.cfg
|
|||
|
||||
FILES := serial_init SerialClass SerialUnitClass
|
||||
|
||||
USER_CPPFLAGS := \
|
||||
-D__OOP_NOATTRBASES__
|
||||
|
||||
#USER_CPPFLAGS += -DDEBUG=1
|
||||
|
||||
%build_module mmake=kernel-pc-i386-serial \
|
||||
modname=serial modtype=hidd \
|
||||
files=$(FILES) \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
##begin config
|
||||
basename PCSer
|
||||
libbasetype struct IntHIDDSerialBase
|
||||
version 1.2
|
||||
version 1.3
|
||||
residentpri 9
|
||||
classptr_field hdg_csd.serialhiddclass
|
||||
classid CLID_Hidd_Serial
|
||||
|
@ -15,6 +15,8 @@ options noexpunge
|
|||
##end cdefprivate
|
||||
|
||||
##begin methodlist
|
||||
.interface Root
|
||||
New
|
||||
.interface Hidd_Serial
|
||||
NewUnit
|
||||
DisposeUnit
|
||||
|
|
|
@ -22,12 +22,29 @@
|
|||
|
||||
static int PCSer_Init(LIBBASETYPEPTR LIBBASE)
|
||||
{
|
||||
struct class_static_data *csd = &LIBBASE->hdg_csd; /* SerialHidd static data */
|
||||
struct class_static_data *csd = &LIBBASE->hdg_csd;
|
||||
|
||||
EnterFunc(bug("SerialHIDD_Init()\n"));
|
||||
|
||||
// TODO: Probe for the Serial ports and register units.
|
||||
__IHidd = OOP_ObtainAttrBase(IID_Hidd);
|
||||
__IHidd_SerialUnitAB = OOP_ObtainAttrBase(IID_Hidd_SerialUnit);
|
||||
|
||||
ReturnInt("SerialHIDD_Init", int, TRUE);
|
||||
}
|
||||
|
||||
ADD2INITLIB(PCSer_Init, 0)
|
||||
|
||||
static int PCSer_Expunge(LIBBASETYPEPTR LIBBASE)
|
||||
{
|
||||
struct class_static_data *csd = &LIBBASE->hdg_csd;
|
||||
|
||||
EnterFunc(bug("PCSer_Expunge()\n"));
|
||||
|
||||
OOP_ReleaseAttrBase(IID_Hidd_SerialUnit);
|
||||
OOP_ReleaseAttrBase(IID_Hidd);
|
||||
|
||||
ReturnInt("PCSer_Expunge", int, TRUE);
|
||||
}
|
||||
|
||||
ADD2EXPUNGELIB(PCSer_Expunge, 0)
|
||||
|
|
|
@ -63,11 +63,13 @@ struct class_static_data
|
|||
OOP_Class *serialunitclass;
|
||||
|
||||
struct HIDDSerialUnitData *units[SER_MAX_UNITS];
|
||||
OOP_AttrBase hiddAB;
|
||||
OOP_AttrBase hiddSerialUnitAB;
|
||||
struct Interrupt intHandler[2];
|
||||
};
|
||||
|
||||
#define __IHidd_SerialUnitAB (csd->hiddSerialUnitAB)
|
||||
#define __IHidd (csd->hiddAB)
|
||||
#define __IHidd_SerialUnitAB (csd->hiddSerialUnitAB)
|
||||
|
||||
#define SER_DEFAULT_BAUDRATE 57600
|
||||
|
||||
|
|
Loading…
Reference in New Issue