This was necessary to generate set clock function for i2c driver
without resetting the whole module
---
 .../arm/atsam/libraries/libchip/include/twi.h      |  2 ++
 .../arm/atsam/libraries/libchip/source/twi.c       | 33 ++++++++++++++--------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h 
b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h
index 6a5de36..07471a1 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h
@@ -68,6 +68,8 @@ extern "C" {
  *        External function
  
*----------------------------------------------------------------------------*/
 
+extern void TWI_ConfigureClock(Twihs *pTwi, uint32_t twck, uint32_t mck);
+
 extern void TWI_ConfigureMaster(Twihs *pTwi, uint32_t twck, uint32_t mck);
 
 extern void TWI_ConfigureSlave(Twihs *pTwi, uint8_t slaveAddress);
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c 
b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c
index 29faee6..5012ea5 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c
@@ -102,25 +102,15 @@ uint32_t twi_send_stop = 0;
  *        Exported functions
  
*----------------------------------------------------------------------------*/
 
-/**
- * \brief Configures a TWI peripheral to operate in master mode, at the given
- * frequency (in Hz). The duty cycle of the TWI clock is set to 50%.
- * \param pTwi  Pointer to an Twihs instance.
- * \param twck  Desired TWI clock frequency.
- * \param mck  Master clock frequency.
- */
-void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk)
+void TWI_ConfigureClock(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk)
 {
        uint32_t dwCkDiv = 0;
        uint32_t dwClDiv;
        uint32_t dwOk = 0;
 
-       TRACE_DEBUG("TWI_ConfigureMaster()\n\r");
+       TRACE_DEBUG("TWI_ConfigureClock()\n\r");
        assert(pTwi);
 
-       /* Reset the TWI */
-       pTwi->TWIHS_CR = TWIHS_CR_SWRST;
-
        /* Configure clock */
        while (!dwOk) {
                dwClDiv = ((dwMCk / (2 * dwTwCk)) - 4) / (1 << dwCkDiv);
@@ -135,6 +125,25 @@ void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, 
uint32_t dwMCk)
        TRACE_DEBUG("Using CKDIV = %u and CLDIV/CHDIV = %u\n\r", dwCkDiv, 
dwClDiv);
 
        pTwi->TWIHS_CWGR = (dwCkDiv << 16) | (dwClDiv << 8) | dwClDiv;
+}
+
+
+/**
+ * \brief Configures a TWI peripheral to operate in master mode, at the given
+ * frequency (in Hz). The duty cycle of the TWI clock is set to 50%.
+ * \param pTwi  Pointer to an Twihs instance.
+ * \param twck  Desired TWI clock frequency.
+ * \param mck  Master clock frequency.
+ */
+void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk)
+{
+       TRACE_DEBUG("TWI_ConfigureMaster()\n\r");
+       assert(pTwi);
+
+       /* Reset the TWI */
+       pTwi->TWIHS_CR = TWIHS_CR_SWRST;
+
+       TWI_ConfigureClock(pTwi, dwTwCk, dwMCk);
 
        /* TWI Slave Mode Disabled. */
        pTwi->TWIHS_CR = TWIHS_CR_SVDIS;
-- 
1.8.4.5

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to