dcr.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * (C) Copyright 2001
  3. * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /*
  8. * AMCC 4XX DCR Functions
  9. */
  10. #include <common.h>
  11. #include <cli.h>
  12. #include <config.h>
  13. #include <command.h>
  14. #include <console.h>
  15. unsigned long get_dcr (unsigned short);
  16. unsigned long set_dcr (unsigned short, unsigned long);
  17. /* =======================================================================
  18. * Interpreter command to retrieve an AMCC PPC 4xx Device Control Register
  19. * =======================================================================
  20. */
  21. int do_getdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] )
  22. {
  23. unsigned short dcrn; /* Device Control Register Num */
  24. unsigned long value; /* DCR's value */
  25. unsigned long get_dcr (unsigned short);
  26. /* Validate arguments */
  27. if (argc < 2)
  28. return CMD_RET_USAGE;
  29. /* Get a DCR */
  30. dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16);
  31. value = get_dcr (dcrn);
  32. printf ("%04x: %08lx\n", dcrn, value);
  33. return 0;
  34. }
  35. /* ======================================================================
  36. * Interpreter command to set an AMCC PPC 4xx Device Control Register
  37. * ======================================================================
  38. */
  39. int do_setdcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
  40. {
  41. unsigned short dcrn; /* Device Control Register Num */
  42. unsigned long value;
  43. /* DCR's value */
  44. int nbytes;
  45. /* Validate arguments */
  46. if (argc < 2)
  47. return CMD_RET_USAGE;
  48. /* Set a DCR */
  49. dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16);
  50. do {
  51. value = get_dcr (dcrn);
  52. printf ("%04x: %08lx", dcrn, value);
  53. nbytes = cli_readline(" ? ");
  54. if (nbytes == 0) {
  55. /*
  56. * <CR> pressed as only input, don't modify current
  57. * location and exit command.
  58. */
  59. nbytes = 1;
  60. return 0;
  61. } else {
  62. unsigned long i;
  63. char *endp;
  64. i = simple_strtoul (console_buffer, &endp, 16);
  65. nbytes = endp - console_buffer;
  66. if (nbytes)
  67. set_dcr (dcrn, i);
  68. }
  69. } while (nbytes);
  70. return 0;
  71. }
  72. /* =======================================================================
  73. * Interpreter command to retrieve an register value through AMCC PPC 4xx
  74. * Device Control Register inderect addressing.
  75. * =======================================================================
  76. */
  77. int do_getidcr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  78. {
  79. unsigned short adr_dcrn; /* Device Control Register Num for Address */
  80. unsigned short dat_dcrn; /* Device Control Register Num for Data */
  81. unsigned short offset; /* Register's offset */
  82. unsigned long value; /* Register's value */
  83. char *ptr = NULL;
  84. char buf[80];
  85. /* Validate arguments */
  86. if (argc < 3)
  87. return CMD_RET_USAGE;
  88. /* Find out whether ther is '.' (dot) symbol in the first parameter. */
  89. strncpy (buf, argv[1], sizeof(buf)-1);
  90. buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */
  91. ptr = strchr (buf, '.');
  92. if (ptr != NULL) {
  93. /* First parameter has format adr_dcrn.dat_dcrn */
  94. *ptr++ = 0; /* erase '.', create zero-end string */
  95. adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16);
  96. dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16);
  97. } else {
  98. /*
  99. * First parameter has format adr_dcrn; dat_dcrn will be
  100. * calculated as adr_dcrn+1.
  101. */
  102. adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16);
  103. dat_dcrn = adr_dcrn+1;
  104. }
  105. /* Register's offset */
  106. offset = (unsigned short) simple_strtoul (argv[2], NULL, 16);
  107. /* Disable interrupts */
  108. disable_interrupts ();
  109. /* Set offset */
  110. set_dcr (adr_dcrn, offset);
  111. /* get data */
  112. value = get_dcr (dat_dcrn);
  113. /* Enable interrupts */
  114. enable_interrupts ();
  115. printf ("%04x.%04x-%04x Read %08lx\n", adr_dcrn, dat_dcrn, offset, value);
  116. return 0;
  117. }
  118. /* =======================================================================
  119. * Interpreter command to update an register value through AMCC PPC 4xx
  120. * Device Control Register inderect addressing.
  121. * =======================================================================
  122. */
  123. int do_setidcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
  124. {
  125. unsigned short adr_dcrn; /* Device Control Register Num for Address */
  126. unsigned short dat_dcrn; /* Device Control Register Num for Data */
  127. unsigned short offset; /* Register's offset */
  128. unsigned long value; /* Register's value */
  129. char *ptr = NULL;
  130. char buf[80];
  131. /* Validate arguments */
  132. if (argc < 4)
  133. return CMD_RET_USAGE;
  134. /* Find out whether ther is '.' (dot) symbol in the first parameter. */
  135. strncpy (buf, argv[1], sizeof(buf)-1);
  136. buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */
  137. ptr = strchr (buf, '.');
  138. if (ptr != NULL) {
  139. /* First parameter has format adr_dcrn.dat_dcrn */
  140. *ptr++ = 0; /* erase '.', create zero-end string */
  141. adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16);
  142. dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16);
  143. } else {
  144. /*
  145. * First parameter has format adr_dcrn; dat_dcrn will be
  146. * calculated as adr_dcrn+1.
  147. */
  148. adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16);
  149. dat_dcrn = adr_dcrn+1;
  150. }
  151. /* Register's offset */
  152. offset = (unsigned short) simple_strtoul (argv[2], NULL, 16);
  153. /* New value */
  154. value = (unsigned long) simple_strtoul (argv[3], NULL, 16);
  155. /* Disable interrupts */
  156. disable_interrupts ();
  157. /* Set offset */
  158. set_dcr (adr_dcrn, offset);
  159. /* set data */
  160. set_dcr (dat_dcrn, value);
  161. /* Enable interrupts */
  162. enable_interrupts ();
  163. printf ("%04x.%04x-%04x Write %08lx\n", adr_dcrn, dat_dcrn, offset, value);
  164. return 0;
  165. }
  166. /***************************************************/
  167. U_BOOT_CMD(
  168. getdcr, 2, 1, do_getdcr,
  169. "Get an AMCC PPC 4xx DCR's value",
  170. "dcrn - return a DCR's value."
  171. );
  172. U_BOOT_CMD(
  173. setdcr, 2, 1, do_setdcr,
  174. "Set an AMCC PPC 4xx DCR's value",
  175. "dcrn - set a DCR's value."
  176. );
  177. U_BOOT_CMD(
  178. getidcr, 3, 1, do_getidcr,
  179. "Get a register value via indirect DCR addressing",
  180. "adr_dcrn[.dat_dcrn] offset - write offset to adr_dcrn, read value from dat_dcrn."
  181. );
  182. U_BOOT_CMD(
  183. setidcr, 4, 1, do_setidcr,
  184. "Set a register value via indirect DCR addressing",
  185. "adr_dcrn[.dat_dcrn] offset value - write offset to adr_dcrn, write value to dat_dcrn."
  186. );