xfer.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/mips/galileo/compressed/xfer.c
  3.  *
  4.  *  By RidgeRun Inc,
  5.  *
  6.  *  Xfer an image from flash to ram.
  7.  *  For use with Galileo EVB64120A MIPS eval board.
  8.  */
  9. #include "linux/serial_reg.h"
  10. #define port 0xbd000000
  11. #define inb(addr) (*(volatile unsigned char *) ((unsigned long)(addr)))
  12. #define outb(b,addr) (*(volatile unsigned char *) ((unsigned long)(addr)) = (b))
  13. #ifdef RUNNINGFROMFLASH
  14. // This is where our image of interest is mapped to
  15. // when the jumbers are set for booting out of flash.
  16. // (flash part starts at address 0xbfC00000)
  17. #define srcAddr 0xbfC20000
  18. #else
  19. // This is where our image of interest is mapped to
  20. // when the jumbers are set for booting out of eprom.
  21. // (flash part starts at address 0xbf000000)
  22. #define srcAddr 0xbf020000
  23. #endif
  24. static int PortAddress(unsigned int channel, unsigned char reg);
  25. static void inline cons_hook(void);
  26. static void print_message(const char *string);
  27. /******************************
  28.  Routine:
  29.  Description:
  30.  ******************************/
  31. void XferToRam(void)
  32. {
  33. unsigned int temp;
  34. void (*entry_point) (void);
  35. cons_hook();
  36. print_message("Copying image from Flash to Ram.n");
  37. for (temp = 0; temp < (0x100000 - 0x20000); temp = temp + 4) {
  38. *(volatile unsigned int *) (temp + 0xa0400000) =
  39.     *(volatile unsigned int *) (temp + srcAddr);
  40. if (*(volatile unsigned int *) (temp + 0xa0400000) !=
  41.     *(volatile unsigned int *) (temp + srcAddr)) {
  42. print_message
  43.     ("Error!: copy verification failed.n");
  44. break;
  45. }
  46. }
  47. print_message("Now jumping to the code just xferred to ram.n");
  48. entry_point = (void *) 0x80400000;
  49. entry_point();
  50. }
  51. /******************************
  52.  Routine:
  53.  Description:
  54.  ******************************/
  55. static int PortAddress(unsigned int channel, unsigned char reg)
  56. {
  57. unsigned int channelOffset = 0x20;
  58. unsigned int regDelta = 4;
  59. return (port + (channel * channelOffset) + (reg * regDelta));
  60. }
  61. /******************************
  62.  Routine:
  63.  Description:
  64.  ******************************/
  65. static void cons_hook(void)
  66. {
  67. register int comstat;
  68. unsigned temp;
  69. unsigned int channel = 1; // Channel 1 is the main serial
  70. // connector of the EVB64120A. Channel 0
  71. // is the secondary serial port (typically
  72. // the unsoldered connector of the board).
  73. temp = *(unsigned int *) 0xb4000464;
  74. *(unsigned int *) 0xb4000464 = 0xffff4f14;
  75. // Set Baud Rate, baud=115K
  76. outb(0x83, PortAddress(channel, UART_LCR));
  77. outb(0x00, PortAddress(channel, UART_DLM));
  78. outb(0x02, PortAddress(channel, UART_DLL));
  79. outb(0x03, PortAddress(channel, UART_LCR));
  80. comstat = inb(PortAddress(channel, UART_LSR));
  81. comstat = inb(PortAddress(channel, UART_RX));
  82. outb(0x00, PortAddress(channel, UART_IER));
  83. }
  84. /******************************
  85.  Routine:
  86.  Description:
  87.  ******************************/
  88. static void print_message(const char *string)
  89. {
  90. register int count, loop;
  91. /* Display Opening Message */
  92. for (count = 0; string[count]; count++) {
  93. if (string[count] == 'n') {
  94. *(char *) 0xbd000020 = 'r';
  95. }
  96. *(char *) 0xbd000020 = string[count];
  97. for (loop = 0; loop < 2000; loop++) {
  98. }
  99. }
  100. }