int sbscn_speed(long speed, long *brcp) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; int frequency = 100000000; *brcp = divrnd(frequency / 20, speed) - 1; if (speed <= 0) return (-1); x = divrnd(frequency / 20, speed); if (x <= 0) return (-1); err = divrnd(((quad_t)frequency) * 1000 / 20, speed * x) - 1000; if (err < 0) err = -err; if (err > SBSCN_TOLERANCE) return (-1); *brcp = x - 1; return (0); #undef divrnd }
static int comspeed(int speed) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; if (speed <= 0) return (-1); x = divrnd((NS16550_FREQ / 16), speed); if (x <= 0) return (-1); err = divrnd((((quad_t)NS16550_FREQ) / 16) * 1000, speed * x) - 1000; if (err < 0) err = -err; if (err > COM_TOLERANCE) return (-1); return (x); #undef divrnd }
int sscomspeed(long speed, long frequency) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; if (speed <= 0) return -1; x = divrnd(frequency / 16, speed); if (x <= 0) return -1; err = divrnd(((quad_t)frequency) * 1000 / 16, speed * x) - 1000; if (err < 0) err = -err; if (err > SSCOM_TOLERANCE) return -1; return x-1; #undef divrnd }
static int sscomspeed(long speed) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; long pclk = get_com_freq(); if (speed <= 0) return -1; x = divrnd(pclk / 16, speed); if (x <= 0) return -1; err = divrnd(((quad_t)pclk) * 1000 / 16, speed * x) - 1000; if (err < 0) err = -err; if (err > SSCOM_TOLERANCE) return -1; return x-1; #undef divrnd }
int comspeed(long freq, long speed) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; if (speed == 0) return 0; if (speed < 0) return -1; x = divrnd((freq / 16), speed); if (x <= 0) return -1; err = divrnd((quad_t)freq * 1000 / 16, speed * x) - 1000; if (err < 0) err = -err; if (err > COM_TOLERANCE) return -1; return x; #undef divrnd }
static int comspeed(long speed) { #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ int x, err; if (speed == 0) return 0; if (speed < 0) return -1; x = divrnd((COM_FREQ / 16), speed); if (x <= 0) return -1; err = divrnd((COM_FREQ / 16) * 1000, speed * x) - 1000; if (err < 0) err = -err; if (err > COM_TOLERANCE) return -1; return x; #undef divrnd }
void ofppc_init_comcons(int isa_node) { #if (NCOM > 0) char name[64]; uint32_t reg[2], comfreq; uint8_t dll, dlm; int speed, rate, err, com_node, child; bus_space_handle_t comh; /* if we have a serial cons, we have work to do */ memset(name, 0, sizeof(name)); OF_getprop(console_node, "device_type", name, sizeof(name)); if (strcmp(name, "serial") != 0) return; /* scan ISA children for serial devices to match our console */ com_node = -1; for (child = OF_child(isa_node); child; child = OF_peer(child)) { memset(name, 0, sizeof(name)); OF_getprop(child, "device_type", name, sizeof(name)); if (strcmp(name, "serial") == 0) { /* * Serial device even matches our console_node? * Then we're done! */ if (child == console_node) { com_node = child; break; } /* remember first serial device found */ if (com_node == -1) com_node = child; } } if (com_node == -1) return; if (OF_getprop(com_node, "reg", reg, sizeof(reg)) == -1) return; if (OF_getprop(com_node, "clock-frequency", &comfreq, 4) == -1) comfreq = 0; if (comfreq == 0) comfreq = COM_FREQ; /* we need to BSM this, and then undo that before calling * comcnattach. */ if (bus_space_map(&genppc_isa_io_space_tag, reg[1], 8, 0, &comh) != 0) panic("Can't map isa serial\n"); bus_space_write_1(&genppc_isa_io_space_tag, comh, com_cfcr, LCR_DLAB); dll = bus_space_read_1(&genppc_isa_io_space_tag, comh, com_dlbl); dlm = bus_space_read_1(&genppc_isa_io_space_tag, comh, com_dlbh); rate = dll | (dlm << 8); bus_space_write_1(&genppc_isa_io_space_tag, comh, com_cfcr, LCR_8BITS); speed = divrnd((comfreq / 16), rate); err = speed - (speed + 150)/300 * 300; speed -= err; if (err < 0) err = -err; if (err > 50) speed = 9600; bus_space_unmap(&genppc_isa_io_space_tag, comh, 8); /* Now we can attach the comcons */ aprint_verbose("Switching to COM console at speed %d", speed); if (comcnattach(&genppc_isa_io_space_tag, reg[1], speed, comfreq, COM_TYPE_NORMAL, ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8))) panic("Can't init serial console"); aprint_verbose("\n"); #endif /*NCOM*/ }