You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

78 lines
2.6 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2011 by Andreas Fritiofson *
  3. * andreas.fritiofson@gmail.com *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
  19. ***************************************************************************/
  20. .text
  21. .syntax unified
  22. .cpu cortex-m0
  23. .thumb
  24. /* Params:
  25. * r0 - flash base (in), status (out)
  26. * r1 - count (halfword-16bit)
  27. * r2 - workarea start
  28. * r3 - workarea end
  29. * r4 - target address
  30. * Clobbered:
  31. * r5 - rp
  32. * r6 - wp, tmp
  33. * r7 - tmp
  34. */
  35. #define STM32_FLASH_SR_OFFSET 0x0c /* offset of SR register from flash reg base */
  36. .thumb_func
  37. .global _start
  38. _start:
  39. wait_fifo:
  40. ldr r6, [r2, #0] /* read wp */
  41. cmp r6, #0 /* abort if wp == 0 */
  42. beq exit
  43. ldr r5, [r2, #4] /* read rp */
  44. cmp r5, r6 /* wait until rp != wp */
  45. beq wait_fifo
  46. ldrh r6, [r5] /* "*target_address++ = *rp++" */
  47. strh r6, [r4]
  48. adds r5, #2
  49. adds r4, #2
  50. busy:
  51. ldr r6, [r0, #STM32_FLASH_SR_OFFSET] /* wait until BSY flag is reset */
  52. movs r7, #1
  53. tst r6, r7
  54. bne busy
  55. movs r7, #0x14 /* check the error bits */
  56. tst r6, r7
  57. bne error
  58. cmp r5, r3 /* wrap rp at end of buffer */
  59. bcc no_wrap
  60. mov r5, r2
  61. adds r5, #8
  62. no_wrap:
  63. str r5, [r2, #4] /* store rp */
  64. subs r1, r1, #1 /* decrement halfword count */
  65. cmp r1, #0
  66. beq exit /* loop if not done */
  67. b wait_fifo
  68. error:
  69. movs r0, #0
  70. str r0, [r2, #4] /* set rp = 0 on error */
  71. exit:
  72. mov r0, r6 /* return status in r0 */
  73. bkpt #0