debugport.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. /* Serialport functions for debugging
  2. *
  3. * Copyright (c) 2000-2007 Axis Communications AB
  4. *
  5. * Authors: Bjorn Wesen
  6. *
  7. * Exports:
  8. * console_print_etrax(char *buf)
  9. * int getDebugChar()
  10. * putDebugChar(int)
  11. * enableDebugIRQ()
  12. * init_etrax_debug()
  13. *
  14. */
  15. #include <linux/console.h>
  16. #include <linux/init.h>
  17. #include <linux/major.h>
  18. #include <linux/delay.h>
  19. #include <linux/tty.h>
  20. #include <arch/svinto.h>
  21. #include <asm/io.h> /* Get SIMCOUT. */
  22. extern void reset_watchdog(void);
  23. struct dbg_port
  24. {
  25. unsigned int index;
  26. const volatile unsigned* read;
  27. volatile char* write;
  28. volatile unsigned* xoff;
  29. volatile char* baud;
  30. volatile char* tr_ctrl;
  31. volatile char* rec_ctrl;
  32. unsigned long irq;
  33. unsigned int started;
  34. unsigned long baudrate;
  35. unsigned char parity;
  36. unsigned int bits;
  37. };
  38. struct dbg_port ports[]=
  39. {
  40. {
  41. 0,
  42. R_SERIAL0_READ,
  43. R_SERIAL0_TR_DATA,
  44. R_SERIAL0_XOFF,
  45. R_SERIAL0_BAUD,
  46. R_SERIAL0_TR_CTRL,
  47. R_SERIAL0_REC_CTRL,
  48. IO_STATE(R_IRQ_MASK1_SET, ser0_data, set),
  49. 0,
  50. 115200,
  51. 'N',
  52. 8
  53. },
  54. {
  55. 1,
  56. R_SERIAL1_READ,
  57. R_SERIAL1_TR_DATA,
  58. R_SERIAL1_XOFF,
  59. R_SERIAL1_BAUD,
  60. R_SERIAL1_TR_CTRL,
  61. R_SERIAL1_REC_CTRL,
  62. IO_STATE(R_IRQ_MASK1_SET, ser1_data, set),
  63. 0,
  64. 115200,
  65. 'N',
  66. 8
  67. },
  68. {
  69. 2,
  70. R_SERIAL2_READ,
  71. R_SERIAL2_TR_DATA,
  72. R_SERIAL2_XOFF,
  73. R_SERIAL2_BAUD,
  74. R_SERIAL2_TR_CTRL,
  75. R_SERIAL2_REC_CTRL,
  76. IO_STATE(R_IRQ_MASK1_SET, ser2_data, set),
  77. 0,
  78. 115200,
  79. 'N',
  80. 8
  81. },
  82. {
  83. 3,
  84. R_SERIAL3_READ,
  85. R_SERIAL3_TR_DATA,
  86. R_SERIAL3_XOFF,
  87. R_SERIAL3_BAUD,
  88. R_SERIAL3_TR_CTRL,
  89. R_SERIAL3_REC_CTRL,
  90. IO_STATE(R_IRQ_MASK1_SET, ser3_data, set),
  91. 0,
  92. 115200,
  93. 'N',
  94. 8
  95. }
  96. };
  97. #ifdef CONFIG_ETRAX_SERIAL
  98. extern struct tty_driver *serial_driver;
  99. #endif
  100. struct dbg_port* port =
  101. #if defined(CONFIG_ETRAX_DEBUG_PORT0)
  102. &ports[0];
  103. #elif defined(CONFIG_ETRAX_DEBUG_PORT1)
  104. &ports[1];
  105. #elif defined(CONFIG_ETRAX_DEBUG_PORT2)
  106. &ports[2];
  107. #elif defined(CONFIG_ETRAX_DEBUG_PORT3)
  108. &ports[3];
  109. #else
  110. NULL;
  111. #endif
  112. static struct dbg_port* kgdb_port =
  113. #if defined(CONFIG_ETRAX_KGDB_PORT0)
  114. &ports[0];
  115. #elif defined(CONFIG_ETRAX_KGDB_PORT1)
  116. &ports[1];
  117. #elif defined(CONFIG_ETRAX_KGDB_PORT2)
  118. &ports[2];
  119. #elif defined(CONFIG_ETRAX_KGDB_PORT3)
  120. &ports[3];
  121. #else
  122. NULL;
  123. #endif
  124. static void
  125. start_port(struct dbg_port* p)
  126. {
  127. unsigned long rec_ctrl = 0;
  128. unsigned long tr_ctrl = 0;
  129. if (!p)
  130. return;
  131. if (p->started)
  132. return;
  133. p->started = 1;
  134. if (p->index == 0)
  135. {
  136. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma6);
  137. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma6, unused);
  138. }
  139. else if (p->index == 1)
  140. {
  141. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma8);
  142. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma8, usb);
  143. }
  144. else if (p->index == 2)
  145. {
  146. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma2);
  147. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma2, par0);
  148. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma3);
  149. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma3, par0);
  150. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, ser2, select);
  151. }
  152. else
  153. {
  154. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma4);
  155. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma4, par1);
  156. genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma5);
  157. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma5, par1);
  158. genconfig_shadow |= IO_STATE(R_GEN_CONFIG, ser3, select);
  159. }
  160. *R_GEN_CONFIG = genconfig_shadow;
  161. *p->xoff =
  162. IO_STATE(R_SERIAL0_XOFF, tx_stop, enable) |
  163. IO_STATE(R_SERIAL0_XOFF, auto_xoff, disable) |
  164. IO_FIELD(R_SERIAL0_XOFF, xoff_char, 0);
  165. switch (p->baudrate)
  166. {
  167. case 0:
  168. case 115200:
  169. *p->baud =
  170. IO_STATE(R_SERIAL0_BAUD, tr_baud, c115k2Hz) |
  171. IO_STATE(R_SERIAL0_BAUD, rec_baud, c115k2Hz);
  172. break;
  173. case 1200:
  174. *p->baud =
  175. IO_STATE(R_SERIAL0_BAUD, tr_baud, c1200Hz) |
  176. IO_STATE(R_SERIAL0_BAUD, rec_baud, c1200Hz);
  177. break;
  178. case 2400:
  179. *p->baud =
  180. IO_STATE(R_SERIAL0_BAUD, tr_baud, c2400Hz) |
  181. IO_STATE(R_SERIAL0_BAUD, rec_baud, c2400Hz);
  182. break;
  183. case 4800:
  184. *p->baud =
  185. IO_STATE(R_SERIAL0_BAUD, tr_baud, c4800Hz) |
  186. IO_STATE(R_SERIAL0_BAUD, rec_baud, c4800Hz);
  187. break;
  188. case 9600:
  189. *p->baud =
  190. IO_STATE(R_SERIAL0_BAUD, tr_baud, c9600Hz) |
  191. IO_STATE(R_SERIAL0_BAUD, rec_baud, c9600Hz);
  192. break;
  193. case 19200:
  194. *p->baud =
  195. IO_STATE(R_SERIAL0_BAUD, tr_baud, c19k2Hz) |
  196. IO_STATE(R_SERIAL0_BAUD, rec_baud, c19k2Hz);
  197. break;
  198. case 38400:
  199. *p->baud =
  200. IO_STATE(R_SERIAL0_BAUD, tr_baud, c38k4Hz) |
  201. IO_STATE(R_SERIAL0_BAUD, rec_baud, c38k4Hz);
  202. break;
  203. case 57600:
  204. *p->baud =
  205. IO_STATE(R_SERIAL0_BAUD, tr_baud, c57k6Hz) |
  206. IO_STATE(R_SERIAL0_BAUD, rec_baud, c57k6Hz);
  207. break;
  208. default:
  209. *p->baud =
  210. IO_STATE(R_SERIAL0_BAUD, tr_baud, c115k2Hz) |
  211. IO_STATE(R_SERIAL0_BAUD, rec_baud, c115k2Hz);
  212. break;
  213. }
  214. if (p->parity == 'E') {
  215. rec_ctrl =
  216. IO_STATE(R_SERIAL0_REC_CTRL, rec_par, even) |
  217. IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, enable);
  218. tr_ctrl =
  219. IO_STATE(R_SERIAL0_TR_CTRL, tr_par, even) |
  220. IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, enable);
  221. } else if (p->parity == 'O') {
  222. rec_ctrl =
  223. IO_STATE(R_SERIAL0_REC_CTRL, rec_par, odd) |
  224. IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, enable);
  225. tr_ctrl =
  226. IO_STATE(R_SERIAL0_TR_CTRL, tr_par, odd) |
  227. IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, enable);
  228. } else {
  229. rec_ctrl =
  230. IO_STATE(R_SERIAL0_REC_CTRL, rec_par, even) |
  231. IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, disable);
  232. tr_ctrl =
  233. IO_STATE(R_SERIAL0_TR_CTRL, tr_par, even) |
  234. IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, disable);
  235. }
  236. if (p->bits == 7)
  237. {
  238. rec_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_bitnr, rec_7bit);
  239. tr_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_bitnr, tr_7bit);
  240. }
  241. else
  242. {
  243. rec_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_bitnr, rec_8bit);
  244. tr_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_bitnr, tr_8bit);
  245. }
  246. *p->rec_ctrl =
  247. IO_STATE(R_SERIAL0_REC_CTRL, dma_err, stop) |
  248. IO_STATE(R_SERIAL0_REC_CTRL, rec_enable, enable) |
  249. IO_STATE(R_SERIAL0_REC_CTRL, rts_, active) |
  250. IO_STATE(R_SERIAL0_REC_CTRL, sampling, middle) |
  251. IO_STATE(R_SERIAL0_REC_CTRL, rec_stick_par, normal) |
  252. rec_ctrl;
  253. *p->tr_ctrl =
  254. IO_FIELD(R_SERIAL0_TR_CTRL, txd, 0) |
  255. IO_STATE(R_SERIAL0_TR_CTRL, tr_enable, enable) |
  256. IO_STATE(R_SERIAL0_TR_CTRL, auto_cts, disabled) |
  257. IO_STATE(R_SERIAL0_TR_CTRL, stop_bits, one_bit) |
  258. IO_STATE(R_SERIAL0_TR_CTRL, tr_stick_par, normal) |
  259. tr_ctrl;
  260. }
  261. static void
  262. console_write_direct(struct console *co, const char *buf, unsigned int len)
  263. {
  264. int i;
  265. unsigned long flags;
  266. if (!port)
  267. return;
  268. local_irq_save(flags);
  269. /* Send data */
  270. for (i = 0; i < len; i++) {
  271. /* LF -> CRLF */
  272. if (buf[i] == '\n') {
  273. while (!(*port->read & IO_MASK(R_SERIAL0_READ, tr_ready)))
  274. ;
  275. *port->write = '\r';
  276. }
  277. /* Wait until transmitter is ready and send.*/
  278. while (!(*port->read & IO_MASK(R_SERIAL0_READ, tr_ready)))
  279. ;
  280. *port->write = buf[i];
  281. }
  282. /*
  283. * Feed the watchdog, otherwise it will reset the chip during boot.
  284. * The time to send an ordinary boot message line (10-90 chars)
  285. * varies between 1-8ms at 115200. What makes up for the additional
  286. * 90ms that allows the watchdog to bite?
  287. */
  288. reset_watchdog();
  289. local_irq_restore(flags);
  290. }
  291. static void
  292. console_write(struct console *co, const char *buf, unsigned int len)
  293. {
  294. if (!port)
  295. return;
  296. #ifdef CONFIG_SVINTO_SIM
  297. /* no use to simulate the serial debug output */
  298. SIMCOUT(buf, len);
  299. return;
  300. #endif
  301. console_write_direct(co, buf, len);
  302. }
  303. /* legacy function */
  304. void
  305. console_print_etrax(const char *buf)
  306. {
  307. console_write(NULL, buf, strlen(buf));
  308. }
  309. /* Use polling to get a single character FROM the debug port */
  310. int
  311. getDebugChar(void)
  312. {
  313. unsigned long readval;
  314. if (!kgdb_port)
  315. return 0;
  316. do {
  317. readval = *kgdb_port->read;
  318. } while (!(readval & IO_MASK(R_SERIAL0_READ, data_avail)));
  319. return (readval & IO_MASK(R_SERIAL0_READ, data_in));
  320. }
  321. /* Use polling to put a single character to the debug port */
  322. void
  323. putDebugChar(int val)
  324. {
  325. if (!kgdb_port)
  326. return;
  327. while (!(*kgdb_port->read & IO_MASK(R_SERIAL0_READ, tr_ready)))
  328. ;
  329. *kgdb_port->write = val;
  330. }
  331. /* Enable irq for receiving chars on the debug port, used by kgdb */
  332. void
  333. enableDebugIRQ(void)
  334. {
  335. if (!kgdb_port)
  336. return;
  337. *R_IRQ_MASK1_SET = kgdb_port->irq;
  338. /* use R_VECT_MASK directly, since we really bypass Linux normal
  339. * IRQ handling in kgdb anyway, we don't need to use enable_irq
  340. */
  341. *R_VECT_MASK_SET = IO_STATE(R_VECT_MASK_SET, serial, set);
  342. *kgdb_port->rec_ctrl = IO_STATE(R_SERIAL0_REC_CTRL, rec_enable, enable);
  343. }
  344. static int __init
  345. console_setup(struct console *co, char *options)
  346. {
  347. char* s;
  348. if (options) {
  349. port = &ports[co->index];
  350. port->baudrate = 115200;
  351. port->parity = 'N';
  352. port->bits = 8;
  353. port->baudrate = simple_strtoul(options, NULL, 10);
  354. s = options;
  355. while(*s >= '0' && *s <= '9')
  356. s++;
  357. if (*s) port->parity = *s++;
  358. if (*s) port->bits = *s++ - '0';
  359. port->started = 0;
  360. start_port(0);
  361. }
  362. return 0;
  363. }
  364. /* This is a dummy serial device that throws away anything written to it.
  365. * This is used when no debug output is wanted.
  366. */
  367. static struct tty_driver dummy_driver;
  368. static int dummy_open(struct tty_struct *tty, struct file * filp)
  369. {
  370. return 0;
  371. }
  372. static void dummy_close(struct tty_struct *tty, struct file * filp)
  373. {
  374. }
  375. static int dummy_write(struct tty_struct * tty,
  376. const unsigned char *buf, int count)
  377. {
  378. return count;
  379. }
  380. static int dummy_write_room(struct tty_struct *tty)
  381. {
  382. return 8192;
  383. }
  384. static const struct tty_operations dummy_ops = {
  385. .open = dummy_open,
  386. .close = dummy_close,
  387. .write = dummy_write,
  388. .write_room = dummy_write_room,
  389. };
  390. void __init
  391. init_dummy_console(void)
  392. {
  393. memset(&dummy_driver, 0, sizeof(struct tty_driver));
  394. dummy_driver.driver_name = "serial";
  395. dummy_driver.name = "ttyS";
  396. dummy_driver.major = TTY_MAJOR;
  397. dummy_driver.minor_start = 68;
  398. dummy_driver.num = 1; /* etrax100 has 4 serial ports */
  399. dummy_driver.type = TTY_DRIVER_TYPE_SERIAL;
  400. dummy_driver.subtype = SERIAL_TYPE_NORMAL;
  401. dummy_driver.init_termios = tty_std_termios;
  402. /* Normally B9600 default... */
  403. dummy_driver.init_termios.c_cflag =
  404. B115200 | CS8 | CREAD | HUPCL | CLOCAL;
  405. dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
  406. dummy_driver.init_termios.c_ispeed = 115200;
  407. dummy_driver.init_termios.c_ospeed = 115200;
  408. dummy_driver.ops = &dummy_ops;
  409. if (tty_register_driver(&dummy_driver))
  410. panic("Couldn't register dummy serial driver\n");
  411. }
  412. static struct tty_driver*
  413. etrax_console_device(struct console* co, int *index)
  414. {
  415. if (port)
  416. *index = port->index;
  417. else
  418. *index = 0;
  419. #ifdef CONFIG_ETRAX_SERIAL
  420. return port ? serial_driver : &dummy_driver;
  421. #else
  422. return &dummy_driver;
  423. #endif
  424. }
  425. static struct console sercons = {
  426. name : "ttyS",
  427. write: console_write,
  428. read : NULL,
  429. device : etrax_console_device,
  430. unblank : NULL,
  431. setup : console_setup,
  432. flags : CON_PRINTBUFFER,
  433. index : -1,
  434. cflag : 0,
  435. next : NULL
  436. };
  437. static struct console sercons0 = {
  438. name : "ttyS",
  439. write: console_write,
  440. read : NULL,
  441. device : etrax_console_device,
  442. unblank : NULL,
  443. setup : console_setup,
  444. flags : CON_PRINTBUFFER,
  445. index : 0,
  446. cflag : 0,
  447. next : NULL
  448. };
  449. static struct console sercons1 = {
  450. name : "ttyS",
  451. write: console_write,
  452. read : NULL,
  453. device : etrax_console_device,
  454. unblank : NULL,
  455. setup : console_setup,
  456. flags : CON_PRINTBUFFER,
  457. index : 1,
  458. cflag : 0,
  459. next : NULL
  460. };
  461. static struct console sercons2 = {
  462. name : "ttyS",
  463. write: console_write,
  464. read : NULL,
  465. device : etrax_console_device,
  466. unblank : NULL,
  467. setup : console_setup,
  468. flags : CON_PRINTBUFFER,
  469. index : 2,
  470. cflag : 0,
  471. next : NULL
  472. };
  473. static struct console sercons3 = {
  474. name : "ttyS",
  475. write: console_write,
  476. read : NULL,
  477. device : etrax_console_device,
  478. unblank : NULL,
  479. setup : console_setup,
  480. flags : CON_PRINTBUFFER,
  481. index : 3,
  482. cflag : 0,
  483. next : NULL
  484. };
  485. /*
  486. * Register console (for printk's etc)
  487. */
  488. int __init
  489. init_etrax_debug(void)
  490. {
  491. static int first = 1;
  492. if (!first) {
  493. unregister_console(&sercons);
  494. register_console(&sercons0);
  495. register_console(&sercons1);
  496. register_console(&sercons2);
  497. register_console(&sercons3);
  498. init_dummy_console();
  499. return 0;
  500. }
  501. first = 0;
  502. register_console(&sercons);
  503. start_port(port);
  504. #ifdef CONFIG_ETRAX_KGDB
  505. start_port(kgdb_port);
  506. #endif
  507. return 0;
  508. }
  509. __initcall(init_etrax_debug);