LOCAL int ttyClose ( TYCO_DEV * pTyCoDev /* device to control */ ) { if (!(--pTyCoDev->tyDev.numOpen)) sioIoctl (pTyCoDev->pSioChan, SIO_HUP, NULL); return ((int) pTyCoDev); }
LOCAL int ttyIoctl ( TYCO_DEV * pTyCoDev, /* device to control */ int request, /* request code */ void * arg /* some argument */ ) { int status; if (request == FIOBAUDRATE) return (sioIoctl (pTyCoDev->pSioChan, SIO_BAUD_SET, arg) == OK ? OK : ERROR); status = sioIoctl (pTyCoDev->pSioChan, request, arg); if (status == ENOSYS) return (tyIoctl (&pTyCoDev->tyDev, request, (int)arg)); return (status); }
LOCAL int ttyOpen ( TYCO_DEV * pTyCoDev, /* device to control */ char * name, /* device name */ int flags, /* flags */ int mode /* mode selected */ ) { pTyCoDev->tyDev.numOpen++; /* increment number of open paths */ sioIoctl (pTyCoDev->pSioChan, SIO_OPEN, NULL); return ((int) pTyCoDev); }
STATUS ttyDevCreate ( char * name, /* name to use for this device */ SIO_CHAN * pSioChan, /* pointer to core driver structure */ int rdBufSize, /* read buffer size, in bytes */ int wrtBufSize /* write buffer size, in bytes */ ) { TYCO_DEV *pTyCoDev; if (ttyDrvNum <= 0) { errnoSet (S_ioLib_NO_DRIVER); return (ERROR); } if (pSioChan == (SIO_CHAN *) ERROR) { return (ERROR); } /* allocate memory for the device */ if ((pTyCoDev = (TYCO_DEV *) malloc (sizeof (TYCO_DEV))) == NULL) return (ERROR); /* initialize the ty descriptor */ if (tyDevInit (&pTyCoDev->tyDev, rdBufSize, wrtBufSize, (FUNCPTR) ttyStartup) != OK) { free (pTyCoDev); return (ERROR); } /* initialize the SIO_CHAN structure */ pTyCoDev->pSioChan = pSioChan; sioCallbackInstall (pSioChan, SIO_CALLBACK_GET_TX_CHAR, tyITx, (void *)pTyCoDev); sioCallbackInstall (pSioChan, SIO_CALLBACK_PUT_RCV_CHAR, tyIRd, (void *)pTyCoDev); /* start the device cranking */ sioIoctl (pSioChan, SIO_MODE_SET, (void *)SIO_MODE_INT); /* add the device to the I/O system */ return (iosDevAdd (&pTyCoDev->tyDev.devHdr, name, ttyDrvNum)); }
void sysSerialHwInit (void) { int i; #ifndef BSP_CONFIG_HI3630 dev_paras[0].int_level = ((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR)->UART_INFORMATION[1].interrupt_num; dev_paras[0].base_addrs = (u32*)(((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR)->UART_INFORMATION[1].base_addr); dev_paras[0].vector = ((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR)->UART_INFORMATION[1].interrupt_num; #else ((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR)->UART_INFORMATION[1].interrupt_num = dev_paras[0].int_level; ((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR)->UART_INFORMATION[1].base_addr = (u32)dev_paras[0].base_addrs; #endif for (i = 0; i < AMBA_UART_CHANNELS_NUM; i++) { amba_chan[i].regs = dev_paras[i].base_addrs; amba_chan[i].baud_rate = CONSOLE_BAUD_RATE; amba_chan[i].xtal = UART_XTAL_FREQ; amba_chan[i].level_rx = dev_paras[i].int_level; amba_chan[i].level_tx = dev_paras[i].int_level; /* * Initialize driver functions, getTxChar, putRcvChar and channelMode * and initialize UART */ balongv7r2_uart_init(&amba_chan[i]); } #ifdef INCLUDE_SIO_POLL (BSP_VOID)sioIoctl (sysSioChans[SIO_POLL_CONSOLE], SIO_MODE_SET, (void *) SIO_MODE_POLL); _func_consoleOut = (FUNCPTR)sysSerialPollConsoleOut; #endif /* INCLUDE_SIO_POLL */ }