modem.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * (C) Copyright 2002-2009
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. /* 'inline' - We have to do it fast */
  9. static inline void mdm_readline(char *buf, int bufsiz)
  10. {
  11. char c;
  12. char *p;
  13. int n;
  14. n = 0;
  15. p = buf;
  16. for(;;) {
  17. c = serial_getc();
  18. debug("(%c)", c);
  19. switch(c) {
  20. case '\r':
  21. break;
  22. case '\n':
  23. *p = '\0';
  24. return;
  25. default:
  26. if(n++ > bufsiz) {
  27. *p = '\0';
  28. return; /* sanity check */
  29. }
  30. *p = c;
  31. p++;
  32. break;
  33. }
  34. }
  35. }
  36. int mdm_init (void)
  37. {
  38. char env_str[16];
  39. char *init_str;
  40. int i;
  41. extern void enable_putc(void);
  42. extern int hwflow_onoff(int);
  43. enable_putc(); /* enable serial_putc() */
  44. #ifdef CONFIG_HWFLOW
  45. init_str = getenv("mdm_flow_control");
  46. if (init_str && (strcmp(init_str, "rts/cts") == 0))
  47. hwflow_onoff (1);
  48. else
  49. hwflow_onoff(-1);
  50. #endif
  51. for (i = 1;;i++) {
  52. sprintf(env_str, "mdm_init%d", i);
  53. if ((init_str = getenv(env_str)) != NULL) {
  54. serial_puts(init_str);
  55. serial_puts("\n");
  56. for(;;) {
  57. mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);
  58. debug("ini%d: [%s]", i, console_buffer);
  59. if ((strcmp(console_buffer, "OK") == 0) ||
  60. (strcmp(console_buffer, "ERROR") == 0)) {
  61. debug("ini%d: cmd done", i);
  62. break;
  63. } else /* in case we are originating call ... */
  64. if (strncmp(console_buffer, "CONNECT", 7) == 0) {
  65. debug("ini%d: connect", i);
  66. return 0;
  67. }
  68. }
  69. } else
  70. break; /* no init string - stop modem init */
  71. udelay(100000);
  72. }
  73. udelay(100000);
  74. /* final stage - wait for connect */
  75. for(;i > 1;) { /* if 'i' > 1 - wait for connection
  76. message from modem */
  77. mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);
  78. debug("ini_f: [%s]", console_buffer);
  79. if (strncmp(console_buffer, "CONNECT", 7) == 0) {
  80. debug("ini_f: connected");
  81. return 0;
  82. }
  83. }
  84. return 0;
  85. }