hw_macros.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*******************************************************************************
  2. * (c) Copyright 2007-2013 Microsemi SoC Products Group. All rights reserved.
  3. *
  4. * Hardware registers access macros.
  5. *
  6. * THE MACROS DEFINED IN THIS FILE ARE DEPRECATED. DO NOT USED FOR NEW
  7. * DEVELOPMENT.
  8. *
  9. * These macros are used to access peripheral's registers. They allow access to
  10. * 8, 16 and 32 bit wide registers. All accesses to peripheral registers should
  11. * be done through these macros in order to ease porting accross different
  12. * processors/bus architectures.
  13. *
  14. * Some of these macros also allow to access a specific register field.
  15. *
  16. * SVN $Revision: 5258 $
  17. * SVN $Date: 2013-03-21 18:11:02 +0530 (Thu, 21 Mar 2013) $
  18. */
  19. #ifndef __HW_REGISTER_MACROS_H
  20. #define __HW_REGISTER_MACROS_H 1
  21. /*------------------------------------------------------------------------------
  22. * 32 bits registers access:
  23. */
  24. #define HW_get_uint32_reg(BASE_ADDR, REG_OFFSET) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
  25. #define HW_set_uint32_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
  26. #define HW_set_uint32_reg_field(BASE_ADDR, FIELD, VALUE) \
  27. (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
  28. ( \
  29. (uint32_t) \
  30. ( \
  31. (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
  32. (uint32_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
  33. ) \
  34. )
  35. #define HW_get_uint32_reg_field( BASE_ADDR, FIELD ) \
  36. (( (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
  37. /*------------------------------------------------------------------------------
  38. * 32 bits memory access:
  39. */
  40. #define HW_get_uint32(BASE_ADDR) (*((uint32_t volatile *)(BASE_ADDR)))
  41. #define HW_set_uint32(BASE_ADDR, VALUE) (*((uint32_t volatile *)(BASE_ADDR)) = (VALUE))
  42. /*------------------------------------------------------------------------------
  43. * 16 bits registers access:
  44. */
  45. #define HW_get_uint16_reg(BASE_ADDR, REG_OFFSET) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
  46. #define HW_set_uint16_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
  47. #define HW_set_uint16_reg_field(BASE_ADDR, FIELD, VALUE) \
  48. (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
  49. ( \
  50. (uint16_t) \
  51. ( \
  52. (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
  53. (uint16_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
  54. ) \
  55. )
  56. #define HW_get_uint16_reg_field( BASE_ADDR, FIELD ) \
  57. (( (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
  58. /*------------------------------------------------------------------------------
  59. * 8 bits registers access:
  60. */
  61. #define HW_get_uint8_reg(BASE_ADDR, REG_OFFSET) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))
  62. #define HW_set_uint8_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))
  63. #define HW_set_uint8_reg_field(BASE_ADDR, FIELD, VALUE) \
  64. (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) = \
  65. ( \
  66. (uint8_t) \
  67. ( \
  68. (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \
  69. (uint8_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \
  70. ) \
  71. )
  72. #define HW_get_uint8_reg_field( BASE_ADDR, FIELD ) \
  73. (( (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)
  74. /*------------------------------------------------------------------------------
  75. * 8 bits memory access:
  76. */
  77. #define HW_get_uint8(BASE_ADDR) (*((uint8_t volatile *)(BASE_ADDR)))
  78. #define HW_set_uint8(BASE_ADDR, VALUE) (*((uint8_t volatile *)(BASE_ADDR)) = (VALUE))
  79. #endif /* __HW_REGISTER_MACROS_H */