cmd_dcr.c 6.0 KB

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