1 /* 2 * (C) Copyright 2004 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * See file CREDITS for list of people who contributed to this 6 * project. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 24 #include <common.h> 25 #include <environment.h> 26 #include <serial.h> 27 #include <stdio_dev.h> 28 #include <post.h> 29 #include <linux/compiler.h> 30 #include <errno.h> 31 32 DECLARE_GLOBAL_DATA_PTR; 33 34 static struct serial_device *serial_devices; 35 static struct serial_device *serial_current; 36 /* 37 * Table with supported baudrates (defined in config_xyz.h) 38 */ 39 static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE; 40 #define N_BAUDRATES (sizeof(baudrate_table) / sizeof(baudrate_table[0])) 41 42 /** 43 * serial_null() - Void registration routine of a serial driver 44 * 45 * This routine implements a void registration routine of a serial 46 * driver. The registration routine of a particular driver is aliased 47 * to this empty function in case the driver is not compiled into 48 * U-Boot. 49 */ 50 static void serial_null(void) 51 { 52 } 53 54 /** 55 * on_baudrate() - Update the actual baudrate when the env var changes 56 * 57 * This will check for a valid baudrate and only apply it if valid. 58 */ 59 static int on_baudrate(const char *name, const char *value, enum env_op op, 60 int flags) 61 { 62 int i; 63 int baudrate; 64 65 switch (op) { 66 case env_op_create: 67 case env_op_overwrite: 68 /* 69 * Switch to new baudrate if new baudrate is supported 70 */ 71 baudrate = simple_strtoul(value, NULL, 10); 72 73 /* Not actually changing */ 74 if (gd->baudrate == baudrate) 75 return 0; 76 77 for (i = 0; i < N_BAUDRATES; ++i) { 78 if (baudrate == baudrate_table[i]) 79 break; 80 } 81 if (i == N_BAUDRATES) { 82 if ((flags & H_FORCE) == 0) 83 printf("## Baudrate %d bps not supported\n", 84 baudrate); 85 return 1; 86 } 87 if ((flags & H_INTERACTIVE) != 0) { 88 printf("## Switch baudrate to %d" 89 " bps and press ENTER ...\n", baudrate); 90 udelay(50000); 91 } 92 93 gd->baudrate = baudrate; 94 #if defined(CONFIG_PPC) || defined(CONFIG_MCF52x2) 95 gd->bd->bi_baudrate = baudrate; 96 #endif 97 98 serial_setbrg(); 99 100 udelay(50000); 101 102 if ((flags & H_INTERACTIVE) != 0) 103 while (1) { 104 if (getc() == '\r') 105 break; 106 } 107 108 return 0; 109 case env_op_delete: 110 printf("## Baudrate may not be deleted\n"); 111 return 1; 112 default: 113 return 0; 114 } 115 } 116 U_BOOT_ENV_CALLBACK(baudrate, on_baudrate); 117 118 /** 119 * serial_initfunc() - Forward declare of driver registration routine 120 * @name: Name of the real driver registration routine. 121 * 122 * This macro expands onto forward declaration of a driver registration 123 * routine, which is then used below in serial_initialize() function. 124 * The declaration is made weak and aliases to serial_null() so in case 125 * the driver is not compiled in, the function is still declared and can 126 * be used, but aliases to serial_null() and thus is optimized away. 127 */ 128 #define serial_initfunc(name) \ 129 void name(void) \ 130 __attribute__((weak, alias("serial_null"))); 131 132 serial_initfunc(mpc8xx_serial_initialize); 133 serial_initfunc(ns16550_serial_initialize); 134 serial_initfunc(pxa_serial_initialize); 135 serial_initfunc(s3c24xx_serial_initialize); 136 serial_initfunc(s5p_serial_initialize); 137 serial_initfunc(zynq_serial_initalize); 138 serial_initfunc(bfin_serial_initialize); 139 serial_initfunc(bfin_jtag_initialize); 140 serial_initfunc(mpc512x_serial_initialize); 141 serial_initfunc(uartlite_serial_initialize); 142 serial_initfunc(au1x00_serial_initialize); 143 serial_initfunc(asc_serial_initialize); 144 serial_initfunc(jz_serial_initialize); 145 serial_initfunc(mpc5xx_serial_initialize); 146 serial_initfunc(mpc8260_scc_serial_initialize); 147 serial_initfunc(mpc8260_smc_serial_initialize); 148 serial_initfunc(mpc85xx_serial_initialize); 149 serial_initfunc(iop480_serial_initialize); 150 serial_initfunc(leon2_serial_initialize); 151 serial_initfunc(leon3_serial_initialize); 152 serial_initfunc(marvell_serial_initialize); 153 serial_initfunc(amirix_serial_initialize); 154 serial_initfunc(bmw_serial_initialize); 155 serial_initfunc(cogent_serial_initialize); 156 serial_initfunc(cpci750_serial_initialize); 157 serial_initfunc(evb64260_serial_initialize); 158 serial_initfunc(ml2_serial_initialize); 159 serial_initfunc(sconsole_serial_initialize); 160 serial_initfunc(p3mx_serial_initialize); 161 serial_initfunc(altera_jtag_serial_initialize); 162 serial_initfunc(altera_serial_initialize); 163 serial_initfunc(atmel_serial_initialize); 164 serial_initfunc(lpc32xx_serial_initialize); 165 serial_initfunc(mcf_serial_initialize); 166 serial_initfunc(oc_serial_initialize); 167 serial_initfunc(sandbox_serial_initialize); 168 serial_initfunc(clps7111_serial_initialize); 169 serial_initfunc(imx_serial_initialize); 170 serial_initfunc(ixp_serial_initialize); 171 serial_initfunc(ks8695_serial_initialize); 172 serial_initfunc(lh7a40x_serial_initialize); 173 serial_initfunc(max3100_serial_initialize); 174 serial_initfunc(mxc_serial_initialize); 175 serial_initfunc(pl01x_serial_initialize); 176 serial_initfunc(s3c44b0_serial_initialize); 177 serial_initfunc(sa1100_serial_initialize); 178 serial_initfunc(sh_serial_initialize); 179 180 /** 181 * serial_register() - Register serial driver with serial driver core 182 * @dev: Pointer to the serial driver structure 183 * 184 * This function registers the serial driver supplied via @dev with 185 * serial driver core, thus making U-Boot aware of it and making it 186 * available for U-Boot to use. On platforms that still require manual 187 * relocation of constant variables, relocation of the supplied structure 188 * is performed. 189 */ 190 void serial_register(struct serial_device *dev) 191 { 192 #ifdef CONFIG_NEEDS_MANUAL_RELOC 193 if (dev->start) 194 dev->start += gd->reloc_off; 195 if (dev->stop) 196 dev->stop += gd->reloc_off; 197 if (dev->setbrg) 198 dev->setbrg += gd->reloc_off; 199 if (dev->getc) 200 dev->getc += gd->reloc_off; 201 if (dev->tstc) 202 dev->tstc += gd->reloc_off; 203 if (dev->putc) 204 dev->putc += gd->reloc_off; 205 if (dev->puts) 206 dev->puts += gd->reloc_off; 207 #endif 208 209 dev->next = serial_devices; 210 serial_devices = dev; 211 } 212 213 /** 214 * serial_initialize() - Register all compiled-in serial port drivers 215 * 216 * This function registers all serial port drivers that are compiled 217 * into the U-Boot binary with the serial core, thus making them 218 * available to U-Boot to use. Lastly, this function assigns a default 219 * serial port to the serial core. That serial port is then used as a 220 * default output. 221 */ 222 void serial_initialize(void) 223 { 224 mpc8xx_serial_initialize(); 225 ns16550_serial_initialize(); 226 pxa_serial_initialize(); 227 s3c24xx_serial_initialize(); 228 s5p_serial_initialize(); 229 mpc512x_serial_initialize(); 230 bfin_serial_initialize(); 231 bfin_jtag_initialize(); 232 uartlite_serial_initialize(); 233 zynq_serial_initalize(); 234 au1x00_serial_initialize(); 235 asc_serial_initialize(); 236 jz_serial_initialize(); 237 mpc5xx_serial_initialize(); 238 mpc8260_scc_serial_initialize(); 239 mpc8260_smc_serial_initialize(); 240 mpc85xx_serial_initialize(); 241 iop480_serial_initialize(); 242 leon2_serial_initialize(); 243 leon3_serial_initialize(); 244 marvell_serial_initialize(); 245 amirix_serial_initialize(); 246 bmw_serial_initialize(); 247 cogent_serial_initialize(); 248 cpci750_serial_initialize(); 249 evb64260_serial_initialize(); 250 ml2_serial_initialize(); 251 sconsole_serial_initialize(); 252 p3mx_serial_initialize(); 253 altera_jtag_serial_initialize(); 254 altera_serial_initialize(); 255 atmel_serial_initialize(); 256 lpc32xx_serial_initialize(); 257 mcf_serial_initialize(); 258 oc_serial_initialize(); 259 sandbox_serial_initialize(); 260 clps7111_serial_initialize(); 261 imx_serial_initialize(); 262 ixp_serial_initialize(); 263 ks8695_serial_initialize(); 264 lh7a40x_serial_initialize(); 265 max3100_serial_initialize(); 266 mxc_serial_initialize(); 267 pl01x_serial_initialize(); 268 s3c44b0_serial_initialize(); 269 sa1100_serial_initialize(); 270 sh_serial_initialize(); 271 272 serial_assign(default_serial_console()->name); 273 } 274 275 /** 276 * serial_stdio_init() - Register serial ports with STDIO core 277 * 278 * This function generates a proxy driver for each serial port driver. 279 * These proxy drivers then register with the STDIO core, making the 280 * serial drivers available as STDIO devices. 281 */ 282 void serial_stdio_init(void) 283 { 284 struct stdio_dev dev; 285 struct serial_device *s = serial_devices; 286 287 while (s) { 288 memset(&dev, 0, sizeof(dev)); 289 290 strcpy(dev.name, s->name); 291 dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT; 292 293 dev.start = s->start; 294 dev.stop = s->stop; 295 dev.putc = s->putc; 296 dev.puts = s->puts; 297 dev.getc = s->getc; 298 dev.tstc = s->tstc; 299 300 stdio_register(&dev); 301 302 s = s->next; 303 } 304 } 305 306 /** 307 * serial_assign() - Select the serial output device by name 308 * @name: Name of the serial driver to be used as default output 309 * 310 * This function configures the serial output multiplexing by 311 * selecting which serial device will be used as default. In case 312 * the STDIO "serial" device is selected as stdin/stdout/stderr, 313 * the serial device previously configured by this function will be 314 * used for the particular operation. 315 * 316 * Returns 0 on success, negative on error. 317 */ 318 int serial_assign(const char *name) 319 { 320 struct serial_device *s; 321 322 for (s = serial_devices; s; s = s->next) { 323 if (strcmp(s->name, name)) 324 continue; 325 serial_current = s; 326 return 0; 327 } 328 329 return -EINVAL; 330 } 331 332 /** 333 * serial_reinit_all() - Reinitialize all compiled-in serial ports 334 * 335 * This function reinitializes all serial ports that are compiled 336 * into U-Boot by calling their serial_start() functions. 337 */ 338 void serial_reinit_all(void) 339 { 340 struct serial_device *s; 341 342 for (s = serial_devices; s; s = s->next) 343 s->start(); 344 } 345 346 /** 347 * get_current() - Return pointer to currently selected serial port 348 * 349 * This function returns a pointer to currently selected serial port. 350 * The currently selected serial port is altered by serial_assign() 351 * function. 352 * 353 * In case this function is called before relocation or before any serial 354 * port is configured, this function calls default_serial_console() to 355 * determine the serial port. Otherwise, the configured serial port is 356 * returned. 357 * 358 * Returns pointer to the currently selected serial port on success, 359 * NULL on error. 360 */ 361 static struct serial_device *get_current(void) 362 { 363 struct serial_device *dev; 364 365 if (!(gd->flags & GD_FLG_RELOC)) 366 dev = default_serial_console(); 367 else if (!serial_current) 368 dev = default_serial_console(); 369 else 370 dev = serial_current; 371 372 /* We must have a console device */ 373 if (!dev) { 374 #ifdef CONFIG_SPL_BUILD 375 puts("Cannot find console\n"); 376 hang(); 377 #else 378 panic("Cannot find console\n"); 379 #endif 380 } 381 382 return dev; 383 } 384 385 /** 386 * serial_init() - Initialize currently selected serial port 387 * 388 * This function initializes the currently selected serial port. This 389 * usually involves setting up the registers of that particular port, 390 * enabling clock and such. This function uses the get_current() call 391 * to determine which port is selected. 392 * 393 * Returns 0 on success, negative on error. 394 */ 395 int serial_init(void) 396 { 397 return get_current()->start(); 398 } 399 400 /** 401 * serial_setbrg() - Configure baud-rate of currently selected serial port 402 * 403 * This function configures the baud-rate of the currently selected 404 * serial port. The baud-rate is retrieved from global data within 405 * the serial port driver. This function uses the get_current() call 406 * to determine which port is selected. 407 * 408 * Returns 0 on success, negative on error. 409 */ 410 void serial_setbrg(void) 411 { 412 get_current()->setbrg(); 413 } 414 415 /** 416 * serial_getc() - Read character from currently selected serial port 417 * 418 * This function retrieves a character from currently selected serial 419 * port. In case there is no character waiting on the serial port, 420 * this function will block and wait for the character to appear. This 421 * function uses the get_current() call to determine which port is 422 * selected. 423 * 424 * Returns the character on success, negative on error. 425 */ 426 int serial_getc(void) 427 { 428 return get_current()->getc(); 429 } 430 431 /** 432 * serial_tstc() - Test if data is available on currently selected serial port 433 * 434 * This function tests if one or more characters are available on 435 * currently selected serial port. This function never blocks. This 436 * function uses the get_current() call to determine which port is 437 * selected. 438 * 439 * Returns positive if character is available, zero otherwise. 440 */ 441 int serial_tstc(void) 442 { 443 return get_current()->tstc(); 444 } 445 446 /** 447 * serial_putc() - Output character via currently selected serial port 448 * @c: Single character to be output from the serial port. 449 * 450 * This function outputs a character via currently selected serial 451 * port. This character is passed to the serial port driver responsible 452 * for controlling the hardware. The hardware may still be in process 453 * of transmitting another character, therefore this function may block 454 * for a short amount of time. This function uses the get_current() 455 * call to determine which port is selected. 456 */ 457 void serial_putc(const char c) 458 { 459 get_current()->putc(c); 460 } 461 462 /** 463 * serial_puts() - Output string via currently selected serial port 464 * @s: Zero-terminated string to be output from the serial port. 465 * 466 * This function outputs a zero-terminated string via currently 467 * selected serial port. This function behaves as an accelerator 468 * in case the hardware can queue multiple characters for transfer. 469 * The whole string that is to be output is available to the function 470 * implementing the hardware manipulation. Transmitting the whole 471 * string may take some time, thus this function may block for some 472 * amount of time. This function uses the get_current() call to 473 * determine which port is selected. 474 */ 475 void serial_puts(const char *s) 476 { 477 get_current()->puts(s); 478 } 479 480 /** 481 * default_serial_puts() - Output string by calling serial_putc() in loop 482 * @s: Zero-terminated string to be output from the serial port. 483 * 484 * This function outputs a zero-terminated string by calling serial_putc() 485 * in a loop. Most drivers do not support queueing more than one byte for 486 * transfer, thus this function precisely implements their serial_puts(). 487 * 488 * To optimize the number of get_current() calls, this function only 489 * calls get_current() once and then directly accesses the putc() call 490 * of the &struct serial_device . 491 */ 492 void default_serial_puts(const char *s) 493 { 494 struct serial_device *dev = get_current(); 495 while (*s) 496 dev->putc(*s++); 497 } 498 499 #if CONFIG_POST & CONFIG_SYS_POST_UART 500 static const int bauds[] = CONFIG_SYS_BAUDRATE_TABLE; 501 502 /** 503 * uart_post_test() - Test the currently selected serial port using POST 504 * @flags: POST framework flags 505 * 506 * Do a loopback test of the currently selected serial port. This 507 * function is only useful in the context of the POST testing framwork. 508 * The serial port is firstly configured into loopback mode and then 509 * characters are sent through it. 510 * 511 * Returns 0 on success, value otherwise. 512 */ 513 /* Mark weak until post/cpu/.../uart.c migrate over */ 514 __weak 515 int uart_post_test(int flags) 516 { 517 unsigned char c; 518 int ret, saved_baud, b; 519 struct serial_device *saved_dev, *s; 520 bd_t *bd = gd->bd; 521 522 /* Save current serial state */ 523 ret = 0; 524 saved_dev = serial_current; 525 saved_baud = bd->bi_baudrate; 526 527 for (s = serial_devices; s; s = s->next) { 528 /* If this driver doesn't support loop back, skip it */ 529 if (!s->loop) 530 continue; 531 532 /* Test the next device */ 533 serial_current = s; 534 535 ret = serial_init(); 536 if (ret) 537 goto done; 538 539 /* Consume anything that happens to be queued */ 540 while (serial_tstc()) 541 serial_getc(); 542 543 /* Enable loop back */ 544 s->loop(1); 545 546 /* Test every available baud rate */ 547 for (b = 0; b < ARRAY_SIZE(bauds); ++b) { 548 bd->bi_baudrate = bauds[b]; 549 serial_setbrg(); 550 551 /* 552 * Stick to printable chars to avoid issues: 553 * - terminal corruption 554 * - serial program reacting to sequences and sending 555 * back random extra data 556 * - most serial drivers add in extra chars (like \r\n) 557 */ 558 for (c = 0x20; c < 0x7f; ++c) { 559 /* Send it out */ 560 serial_putc(c); 561 562 /* Make sure it's the same one */ 563 ret = (c != serial_getc()); 564 if (ret) { 565 s->loop(0); 566 goto done; 567 } 568 569 /* Clean up the output in case it was sent */ 570 serial_putc('\b'); 571 ret = ('\b' != serial_getc()); 572 if (ret) { 573 s->loop(0); 574 goto done; 575 } 576 } 577 } 578 579 /* Disable loop back */ 580 s->loop(0); 581 582 /* XXX: There is no serial_stop() !? */ 583 if (s->stop) 584 s->stop(); 585 } 586 587 done: 588 /* Restore previous serial state */ 589 serial_current = saved_dev; 590 bd->bi_baudrate = saved_baud; 591 serial_reinit_all(); 592 serial_setbrg(); 593 594 return ret; 595 } 596 #endif 597