cmd_dcr.c 6.0 KB

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