# add the missing hidd attributes. # remove the interrupt/shutdown handlers when the unit is disposed.

This commit is contained in:
Kalamatee 2023-04-24 14:45:35 +01:00 committed by deadwood
parent 357542b349
commit 0c2a5e99c5
6 changed files with 96 additions and 41 deletions

View File

@ -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)

View File

@ -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();

View File

@ -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) \

View File

@ -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

View File

@ -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)

View File

@ -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