/* * $Id: tacons.c,v 1.7 2008/01/11 15:25:20 nbrk Exp $ */ #include #include #include #include #include #include #include /* * testarm console support. */ int tacons_attach(struct device *, uint32_t, uint8_t); char tacons_getc(void *); void tacons_putc(void *, char); void tacons_early_putc(char); void tacons_interrupt(struct device *self); struct driver tacons_dr = { sizeof(struct tacons_dd), tacons_attach, NULL, tacons_interrupt }; int tacons_attach(struct device *self, uint32_t loc, uint8_t flags) { struct tacons_dd *ddp = self->dv_devdata; struct fcons_handle *fhp = &ddp->td_fh; /* aquire bus handle from parent */ ddp->td_bhp = self->dv_parent->dv_aux; /* all reads/writes will use this addr; in testarm cons this is the same addr for getc/putc */ ddp->td_ioaddr = loc; /* we export struct fcons_handle */ fhp->getc = tacons_getc; fhp->putc = tacons_putc; /* give our dd to fcons_handle */ fhp->fh_ownerdd = ddp; self->dv_aux = fhp; printf("testarm simple console (non-blocking, halt)\n"); return(0); } char tacons_getc(void *ddp) { /* * Get a character from the console. * Remember that this console is non-blocking. */ struct tacons_dd *tdp = ddp; return( bus_read_1(tdp->td_bhp, tdp->td_ioaddr) ); } void tacons_putc(void *ddp, char ch) { /* * Write a character to the console. */ struct tacons_dd *tdp = ddp; bus_write_1(tdp->td_bhp, tdp->td_ioaddr, ch); } void tacons_early_putc(char ch) { /* * put a character on the unconfigured console device. * This will be used during devconfig until fcons/0 is configured. */ *(char *)(TACONS_REG_BASE + TACONS_OFF_IO) = ch; } void tacons_interrupt(struct device *self) { struct tacons_dd *ddp = (struct tacons_dd *)self->dv_devdata; char ch; ch = bus_read_1(ddp->td_bhp, ddp->td_ioaddr); fcons_ienqueue(ch); }