modem.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. /* dbg("(%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. extern void dbg(const char *fmt, ...);
  37. int mdm_init (void)
  38. {
  39. char env_str[16];
  40. char *init_str;
  41. int i;
  42. extern void enable_putc(void);
  43. extern int hwflow_onoff(int);
  44. enable_putc(); /* enable serial_putc() */
  45. #ifdef CONFIG_HWFLOW
  46. init_str = getenv("mdm_flow_control");
  47. if (init_str && (strcmp(init_str, "rts/cts") == 0))
  48. hwflow_onoff (1);
  49. else
  50. hwflow_onoff(-1);
  51. #endif
  52. for (i = 1;;i++) {
  53. sprintf(env_str, "mdm_init%d", i);
  54. if ((init_str = getenv(env_str)) != NULL) {
  55. serial_puts(init_str);
  56. serial_puts("\n");
  57. for(;;) {
  58. mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);
  59. dbg("ini%d: [%s]", i, console_buffer);
  60. if ((strcmp(console_buffer, "OK") == 0) ||
  61. (strcmp(console_buffer, "ERROR") == 0)) {
  62. dbg("ini%d: cmd done", i);
  63. break;
  64. } else /* in case we are originating call ... */
  65. if (strncmp(console_buffer, "CONNECT", 7) == 0) {
  66. dbg("ini%d: connect", i);
  67. return 0;
  68. }
  69. }
  70. } else
  71. break; /* no init string - stop modem init */
  72. udelay(100000);
  73. }
  74. udelay(100000);
  75. /* final stage - wait for connect */
  76. for(;i > 1;) { /* if 'i' > 1 - wait for connection
  77. message from modem */
  78. mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);
  79. dbg("ini_f: [%s]", console_buffer);
  80. if (strncmp(console_buffer, "CONNECT", 7) == 0) {
  81. dbg("ini_f: connected");
  82. return 0;
  83. }
  84. }
  85. return 0;
  86. }