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.

60 lines
2.3KB

  1. /***************************************************************************
  2. * Copyright (C) 2010 by Spencer Oliver *
  3. * spen@spen-soft.co.uk *
  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. .arm
  22. .arch armv4t
  23. .section .init
  24. /*
  25. r0 source address
  26. r1 address
  27. r2 FLASH_CR0
  28. r3 dword count
  29. r4 result
  30. r5 busy mask
  31. */
  32. write:
  33. mov r4, #0x10000000 /* set DWPG bit */
  34. str r4, [r2, #0x0] /* FLASH_CR0 */
  35. str r1, [r2, #0x10] /* FLASH_AR */
  36. ldr r4, [r0], #4 /* load data */
  37. str r4, [r2, #0x8] /* FLASH_DR0 */
  38. ldr r4, [r0], #4 /* load data */
  39. str r4, [r2, #0xc] /* FLASH_DR1 */
  40. mov r4, #0x90000000 /* set DWPG and WMS bits */
  41. str r4, [r2, #0x0] /* FLASH_CR0 */
  42. busy:
  43. ldr r4, [r2, #0x0] /* FLASH_CR0 */
  44. tst r4, r5
  45. bne busy
  46. ldr r4, [r2, #0x14] /* FLASH_ER */
  47. tst r4, #0xff /* do we have errors */
  48. tsteq r4, #0x100 /* write protection set */
  49. bne exit
  50. add r1, r1, #0x8 /* next 8 bytes */
  51. subs r3, r3, #1 /* decremment dword count */
  52. bne write
  53. exit:
  54. b exit
  55. .end