/* * $Id: 44780_dev.c,v 1.1 2008/01/07 20:24:48 nbrk Exp $ */ #include #include #include #include #include /* * Driver for Hitachi 44780-based LCD. */ int h44780_attach(struct device *, uint32_t, uint8_t); void h44780_write(struct h44780_dd *ddp, uint16_t data); void h44780_strobe(struct h44780_dd *ddp); void h44780_init(struct h44780_dd *ddp); struct driver h44780_dr = { sizeof(struct h44780_dd), h44780_attach, NULL, NULL }; int h44780_attach(struct device *self, uint32_t loc, uint8_t flags) { struct h44780_dd *ddp = self->dv_devdata; ddp->h_bop = self->dv_parent->dv_aux; printf("Hitachi 44780 LCD controller\n"); h44780_init(ddp); return(0); } void h44780_write(struct h44780_dd *ddp, uint16_t data) { printf("h44780_write: write 0x%x\n", data); ddp->h_bop->write(ddp->h_bop->selfdd, data); } void h44780_strobe(struct h44780_dd *ddp) { ddp->h_bop->strobe(ddp->h_bop->selfdd); } void h44780_init(struct h44780_dd *ddp) { h44780_write(ddp, H44780_CMD_IFLEN | H44780_DL | H44780_N | H44780_F); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, H44780_CMD_IFLEN | H44780_DL | H44780_N | H44780_F); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, H44780_CMD_IFLEN | H44780_DL | H44780_N | H44780_F); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, H44780_CMD_ENABLE | H44780_B | H44780_C | H44780_D); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, H44780_CMD_CLS); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, H44780_CMD_SETDIR | H44780_ID | H44780_S); // h44780_strobe(ddp); h44780_write(ddp, 0); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, 0x38); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, 0); // h44780_strobe(ddp); H44780_DELAY; h44780_write(ddp, 0x0f); // h44780_strobe(ddp); }