/******* SerialUnit::New() ***********************************/ static OOP_Object *serialunit_new(OOP_Class *cl, OOP_Object *obj, struct pRoot_New *msg) { struct HIDDSerialUnitData * data; struct TagItem *tag, *tstate; ULONG unitnum = 0; EnterFunc(bug("SerialUnit::New()\n")); tstate = msg->attrList; while ((tag = NextTagItem(&tstate))) { ULONG idx; #define csd CSD(cl->UserData) if (IS_HIDDSERIALUNIT_ATTR(tag->ti_Tag, idx)) { #undef csd switch (idx) { case aoHidd_SerialUnit_Unit: unitnum = (ULONG)tag->ti_Data; break; } } } /* while (tags to process) */ obj = (OOP_Object *)OOP_DoSuperMethod(cl, obj, (OOP_Msg)msg); if (obj) { WORD dummy; data = OOP_INST_DATA(cl, obj); data->baseaddr = bases[unitnum]; data->datalength = 8; data->parity = FALSE; data->baudrate = 0; /* will be initialize in set_baudrate() */ data->unitnum = unitnum; CSD(cl->UserData)->units[data->unitnum] = data; D(bug("Unit %d at 0x0%x\n", data->unitnum, data->baseaddr)); /* Init UART - See 14-10 of dragonball documentation */ serial_out_w(data,USTCNT, UEN | RXEN); dummy = RREG_W(URX1); serial_out_w(data, USTCNT, (get_ustcnt(data) | UEN | RXEN | TXEN)); set_baudrate(data, SER_DEFAULT_BAUDRATE); } /* if (obj) */ ReturnPtr("SerialUnit::New()", OOP_Object *, obj); }
/******* SerialUnit::New() ***********************************/ OOP_Object *PCSerUnit__Root__New(OOP_Class *cl, OOP_Object *obj, struct pRoot_New *msg) { struct HIDDSerialUnitData * data; struct TagItem *tag, *tstate; ULONG unitnum = 0; EnterFunc(bug("SerialUnit::New()\n")); tstate = msg->attrList; while ((tag = NextTagItem((const struct TagItem **)&tstate))) { ULONG idx; #define csd CSD(cl->UserData) if (IS_HIDDSERIALUNIT_ATTR(tag->ti_Tag, idx)) #undef csd { switch (idx) { case aoHidd_SerialUnit_Unit: unitnum = (ULONG)tag->ti_Data; break; } } } /* while (tags to process) */ obj = (OOP_Object *)OOP_DoSuperMethod(cl, obj, (OOP_Msg)msg); if (obj) { struct IntuitionBase * IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0); data = OOP_INST_DATA(cl, obj); data->baseaddr = bases[unitnum]; if (NULL != IntuitionBase) { struct Preferences prefs; GetPrefs(&prefs,sizeof(prefs)); data->baudrate = prefs.BaudRate; adapt_data(data, &prefs); CloseLibrary((struct Library *)IntuitionBase); } else { data->datalength = 8; data->parity = FALSE; data->baudrate = 9600; /* will be initialize in set_baudrate() */ } data->unitnum = unitnum; Disable(); CSD(cl->UserData)->units[data->unitnum] = data; Enable(); D(bug("Unit %d at 0x0%x\n", data->unitnum, data->baseaddr)); /* Wake up UART */ serial_outp(data, UART_LCR, 0xBF); serial_outp(data, UART_EFR, UART_EFR_ECB); serial_outp(data, UART_IER, 0); serial_outp(data, UART_EFR, 0); serial_outp(data, UART_LCR, 0); /* clear the FIFOs */ serial_outp(data, UART_FCR, (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT)); /* clear the interrupt registers */ (void)serial_inp(data, UART_RX); (void)serial_inp(data, UART_IIR); (void)serial_inp(data, UART_MSR); /* initilize the UART */ serial_outp(data, UART_LCR, get_lcr(data)); serial_outp(data, UART_MCR, UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS); serial_outp(data, UART_IER, UART_IER_RDI | UART_IER_THRI | UART_IER_RLSI | UART_IER_MSI); /* clear the interrupt registers again ... */ (void)serial_inp(data, UART_LSR); (void)serial_inp(data, UART_RX); (void)serial_inp(data, UART_IIR); (void)serial_inp(data, UART_MSR); set_baudrate(data, data->baudrate); } /* if (obj) */ ReturnPtr("SerialUnit::New()", OOP_Object *, obj); }