at91_i2c_gpio.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * File : at91_i2c_gpio.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2012-04-25 weety first version
  13. */
  14. #include <rtdevice.h>
  15. #include <rthw.h>
  16. #include <at91sam926x.h>
  17. static void at91_i2c_gpio_init()
  18. {
  19. at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOA); //enable PIOA clock
  20. at91_sys_write(AT91_PIOA + PIO_PUER, (1 << 23));
  21. at91_sys_write(AT91_PIOA + PIO_PER, (1 << 23));
  22. at91_sys_write(AT91_PIOA + PIO_MDER, (1 << 23));
  23. at91_sys_write(AT91_PIOA + PIO_PUER, (1 << 24));
  24. at91_sys_write(AT91_PIOA + PIO_PER, (1 << 24));
  25. at91_sys_write(AT91_PIOA + PIO_MDER, (1 << 24));
  26. at91_sys_write(AT91_PIOA + PIO_OER, (1 << 23));
  27. at91_sys_write(AT91_PIOA + PIO_OER, (1 << 24));
  28. at91_sys_write(AT91_PIOA + PIO_SODR, (1 << 23));
  29. at91_sys_write(AT91_PIOA + PIO_SODR, (1 << 24));
  30. }
  31. static void at91_set_sda(void *data, rt_int32_t state)
  32. {
  33. if (state)
  34. {
  35. at91_sys_write(AT91_PIOA + PIO_SODR, (1 << 23));
  36. }
  37. else
  38. {
  39. at91_sys_write(AT91_PIOA + PIO_CODR, (1 << 23));
  40. }
  41. }
  42. static void at91_set_scl(void *data, rt_int32_t state)
  43. {
  44. if (state)
  45. {
  46. at91_sys_write(AT91_PIOA + PIO_SODR, (1 << 24));
  47. }
  48. else
  49. {
  50. at91_sys_write(AT91_PIOA + PIO_CODR, (1 << 24));
  51. }
  52. }
  53. static rt_int32_t at91_get_sda(void *data)
  54. {
  55. return at91_sys_read(AT91_PIOA + PIO_PDSR) & (1 << 23);
  56. }
  57. static rt_int32_t at91_get_scl(void *data)
  58. {
  59. return at91_sys_read(AT91_PIOA + PIO_PDSR) & (1 << 24);
  60. }
  61. static void at91_udelay (rt_uint32_t us)
  62. {
  63. rt_int32_t i;
  64. for (; us > 0; us--)
  65. {
  66. i = 50000;
  67. while(i > 0)
  68. {
  69. i--;
  70. }
  71. }
  72. }
  73. static const struct rt_i2c_bit_ops bit_ops = {
  74. RT_NULL,
  75. at91_set_sda,
  76. at91_set_scl,
  77. at91_get_sda,
  78. at91_get_scl,
  79. at91_udelay,
  80. 5,
  81. 100
  82. };
  83. rt_err_t at91_i2c_init(void)
  84. {
  85. struct rt_i2c_bus_device *bus;
  86. bus = rt_malloc(sizeof(struct rt_i2c_bus_device));
  87. if (bus == RT_NULL)
  88. {
  89. rt_kprintf("rt_malloc failed\n");
  90. return -RT_ENOMEM;
  91. }
  92. rt_memset((void *)bus, 0, sizeof(struct rt_i2c_bus_device));
  93. bus->priv = (void *)&bit_ops;
  94. at91_i2c_gpio_init();
  95. rt_i2c_bit_add_bus(bus, "i2c0");
  96. return RT_EOK;
  97. }