Hello Sichen, I get an error when trying to build the BSP with these patches. Please see output below. Seems that some of the defines in the C file haven't been changed together with the H.
Kind regards Christian Error output during build: arm-rtems4.12-gcc --pipe -B../../../../../.././lib/ -B../../../../../.././beagleboneblack/lib/ -specs bsp_specs -qrtems -DHAVE_CONFIG_H -I/home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/../shared/armv467ar-basic-cache -mcpu=cortex-a8 -O2 -g -ffunction-sections -fdata-sections -Wall -Wmissing-prototypes -Wimplicit-function-declaration -Wstrict-prototypes -Wnested-externs -MT libbsp_a-bbb-i2c.o -MD -MP -MF .deps/libbsp_a-bbb-i2c.Tpo -c -o libbsp_a-bbb-i2c.o `test -f 'i2c/bbb-i2c.c' || echo '/home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/'`i2c/bbb-i2c.c /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_reset': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:83:36: error: 'I2C_CON_EN' undeclared (first use in this function) if ( REG( ®s->BBB_I2C_CON ) & I2C_CON_EN ) { ^~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:83:36: note: each undeclared identifier is reported only once for each function it appears in /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:84:33: error: 'I2C_CON_CLR' undeclared (first use in this function) REG( ®s->BBB_I2C_CON ) = I2C_CON_CLR; ^~~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:88:32: error: 'I2C_SYSC_SRST' undeclared (first use in this function) REG( ®s->BBB_I2C_SYSC ) = I2C_SYSC_SRST; /* for ES2 after soft reset */ ^~~~~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:92:43: error: 'I2C_SYSS_RDONE' undeclared (first use in this function) while ( !( REG( ®s->BBB_I2C_SYSS ) & I2C_SYSS_RDONE ) && timeout-- ) { ^~~~~~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_clean_interrupts': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:172:38: error: 'I2C_ALL_FLAGS' undeclared (first use in this function) am335x_i2c_masterint_enable( regs, I2C_ALL_FLAGS ); ^~~~~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_setup_read_transfer': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:185:25: warning: unused variable 'status' [-Wunused-variable] int status; ^~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:184:25: warning: unused variable 'no_bytes' [-Wunused-variable] volatile unsigned int no_bytes; ^~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_setup_write_transfer': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:243:25: warning: variable 'no_bytes' set but not used [-Wunused-but-set-variable] volatile unsigned int no_bytes; ^~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_interrupt': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:318:39: error: 'I2C_STAT_ARDY' undeclared (first use in this function) REG( ®s->BBB_I2C_IRQSTATUS ) = I2C_STAT_ARDY; ^~~~~~~~~~~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_set_clock': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:395:26: warning: unused variable 'regs' [-Wunused-variable] volatile bbb_i2c_regs *regs = bus->regs; ^~~~ /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c: In function 'am335x_i2c_bus_register': /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:450:42: error: 'I2C_ALL_IRQ_FLAGS' undeclared (first use in this function) REG( &bus->regs->BBB_I2C_IRQSTATUS ) = I2C_ALL_IRQ_FLAGS; ^~~~~~~~~~~~~~~~~ At top level: /home/christian/rtems/rtems-sichenzhao/build/..//rtems/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c:141:21: warning: 'am335x_i2c_intrawstatus' defined but not used [-Wunused-function] static unsigned int am335x_i2c_intrawstatus( volatile bbb_i2c_regs *regs ) ^~~~~~~~~~~~~~~~~~~~~~~ make[7]: *** [Makefile:1052: libbsp_a-bbb-i2c.o] Fehler 1 make[7]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack/lib/libbsp/arm/beagle“ wird verlassen make[6]: *** [Makefile:781: beagle] Fehler 2 make[6]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack/lib/libbsp/arm“ wird verlassen make[5]: *** [Makefile:786: arm] Fehler 2 make[5]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack/lib/libbsp“ wird verlassen make[4]: *** [Makefile:477: libbsp] Fehler 2 make[4]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack/lib“ wird verlassen make[3]: *** [Makefile:946: lib] Fehler 2 make[3]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack“ wird verlassen make[2]: *** [Makefile:443: all-recursive] Fehler 1 make[2]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c/beagleboneblack“ wird verlassen make[1]: *** [Makefile:286: all-recursive] Fehler 1 make[1]: Verzeichnis „/home/christian/rtems/rtems-sichenzhao/build/b-beagleboneblack/arm-rtems4.12/c“ wird verlassen make: *** [Makefile:410: all-recursive] Fehler 1 ----- Ursprüngliche Mail ----- > Von: "Sichen Zhao" <1473996...@qq.com> > An: devel@rtems.org > CC: "punit vara" <punitv...@gmail.com>, "Christian Mauderer" > <christian.maude...@embedded-brains.de>, "Sichen Zhao" > <1473996...@qq.com> > Gesendet: Sonntag, 4. Juni 2017 18:03:49 > Betreff: [PATCH v3 2/2] Add the i2c driver for Beaglebone Black > Update ticket #2891 and my GSOC project > add c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c > modify c/src/lib/libbsp/arm/beagle/include/i2c.h > modify c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h > modify c/src/lib/libcpu/arm/shared/include/am335x.h > modify c/src/lib/libbsp/arm/beagle/Makefile.am > Now can read the EEPROM by i2c, the test application link is: > https://github.com/hahchenchen/GSOC-test-application > --- > c/src/lib/libbsp/arm/beagle/Makefile.am | 1 + > c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c | 470 +++++++++++++++++++++++++ > c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h | 4 +- > c/src/lib/libbsp/arm/beagle/include/i2c.h | 304 ++++++++-------- > c/src/lib/libcpu/arm/shared/include/am335x.h | 136 +++++++ > 5 files changed, 774 insertions(+), 141 deletions(-) > create mode 100644 c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c > > diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am > b/c/src/lib/libbsp/arm/beagle/Makefile.am > index c14db49..8e10ee2 100644 > --- a/c/src/lib/libbsp/arm/beagle/Makefile.am > +++ b/c/src/lib/libbsp/arm/beagle/Makefile.am > @@ -114,6 +114,7 @@ libbsp_a_SOURCES += ../../shared/console.c \ > ../../shared/console_control.c > > # I2C > +libbsp_a_SOURCES += i2c/bbb-i2c.c > > # GPIO > libbsp_a_SOURCES += gpio/bbb-gpio.c > diff --git a/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c > b/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c > new file mode 100644 > index 0000000..8d0c9c1 > --- /dev/null > +++ b/c/src/lib/libbsp/arm/beagle/i2c/bbb-i2c.c > @@ -0,0 +1,470 @@ > +/** > + * @file > + * > + * @ingroup arm_beagle > + * > + * @brief BeagleBoard I2C bus initialization and API Support. > + */ > + > +/* > + * Copyright (c) 2017 Sichen Zhao <zsc19940...@gmail.com> > + * > + * The license and distribution terms for this file may be > + * found in the file LICENSE in this distribution or at > + * http://www.rtems.org/license/LICENSE. > + */ > + > +/* > + * Modified on Punit Vara<punitv...@gmail.com> works, currently > + * the i2c file is working on the Beaglebone Black board(AM335x) > + */ > + > +#include <stdio.h> > +#include <bsp/i2c.h> > +#include <libcpu/am335x.h> > +#include <rtems/irq-extension.h> > +#include <rtems/counter.h> > +#include <bsp/bbb-gpio.h> > +#include <rtems/score/assert.h> > + > +static void am335x_i2c0_pinmux( bbb_i2c_bus *bus ) > +{ > + REG( bus->regs + AM335X_CONF_I2C0_SDA ) = > + ( BBB_RXACTIVE | BBB_SLEWCTRL | BBB_PU_EN ); > + > + REG( bus->regs + AM335X_CONF_I2C0_SCL ) = > + ( BBB_RXACTIVE | BBB_SLEWCTRL | BBB_PU_EN ); > +} > + > +static void I2C0ModuleClkConfig( void ) > +{ > + /* Writing to MODULEMODE field of AM335X_CM_WKUP_I2C0_CLKCTRL register. */ > + REG( AM335X_SOC_CM_WKUP_REGS + AM335X_CM_WKUP_I2C0_CLKCTRL ) |= > + AM335X_CM_WKUP_I2C0_CLKCTRL_MODULEMODE_ENABLE; > + > + /* Waiting for MODULEMODE field to reflect the written value. */ > + while ( AM335X_CM_WKUP_I2C0_CLKCTRL_MODULEMODE_ENABLE != > + ( REG( AM335X_SOC_CM_WKUP_REGS + AM335X_CM_WKUP_I2C0_CLKCTRL ) & > + AM335X_CM_WKUP_I2C0_CLKCTRL_MODULEMODE ) ) ; > + > + /* > + ** Waiting for IDLEST field in AM335X_CM_WKUP_CONTROL_CLKCTRL > + ** register to attain > + ** desired value. > + */ > + while ( ( AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST_FUNC << > + AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST_SHIFT ) != > + ( REG( AM335X_SOC_CM_WKUP_REGS + AM335X_CM_WKUP_CONTROL_CLKCTRL ) & > + AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST ) ) ; > + > + /* > + ** Waiting for CLKACTIVITY_I2C0_GFCLK field in AM335X_CM_WKUP_CLKSTCTRL > + ** register to attain desired value. > + */ > + while ( AM335X_CM_WKUP_CLKSTCTRL_CLKACTIVITY_I2C0_GFCLK != > + ( REG( AM335X_SOC_CM_WKUP_REGS + AM335X_CM_WKUP_CLKSTCTRL ) & > + AM335X_CM_WKUP_CLKSTCTRL_CLKACTIVITY_I2C0_GFCLK ) ) ; > + > + /* > + ** Waiting for IDLEST field in AM335X_CM_WKUP_I2C0_CLKCTRL register to > attain > + ** desired value. > + */ > + while ( ( AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST_FUNC << > + AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST_SHIFT ) != > + ( REG( AM335X_SOC_CM_WKUP_REGS + AM335X_CM_WKUP_I2C0_CLKCTRL ) & > + AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST ) ) ; > +} > + > +static void am335x_i2c_reset( bbb_i2c_bus *bus ) > +{ > + volatile bbb_i2c_regs *regs = bus->regs; > + int timeout = I2C_TIMEOUT; > + > + if ( REG( ®s->BBB_I2C_CON ) & I2C_CON_EN ) { > + REG( ®s->BBB_I2C_CON ) = I2C_CON_CLR; > + udelay( 50000 ); > + } > + > + REG( ®s->BBB_I2C_SYSC ) = I2C_SYSC_SRST; /* for ES2 after soft reset */ > + udelay( 1000 ); > + REG( ®s->BBB_I2C_CON ) = I2C_CON_EN; > + > + while ( !( REG( ®s->BBB_I2C_SYSS ) & I2C_SYSS_RDONE ) && timeout-- ) { > + if ( timeout <= 0 ) { > + puts( "ERROR: Timeout in soft-reset\n" ); > + > + return; > + } > + > + udelay( 1000 ); > + } > +} > +/* > + Possible values for msg->flag > + * - @ref I2C_M_TEN, > + * - @ref I2C_M_RD, > + * - @ref I2C_M_STOP, > + * - @ref I2C_M_NOSTART, > + * - @ref I2C_M_REV_DIR_ADDR, > + * - @ref I2C_M_IGNORE_NAK, > + * - @ref I2C_M_NO_RD_ACK, and > + * - @ref I2C_M_RECV_LEN. > + */ > + > +static void am335x_i2c_set_address_size( > + const i2c_msg *msgs, > + volatile bbb_i2c_regs *regs > +) > +{ > + /*can be configured multiple modes here. > + **Need to think about own address modes*/ > + if ( ( msgs->flags & I2C_M_TEN ) == 0 ) { > + /* 7-bit mode slave address mode*/ > + REG( ®s->BBB_I2C_CON ) = AM335X_I2C_CFG_7BIT_SLAVE_ADDR; > + } else { > + /* 10-bit slave address mode*/ > + REG( ®s->BBB_I2C_CON ) = AM335X_I2C_CFG_10BIT_SLAVE_ADDR; > + } > +} > + > +static void am335x_i2c_next_byte( bbb_i2c_bus *bus ) > +{ > + i2c_msg *msg; > + > + ++bus->msgs; > + --bus->msg_todo; > + msg = &bus->msgs[ 0 ]; > + bus->current_msg_todo = msg->len; > + bus->current_msg_byte = msg->buf; > +} > + > +static unsigned int am335x_i2c_intrawstatus( volatile bbb_i2c_regs *regs ) > +{ > + return REG( ®s->BBB_I2C_IRQSTATUS_RAW ); > +} > + > +static void am335x_i2c_masterint_enable( > + volatile bbb_i2c_regs *regs, > + unsigned int flag > +) > +{ > + REG( ®s->BBB_I2C_IRQENABLE_SET ) |= flag; > +} > + > +static void am335x_i2c_masterint_disable( > + volatile bbb_i2c_regs *regs, > + unsigned int flag > +) > +{ > + REG( ®s->BBB_I2C_IRQENABLE_CLR ) = flag; > +} > + > +static void am335x_int_clear( > + volatile bbb_i2c_regs *regs, > + unsigned int flag > +) > +{ > + REG( ®s->BBB_I2C_IRQSTATUS ) = flag; > +} > + > +static void am335x_clean_interrupts( volatile bbb_i2c_regs *regs ) > +{ > + am335x_i2c_masterint_enable( regs, I2C_ALL_FLAGS ); > + am335x_int_clear( regs, I2C_ALL_FLAGS ); > + am335x_i2c_masterint_disable( regs, I2C_ALL_FLAGS ); > +} > + > +static void am335x_i2c_setup_read_transfer( > + bbb_i2c_bus *bus, > + volatile bbb_i2c_regs *regs, > + const i2c_msg *msgs, > + bool send_stop > +) > +{ > + volatile unsigned int no_bytes; > + int status; > + > + REG( ®s->BBB_I2C_CNT ) = bus->current_msg_todo; > + > + REG( ®s->BBB_I2C_CON ) = AM335X_I2C_CFG_MST_RX | AM335X_I2C_CON_I2C_EN; > + > + if ( send_stop ) { > + REG( ®s->BBB_I2C_CON ) |= AM335X_I2C_CON_START | AM335X_I2C_CON_STOP; > + } else { > + REG( ®s->BBB_I2C_CON ) |= AM335X_I2C_CON_START; > + } > + > + am335x_i2c_masterint_enable( regs, AM335X_I2C_INT_RECV_READY | > + AM335X_I2C_IRQSTATUS_ARDY ); > +} > + > +static void am335x_i2c_continue_read_transfer( > + bbb_i2c_bus *bus, > + volatile bbb_i2c_regs *regs > +) > +{ > + bus->current_msg_byte[ bus->already_transferred ] = > + REG( ®s->BBB_I2C_DATA ); > + > + bus->already_transferred++; > + > + REG( ®s->BBB_I2C_IRQSTATUS ) = AM335X_I2C_INT_RECV_READY; > + > + if ( bus->already_transferred == bus->current_msg_todo - 1 ) { > + REG( ®s->BBB_I2C_CON ) |= AM335X_I2C_CON_STOP; > + } > +} > + > +static void am335x_i2c_continue_write( > + bbb_i2c_bus *bus, > + volatile bbb_i2c_regs *regs > +) > +{ > + if ( bus->already_transferred == bus->msg_todo ) { > + REG( ®s->BBB_I2C_DATA ) = > + bus->current_msg_byte[ bus->already_transferred ]; > + REG( ®s->BBB_I2C_IRQSTATUS ) = AM335X_I2C_IRQSTATUS_XRDY; > + am335x_i2c_masterint_disable( regs, AM335X_I2C_IRQSTATUS_XRDY ); > + REG( ®s->BBB_I2C_CON ) |= AM335X_I2C_CON_STOP; > + } else { > + writeb( bus->current_msg_byte[ bus->already_transferred ], > + ®s->BBB_I2C_DATA ); > + REG( ®s->BBB_I2C_IRQSTATUS ) = AM335X_I2C_IRQSTATUS_XRDY; > + bus->already_transferred++; > + } > +} > + > +static void am335x_i2c_setup_write_transfer( > + bbb_i2c_bus *bus, > + volatile bbb_i2c_regs *regs, > + const i2c_msg *msgs > +) > +{ > + volatile unsigned int no_bytes; > + > + REG( ®s->BBB_I2C_CNT ) = bus->current_msg_todo; > + no_bytes = REG( ®s->BBB_I2C_CNT ); > + REG( ®s->BBB_I2C_SA ) = msgs->addr; > + REG( ®s->BBB_I2C_CON ) = AM335X_I2C_CFG_MST_TX | AM335X_I2C_CON_I2C_EN; > + am335x_clean_interrupts( regs ); > + am335x_i2c_masterint_enable( regs, AM335X_I2C_IRQSTATUS_XRDY ); > + REG( ®s->BBB_I2C_CON ) |= AM335X_I2C_CON_START | AM335X_I2C_CON_STOP; > +} > + > +static void am335x_i2c_setup_transfer( > + bbb_i2c_bus *bus, > + volatile bbb_i2c_regs *regs > +) > +{ > + const i2c_msg *msgs = bus->msgs; > + uint32_t msg_todo = bus->msg_todo; > + bool send_stop = false; > + uint32_t i; > + > + bus->current_todo = msgs[ 0 ].len; > + > + for ( i = 1; i < msg_todo && ( msgs[ i ].flags & I2C_M_NOSTART ) != 0; > + ++i ) { > + bus->current_todo += msgs[ i ].len; > + } > + > + regs = bus->regs; > + REG( &bus->regs->BBB_I2C_BUF ) |= AM335X_I2C_BUF_TXFIFO_CLR; > + REG( &bus->regs->BBB_I2C_BUF ) |= AM335X_I2C_BUF_RXFIFO_CLR; > + am335x_i2c_set_address_size( msgs, regs ); > + bus->read = ( msgs->flags & I2C_M_RD ) != 0; > + bus->already_transferred = ( bus->read == true ) ? 0 : 1; > + > + if ( bus->read ) { > + if ( bus->current_msg_todo == 1 ) { > + send_stop = true; > + } > + > + am335x_i2c_setup_read_transfer( bus, regs, msgs, send_stop ); > + } else { > + am335x_i2c_setup_write_transfer( bus, regs, msgs ); > + } > +} > + > +static void am335x_i2c_interrupt( void *arg ) > +{ > + bbb_i2c_bus *bus = arg; > + volatile bbb_i2c_regs *regs = bus->regs; > + /* get status of enabled interrupts */ > + uint32_t irqstatus = REG( ®s->BBB_I2C_IRQSTATUS ); > + bool done = false; > + > + /* Clear all enabled interrupt except receive ready > + and transmit ready interrupt in status register */ > + REG( ®s->BBB_I2C_IRQSTATUS ) = > + ( irqstatus & ~( AM335X_I2C_IRQSTATUS_RRDY | > + AM335X_I2C_IRQSTATUS_XRDY ) ); > + > + if ( irqstatus & AM335X_I2C_INT_RECV_READY ) { > + am335x_i2c_continue_read_transfer( bus, regs ); > + } > + > + if ( irqstatus & AM335X_I2C_IRQSTATUS_XRDY ) { > + am335x_i2c_continue_write( bus, regs ); > + } > + > + if ( irqstatus & AM335X_I2C_IRQSTATUS_NACK ) { > + done = true; > + am335x_i2c_masterint_disable( regs, AM335X_I2C_IRQSTATUS_NACK ); > + } > + > + if ( irqstatus & AM335X_I2C_IRQSTATUS_ARDY ) { > + done = true; > + REG( ®s->BBB_I2C_IRQSTATUS ) = I2C_STAT_ARDY; > + } > + > + if ( irqstatus & AM335X_I2C_IRQSTATUS_BF ) { > + REG( ®s->BBB_I2C_IRQSTATUS ) = AM335X_I2C_IRQSTATUS_BF; > + } > + > + if ( done ) { > + uint32_t err = irqstatus & BBB_I2C_IRQ_ERROR; > + am335x_i2c_next_byte( bus ); > + > + if ( bus->msg_todo == 0 ) { > + rtems_status_code sc; > + am335x_i2c_masterint_disable( regs, ( AM335X_I2C_IRQSTATUS_RRDY | > + AM335X_I2C_IRQSTATUS_XRDY | > + AM335X_I2C_IRQSTATUS_BF ) ); > + REG( ®s->BBB_I2C_IRQSTATUS ) = err; > + > + sc = rtems_event_transient_send( bus->task_id ); > + _Assert( sc == RTEMS_SUCCESSFUL ); > + (void) sc; > + } else { > + am335x_i2c_setup_transfer( bus, regs ); > + } > + } > +} > + > +static int am335x_i2c_transfer( > + i2c_bus *base, > + i2c_msg *msgs, > + uint32_t msg_count > +) > +{ > + rtems_status_code sc; > + bbb_i2c_bus *bus = (bbb_i2c_bus *) base; > + volatile bbb_i2c_regs *regs; > + uint32_t i; > + > + rtems_task_wake_after( 1 ); > + > + if ( msg_count < 1 ) { > + return 1; > + } > + > + for ( i = 0; i < msg_count; ++i ) { > + if ( ( msgs[ i ].flags & I2C_M_RECV_LEN ) != 0 ) { > + return -EINVAL; > + } > + } > + > + bus->msgs = &msgs[ 0 ]; > + bus->msg_todo = msg_count; > + bus->current_msg_todo = msgs[ 0 ].len; > + bus->current_msg_byte = msgs[ 0 ].buf; > + bus->task_id = rtems_task_self(); > + regs = bus->regs; > + am335x_i2c_setup_transfer( bus, regs ); > + REG( ®s->BBB_I2C_IRQENABLE_SET ) = BBB_I2C_IRQ_USED; > + > + sc = rtems_event_transient_receive( RTEMS_WAIT, bus->base.timeout ); > + > + if ( sc != RTEMS_SUCCESSFUL ) { > + am335x_i2c_reset( bus ); > + rtems_event_transient_clear(); > + > + return -ETIMEDOUT; > + } > + > + return 0; > +} > + > +static int am335x_i2c_set_clock( > + i2c_bus *base, > + unsigned long clock > +) > +{ > + bbb_i2c_bus *bus = (bbb_i2c_bus *) base; > + volatile bbb_i2c_regs *regs = bus->regs; > + uint32_t prescaler, divider; > + > + prescaler = ( BBB_I2C_SYSCLK / BBB_I2C_INTERNAL_CLK ) - 1; > + REG( &bus->regs->BBB_I2C_PSC ) = prescaler; > + divider = BBB_I2C_INTERNAL_CLK / ( 2 * clock ); > + REG( &bus->regs->BBB_I2C_SCLL ) = ( divider - 7 ); > + REG( &bus->regs->BBB_I2C_SCLH ) = ( divider - 5 ); > + > + return 0; > +} > + > +static void am335x_i2c_destroy( i2c_bus *base ) > +{ > + bbb_i2c_bus *bus = (bbb_i2c_bus *) base; > + rtems_status_code sc; > + > + sc = rtems_interrupt_handler_remove( bus->irq, am335x_i2c_interrupt, bus ); > + _Assert( sc == RTEMS_SUCCESSFUL ); > + (void) sc; > + i2c_bus_destroy_and_free( &bus->base ); > +} > + > +int am335x_i2c_bus_register( > + const char *bus_path, > + uintptr_t register_base, > + uint32_t input_clock, > + rtems_vector_number irq > +) > +{ > + bbb_i2c_bus *bus; > + rtems_status_code sc; > + int err; > + > + /*check bus number is >0 & <MAX*/ > + bus = (bbb_i2c_bus *) i2c_bus_alloc_and_init( sizeof( *bus ) ); > + > + if ( bus == NULL ) { > + return -1; > + } > + > + bus->regs = (volatile bbb_i2c_regs *) register_base; > + > + I2C0ModuleClkConfig(); > + am335x_i2c0_pinmux( bus ); > + am335x_i2c_reset( bus ); > + bus->input_clock = input_clock; > + err = am335x_i2c_set_clock( &bus->base, I2C_BUS_CLOCK_DEFAULT ); > + > + if ( err != 0 ) { > + ( *bus->base.destroy )( &bus->base ); > + rtems_set_errno_and_return_minus_one( -err ); > + } > + > + bus->irq = irq; > + REG( &bus->regs->BBB_I2C_IRQSTATUS ) = I2C_ALL_IRQ_FLAGS; > + > + sc = rtems_interrupt_handler_install( > + irq, > + "BBB_I2C", > + RTEMS_INTERRUPT_UNIQUE, > + (rtems_interrupt_handler) am335x_i2c_interrupt, > + bus > + ); > + > + if ( sc != RTEMS_SUCCESSFUL ) { > + ( *bus->base.destroy )( &bus->base ); > + rtems_set_errno_and_return_minus_one( EIO ); > + } > + > + bus->base.transfer = am335x_i2c_transfer; > + bus->base.set_clock = am335x_i2c_set_clock; > + bus->base.destroy = am335x_i2c_destroy; > + > + return i2c_bus_register( &bus->base, bus_path ); > +} > \ No newline at end of file > diff --git a/c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h > b/c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h > index 8cce556..ceb12a4 100644 > --- a/c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h > +++ b/c/src/lib/libbsp/arm/beagle/include/bbb-gpio.h > @@ -35,9 +35,11 @@ extern "C" { > #define BBB_PU_EN (1 << 4) > #define BBB_PD_EN ~BBB_PU_EN > #define BBB_MUXMODE(X) (X & 0x7) > +#define BBB_RXACTIVE (1 << 5) > +#define BBB_SLEWCTRL (1 << 6) > > #ifdef __cplusplus > } > #endif /* __cplusplus */ > > -#endif /* LIBBSP_ARM_BEAGLE_BBB_GPIO_H */ > \ No newline at end of file > +#endif /* LIBBSP_ARM_BEAGLE_BBB_GPIO_H */ > diff --git a/c/src/lib/libbsp/arm/beagle/include/i2c.h > b/c/src/lib/libbsp/arm/beagle/include/i2c.h > index 010fcee..3ada3c4 100644 > --- a/c/src/lib/libbsp/arm/beagle/include/i2c.h > +++ b/c/src/lib/libbsp/arm/beagle/include/i2c.h > @@ -24,7 +24,7 @@ > #define LIBBSP_ARM_BEAGLE_I2C_H > > #include <rtems.h> > - > +#include <dev/i2c/i2c.h> > #include <bsp.h> > > #ifdef __cplusplus > @@ -34,151 +34,175 @@ extern "C" { > > /* I2C Configuration Register (I2C_CON): */ > > -#define I2C_CON_EN (1 << 15) /* I2C module enable */ > -#define I2C_CON_BE (1 << 14) /* Big endian mode */ > -#define I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */ > -#define I2C_CON_MST (1 << 10) /* Master/slave mode */ > -#define I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode */ > +#define BBB_I2C_CON_EN (1 << 15) /* I2C module enable */ > +#define BBB_I2C_CON_BE (1 << 14) /* Big endian mode */ > +#define BBB_I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */ > +#define BBB_I2C_CON_MST (1 << 10) /* Master/slave mode */ > +#define BBB_I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode */ > /* (master mode only) */ > -#define I2C_CON_XA (1 << 8) /* Expand address */ > -#define I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */ > -#define I2C_CON_STT (1 << 0) /* Start condition (master mode only) */ > - > +#define BBB_I2C_CON_XA (1 << 8) /* Expand address */ > +#define BBB_I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */ > +#define BBB_I2C_CON_STT (1 << 0) /* Start condition (master mode only) */ > +#define BBB_I2C_CON_CLR 0x0 /* Clear configuration register */ > /* I2C Status Register (I2C_STAT): */ > > -#define I2C_STAT_SBD (1 << 15) /* Single byte data */ > -#define I2C_STAT_BB (1 << 12) /* Bus busy */ > -#define I2C_STAT_ROVR (1 << 11) /* Receive overrun */ > -#define I2C_STAT_XUDF (1 << 10) /* Transmit underflow */ > -#define I2C_STAT_AAS (1 << 9) /* Address as slave */ > -#define I2C_STAT_GC (1 << 5) > -#define I2C_STAT_XRDY (1 << 4) /* Transmit data ready */ > -#define I2C_STAT_RRDY (1 << 3) /* Receive data ready */ > -#define I2C_STAT_ARDY (1 << 2) /* Register access ready */ > -#define I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */ > -#define I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */ > +#define BBB_I2C_STAT_SBD (1 << 15) /* Single byte data */ > +#define BBB_I2C_STAT_BB (1 << 12) /* Bus busy */ > +#define BBB_I2C_STAT_ROVR (1 << 11) /* Receive overrun */ > +#define BBB_I2C_STAT_XUDF (1 << 10) /* Transmit underflow */ > +#define BBB_I2C_STAT_AAS (1 << 9) /* Address as slave */ > +#define BBB_I2C_STAT_GC (1 << 5) > +#define BBB_I2C_STAT_XRDY (1 << 4) /* Transmit data ready */ > +#define BBB_I2C_STAT_RRDY (1 << 3) /* Receive data ready */ > +#define BBB_I2C_STAT_ARDY (1 << 2) /* Register access ready */ > +#define BBB_I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */ > +#define BBB_I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */ > > /* I2C Interrupt Enable Register (I2C_IE): */ > -#define I2C_IE_GC_IE (1 << 5) > -#define I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable */ > -#define I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable */ > -#define I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt enable */ > -#define I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */ > -#define I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */ > -/* > - * The equation for the low and high time is > - * tlow = scll + scll_trim = (sampling clock * tlow_duty) / speed > - * thigh = sclh + sclh_trim = (sampling clock * (1 - tlow_duty)) / speed > - * > - * If the duty cycle is 50% > - * > - * tlow = scll + scll_trim = sampling clock / (2 * speed) > - * thigh = sclh + sclh_trim = sampling clock / (2 * speed) > - * > - * In TRM > - * scll_trim = 7 > - * sclh_trim = 5 > - * > - * The linux 2.6.30 kernel uses > - * scll_trim = 6 > - * sclh_trim = 6 > - * > - * These are the trim values for standard and fast speed > - */ > -#ifndef I2C_FASTSPEED_SCLL_TRIM > -#define I2C_FASTSPEED_SCLL_TRIM 6 > -#endif > -#ifndef I2C_FASTSPEED_SCLH_TRIM > -#define I2C_FASTSPEED_SCLH_TRIM 6 > -#endif > - > -/* These are the trim values for high speed */ > -#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM > -#define I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM > -#endif > -#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM > -#define I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM > -#endif > -#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM > -#define I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM > -#endif > -#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM > -#define I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM > -#endif > - > -#define OMAP_I2C_STANDARD 100000 > -#define OMAP_I2C_FAST_MODE 400000 > -#define OMAP_I2C_HIGH_SPEED 3400000 > - > - > -/* Use the reference value of 96MHz if not explicitly set by the board */ > -#ifndef I2C_IP_CLK > -#define I2C_IP_CLK SYSTEM_CLOCK_96 > -#endif > +#define BBB_I2C_IE_GC_IE (1 << 5) > +#define BBB_I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable > */ > +#define BBB_I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable > */ > +#define BBB_I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt > enable > */ > +#define BBB_I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */ > +#define BBB_I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */ > + > +/* I2C SYSC Register (I2C_SYSC): */ > +#define BBB_I2C_SYSC_SRST (1 << 1) > + > +#define BBB_I2C_TIMEOUT 1000 > + > +#define BBB_I2C_SYSS_RDONE (1 << 0) /* Internel reset monitoring > */ > + > +#define BBB_CONFIG_SYS_I2C_SPEED 100000 > +#define BBB_CONFIG_SYS_I2C_SLAVE 1 > +#define BBB_I2C_ALL_FLAGS 0x7FFF > +#define BBB_I2C_ALL_IRQ_FLAGS 0xFFFF > + > +#define BBB_I2C_SYSCLK 48000000 > +#define BBB_I2C_INTERNAL_CLK 12000000 > +#define BBB_I2C_SPEED_CLK 100000 > + > +#define BBB_I2C_IRQ_ERROR \ > + ( AM335X_I2C_IRQSTATUS_NACK \ > + | AM335X_I2C_IRQSTATUS_ROVR \ > + | AM335X_I2C_IRQSTATUS_AL \ > + | AM335X_I2C_IRQSTATUS_ARDY \ > + | AM335X_I2C_IRQSTATUS_RRDY \ > + | AM335X_I2C_IRQSTATUS_XRDY \ > + | AM335X_I2C_IRQSTATUS_XUDF ) > + > +#define BBB_I2C_IRQ_USED \ > + ( AM335X_I2C_IRQSTATUS_ARDY \ > + | AM335X_I2C_IRQSTATUS_XRDY ) > + > +#define BBB_I2C_0_BUS_PATH "/dev/i2c-0" > +#define BBB_I2C_1_BUS_PATH "/dev/i2c-1" > +#define BBB_I2C_2_BUS_PATH "/dev/i2c-2" > + > +#define BBB_I2C0_IRQ 70 > +#define BBB_I2C1_IRQ 71 > +#define BBB_I2C2_IRQ 30 > + > +#define BBB_MODE2 2 > +#define BBB_MODE3 3 > + > +typedef enum { > + I2C0, > + I2C1, > + I2C2, > + I2C_COUNT > +} bbb_i2c_id_t; > + > +typedef struct i2c_regs { > + uint32_t BBB_I2C_REVNB_LO; > + uint32_t BBB_I2C_REVNB_HI; > + uint32_t dummy1[ 2 ]; > + uint32_t BBB_I2C_SYSC; > + uint32_t dummy2[ 4 ]; > + uint32_t BBB_I2C_IRQSTATUS_RAW; > + uint32_t BBB_I2C_IRQSTATUS; > + uint32_t BBB_I2C_IRQENABLE_SET; > + uint32_t BBB_I2C_IRQENABLE_CLR; > + uint32_t BBB_I2C_WE; > + uint32_t BBB_I2C_DMARXENABLE_SET; > + uint32_t BBB_I2C_DMATXENABLE_SET; > + uint32_t BBB_I2C_DMARXENABLE_CLR; > + uint32_t BBB_I2C_DMATXENABLE_CLR; > + uint32_t BBB_I2C_DMARXWAKE_EN; > + uint32_t BBB_I2C_DMATXWAKE_EN; > + uint32_t dummy3[ 16 ]; > + uint32_t BBB_I2C_SYSS; > + uint32_t BBB_I2C_BUF; > + uint32_t BBB_I2C_CNT; > + uint32_t BBB_I2C_DATA; > + uint32_t dummy4; > + uint32_t BBB_I2C_CON; > + uint32_t BBB_I2C_OA; > + uint32_t BBB_I2C_SA; > + uint32_t BBB_I2C_PSC; > + uint32_t BBB_I2C_SCLL; > + uint32_t BBB_I2C_SCLH; > + uint32_t BBB_I2C_SYSTEST; > + uint32_t BBB_I2C_BUFSTAT; > + uint32_t BBB_I2C_OA1; > + uint32_t BBB_I2C_OA2; > + uint32_t BBB_I2C_OA3; > + uint32_t BBB_I2C_ACTOA; > + uint32_t BBB_I2C_SBLOCK; > +} bbb_i2c_regs; > + > +typedef struct bbb_i2c_bus { > + i2c_bus base; > + volatile bbb_i2c_regs *regs; > + i2c_msg *msgs; > + uint32_t msg_todo; > + uint32_t current_msg_todo; > + uint8_t *current_msg_byte; > + uint32_t current_todo; > + bool read; > + bool hold; > + rtems_id task_id; > + rtems_vector_number irq; > + uint32_t input_clock; > + uint32_t already_transferred; > +} bbb_i2c_bus; > + > +int am335x_i2c_bus_register( > + const char *bus_path, > + uintptr_t register_base, > + uint32_t input_clock, > + rtems_vector_number irq > +); > + > +static inline int bbb_register_i2c_0( void ) > +{ > + return am335x_i2c_bus_register( > + BBB_I2C_0_BUS_PATH, > + AM335X_I2C0_BASE, > + I2C_BUS_CLOCK_DEFAULT, > + BBB_I2C0_IRQ > + ); > +} > > -/* > - * The reference minimum clock for high speed is 19.2MHz. > - * The linux 2.6.30 kernel uses this value. > - * The reference minimum clock for fast mode is 9.6MHz > - * The reference minimum clock for standard mode is 4MHz > - * In TRM, the value of 12MHz is used. > - */ > -#ifndef I2C_INTERNAL_SAMPLING_CLK > -#define I2C_INTERNAL_SAMPLING_CLK 19200000 > -#endif > - > -#define I2C_PSC_MAX 0x0f > -#define I2C_PSC_MIN 0x00 > - > - > -#define DISP_LINE_LEN 128 > -#define I2C_TIMEOUT 1000 > - > -#define I2C_BUS_MAX 3 > - > -#define I2C_BASE1 (OMAP34XX_CORE_L4_IO_BASE + 0x070000) > - > -#define I2C_DEFAULT_BASE I2C_BASE1 > - > -#define I2C_SYSS_RDONE (1 << 0) /* Internel reset monitoring */ > - > -#define CONFIG_SYS_I2C_SPEED 100000 > -#define CONFIG_SYS_I2C_SLAVE 1 > - > -struct i2c { > - unsigned short rev; /* 0x00 */ > - unsigned short res1; > - unsigned short ie; /* 0x04 */ > - unsigned short res2; > - unsigned short stat; /* 0x08 */ > - unsigned short res3; > - unsigned short iv; /* 0x0C */ > - unsigned short res4; > - unsigned short syss; /* 0x10 */ > - unsigned short res4a; > - unsigned short buf; /* 0x14 */ > - unsigned short res5; > - unsigned short cnt; /* 0x18 */ > - unsigned short res6; > - unsigned short data; /* 0x1C */ > - unsigned short res7; > - unsigned short sysc; /* 0x20 */ > - unsigned short res8; > - unsigned short con; /* 0x24 */ > - unsigned short res9; > - unsigned short oa; /* 0x28 */ > - unsigned short res10; > - unsigned short sa; /* 0x2C */ > - unsigned short res11; > - unsigned short psc; /* 0x30 */ > - unsigned short res12; > - unsigned short scll; /* 0x34 */ > - unsigned short res13; > - unsigned short sclh; /* 0x38 */ > - unsigned short res14; > - unsigned short systest; /* 0x3c */ > - unsigned short res15; > -}; > +static inline int bbb_register_i2c_1( void ) > +{ > + return am335x_i2c_bus_register( > + BBB_I2C_1_BUS_PATH, > + AM335X_I2C1_BASE, > + I2C_BUS_CLOCK_DEFAULT, > + BBB_I2C1_IRQ > + ); > +} > + > +static inline int bbb_register_i2c_2( void ) > +{ > + return am335x_i2c_bus_register( > + BBB_I2C_2_BUS_PATH, > + AM335X_I2C2_BASE, > + I2C_BUS_CLOCK_DEFAULT, > + BBB_I2C2_IRQ > + ); > +} > > #ifdef __cplusplus > } > diff --git a/c/src/lib/libcpu/arm/shared/include/am335x.h > b/c/src/lib/libcpu/arm/shared/include/am335x.h > index f59f896..c29ae6c 100644 > --- a/c/src/lib/libcpu/arm/shared/include/am335x.h > +++ b/c/src/lib/libcpu/arm/shared/include/am335x.h > @@ -563,3 +563,139 @@ > > > > +/* I2C registers */ > +#define AM335X_I2C0_BASE 0x44e0b000 > + /* I2C0 base address */ > +#define AM335X_I2C1_BASE 0x4802a000 > + /* I2C1 base address */ > +#define AM335X_I2C2_BASE 0x4819c000 > + /* I2C2 base address */ > +#define AM335X_I2C_REVNB_LO 0x00 > + /* Module Revision Register (low bytes) */ > +#define AM335X_I2C_REVNB_HI 0x04 > + /* Module Revision Register (high bytes) */ > +#define AM335X_I2C_SYSC 0x10 > + /* System Configuration Register */ > +#define AM335X_I2C_IRQSTATUS_RAW 0x24 > + /* I2C Status Raw Register */ > +#define AM335X_I2C_IRQSTATUS 0x28 > + /* I2C Status Register */ > +#define AM335X_I2C_IRQENABLE_SET 0x2c > + /* I2C Interrupt Enable Set Register */ > +#define AM335X_I2C_IRQENABLE_CLR 0x30 > + /* I2C Interrupt Enable Clear Register */ > +#define AM335X_I2C_WE 0x34 > + /* I2C Wakeup Enable Register */ > +#define AM335X_I2C_DMARXENABLE_SET 0x38 > + /* Receive DMA Enable Set Register */ > +#define AM335X_I2C_DMATXENABLE_SET 0x3c > + /* Transmit DMA Enable Set Register */ > +#define AM335X_I2C_DMARXENABLE_CLR 0x40 > + /* Receive DMA Enable Clear Register */ > +#define AM335X_I2C_DMATXENABLE_CLR 0x44 > + /* Transmit DMA Enable Clear Register */ > +#define AM335X_I2C_DMARXWAKE_EN 0x48 > + /* Receive DMA Wakeup Register */ > +#define AM335X_I2C_DMATXWAKE_EN 0x4c > + /* Transmit DMA Wakeup Register */ > +#define AM335X_I2C_SYSS 0x90 > + /* System Status Register */ > +#define AM335X_I2C_BUF 0x94 > + /* Buffer Configuration Register */ > +#define AM335X_I2C_CNT 0x98 > + /* Data Counter Register */ > +#define AM335X_I2C_DATA 0x9c > + /* Data Access Register */ > +#define AM335X_I2C_CON 0xa4 > + /* I2C Configuration Register */ > +#define AM335X_I2C_OA 0xa8 > + /* I2C Own Address Register */ > +#define AM335X_I2C_SA 0xac > + /* I2C Slave Address Register */ > +#define AM335X_I2C_PSC 0xb0 > + /* I2C Clock Prescaler Register */ > +#define AM335X_I2C_SCLL 0xb4 > + /* I2C SCL Low Time Register */ > +#define AM335X_I2C_SCLH 0xb8 > + /* I2C SCL High Time Register */ > +#define AM335X_I2C_SYSTEST 0xbc > + /* System Test Register */ > +#define AM335X_I2C_BUFSTAT 0xc0 > + /* I2C Buffer Status Register */ > +#define AM335X_I2C_OA1 0xc4 > + /* I2C Own Address 1 Register */ > +#define AM335X_I2C_OA2 0xc8 > + /* I2C Own Address 2 Register */ > +#define AM335X_I2C_OA3 0xcc > + /* I2C Own Address 3 Register */ > +#define AM335X_I2C_ACTOA 0xd0 > + /* Active Own Address Register */ > +#define AM335X_I2C_SBLOCK 0xd4 > + /* I2C Clock Blocking Enable Register */ > + > +#define AM335X_CM_PER_L4LS_CLKSTCTRL (0x0) > +#define AM335X_CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP (0x2u) > +#define AM335X_CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL (0x00000003u) > +#define AM335X_CM_PER_L4LS_CLKCTRL (0x60) > +#define AM335X_CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE (0x2u) > +#define AM335X_CM_PER_L4LS_CLKCTRL_MODULEMODE (0x00000003u) > +#define AM335X_CM_PER_I2C1_CLKCTRL (0x48) > +#define AM335X_CM_PER_I2C1_CLKCTRL_MODULEMODE_ENABLE (0x2u) > +#define AM335X_CM_PER_I2C1_CLKCTRL_MODULEMODE (0x00000003u) > +#define AM335X_CM_PER_I2C2_CLKCTRL (0x44) > +#define AM335X_CM_PER_I2C2_CLKCTRL_MODULEMODE_ENABLE (0x2u) > +#define AM335X_CM_PER_I2C2_CLKCTRL_MODULEMODE (0x00000003u) > +#define AM335X_CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK (0x00000100u) > +#define AM335X_CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_I2C_FCLK (0x01000000u) > +#define AM335X_CM_PER_I2C1_CLKCTRL_MODULEMODE (0x00000003u) > +#define AM335X_I2C_CON_XSA (0x00000100u) > +#define AM335X_I2C_CFG_10BIT_SLAVE_ADDR AM335X_I2C_CON_XSA > +#define AM335X_I2C_CON_XSA_SHIFT (0x00000008u) > +#define AM335X_I2C_CFG_7BIT_SLAVE_ADDR (0 << AM335X_I2C_CON_XSA_SHIFT) > +#define AM335X_I2C_CON_I2C_EN (0x00008000u) > +#define AM335X_I2C_CON_TRX (0x00000200u) > +#define AM335X_I2C_CON_MST (0x00000400u) > +#define AM335X_I2C_CON_STB (0x00000800u) > +#define AM335X_I2C_SYSC_AUTOIDLE (0x00000001u) > + > +/*I2C0 module clock registers*/ > + > +#define AM335X_CM_WKUP_CONTROL_CLKCTRL (0x4) > +#define AM335X_CM_WKUP_CLKSTCTRL (0x0) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL (0xb8) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL_MODULEMODE_ENABLE (0x2u) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL_MODULEMODE (0x00000003u) > +#define AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST_FUNC (0x0u) > +#define AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST_SHIFT (0x00000010u) > +#define AM335X_CM_WKUP_CONTROL_CLKCTRL_IDLEST (0x00030000u) > +#define AM335X_CM_WKUP_CLKSTCTRL_CLKACTIVITY_I2C0_GFCLK (0x00000800u) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST_FUNC (0x0u) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST_SHIFT (0x00000010u) > +#define AM335X_CM_WKUP_I2C0_CLKCTRL_IDLEST (0x00030000u) > +#define AM335X_SOC_CM_WKUP_REGS (AM335X_CM_PER_ADDR + > 0x400) > + > +/* I2C status Register */ > +#define AM335X_I2C_IRQSTATUS_NACK (1 << 1) > +#define AM335X_I2C_IRQSTATUS_ROVR (1 << 11) > +#define AM335X_I2C_IRQSTATUS_AL (1<<0) > +#define AM335X_I2C_IRQSTATUS_ARDY (1 << 2) > +#define AM335X_I2C_IRQSTATUS_RRDY (1 << 3) > +#define AM335X_I2C_IRQSTATUS_XRDY (1 << 4) > +#define AM335X_I2C_IRQSTATUS_XUDF (1 << 10) > +#define AM335X_I2C_BUF_TXFIFO_CLR (0x00000040u) > +#define AM335X_I2C_BUF_RXFIFO_CLR (0x00004000u) > +#define AM335X_I2C_IRQSTATUS_AAS (1 << 9) > +#define AM335X_I2C_IRQSTATUS_BF (1 << 8) > +#define AM335X_I2C_IRQSTATUS_STC (1 << 6) > +#define AM335X_I2C_IRQSTATUS_GC (1 << 5) > +#define AM335X_I2C_IRQSTATUS_XDR (1 << 14) > +#define AM335X_I2C_IRQSTATUS_RDR (1 << 13) > + > +#define AM335X_I2C_INT_RECV_READY AM335X_I2C_IRQSTATUS_RRDY > +#define AM335X_I2C_CON_STOP (0x00000002u) > +#define AM335X_I2C_CON_START (0x00000001u) > +#define AM335X_I2C_CFG_MST_RX AM335X_I2C_CON_MST > +#define AM335X_I2C_CFG_MST_TX (AM335X_I2C_CON_TRX | AM335X_I2C_CON_MST) > +#define AM335X_I2C_IRQSTATUS_RAW_BB (0x00001000u) > +#define AM335X_CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK > (0x00000020u) > +#define AM335X_I2C_INT_STOP_CONDITION AM335X_I2C_IRQSTATUS_BF > -- > 2.7.4 -- -------------------------------------------- embedded brains GmbH Christian Mauderer Dornierstr. 4 D-82178 Puchheim Germany email: christian.maude...@embedded-brains.de Phone: +49-89-18 94 741 - 18 Fax: +49-89-18 94 741 - 08 PGP: Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel