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