| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @brief Header file for Atmel SAM3 I2C/TWI driver. |
| * |
| * Contains register definitions for the TWI controller. |
| * This uses TWI instead of I2C to align with the datasheet. |
| */ |
| |
| #ifndef _DRIVERS_I2C_ATMEL_SAM3_H_ |
| #define _DRIVERS_I2C_ATMEL_SAM3_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* |
| * Control Register |
| */ |
| #define TWI_CR_START (1 << 0) /* START for read */ |
| #define TWI_CR_STOP (1 << 1) /* Send STOP */ |
| #define TWI_CR_MSEN (1 << 2) /* Master enable */ |
| #define TWI_CR_MSDIS (1 << 3) /* Master disable */ |
| #define TWI_CR_SVEN (1 << 4) /* Slave enable */ |
| #define TWI_CR_SVDIS (1 << 5) /* Slave disable */ |
| #define TWI_CR_QUICK (1 << 6) /* SMBUS quick command */ |
| #define TWI_CR_SWRST (1 << 7) /* Software reset */ |
| |
| /* |
| * Master Mode Register |
| */ |
| #define TWI_MMR_MREAD (1 << 12) /* 0 for write, 1 for read */ |
| |
| /* IADR is for internal address. This specifies how many bytes to use. */ |
| #define TWI_MMR_IADRSZ_POS (8) |
| #define TWI_MMR_IADRSZ_MASK (3 << TWI_MMR_IADRSZ_POS) |
| #define TWI_MMR_IADRSZ_1_BYTE (1 << 8) |
| #define TWI_MMR_IADRSZ_2_BYTE (2 << 8) |
| #define TWI_MMR_IADRSZ_3_BYTE (3 << 8) |
| |
| /* DADR is for destination (slave) address in master mode */ |
| #define TWI_MMR_DADR_POS (16) |
| #define TWI_MMR_DADR_MASK (0x7F << TWI_MMR_DADR_POS) |
| |
| /* |
| * Slave Mode Register |
| */ |
| #define TWI_MMR_SADR_POS (16) |
| #define TWI_MMR_SADR_MASK (0x7F << TWI_MMR_DADR_POS) |
| |
| /* |
| * Internal Address Register |
| */ |
| #define TWI_IADR_POS (0) |
| #define TWI_IADR_MASK (0xFFFFFF << TWI_IADR_POS) |
| |
| /* |
| * Clock Waveform Generator Register |
| */ |
| #define TWI_CWGR_CKDIV_POS (16) |
| #define TWI_CWGR_CKDIV_MSGK (0x07 << TWI_CWGR_CKDIV_POS) |
| |
| #define TWI_CWGR_CHDIV_POS (8) |
| #define TWI_CWGR_CHDIV_MASK (0xFF << TWI_CWGR_CHDIV_POS) |
| |
| #define TWI_CWGR_CLDIV_POS (0) |
| #define TWI_CWGR_CLDIV_MASK (0xFF << TWI_CWGR_CLDIV_POS) |
| |
| /* |
| * Status (SR), |
| * Interrupt Enable (IER), |
| * Interrupt Disable (IDR), |
| * Interrupt Mask (IMR) registers |
| */ |
| #define TWI_IRQ_TXCOMP (1 << 0) /* Transfer complete */ |
| #define TWI_IRQ_RXRDY (1 << 1) /* RX ready */ |
| #define TWI_IRQ_TXRDY (1 << 2) /* TX ready */ |
| #define TWI_IRQ_SVREAD (1 << 3) /* Slave read */ |
| #define TWI_IRQ_SVACC (1 << 4) /* Slave access */ |
| #define TWI_IRQ_GACC (1 << 5) /* General call access */ |
| #define TWI_IRQ_OVRE (1 << 6) /* Overrun error */ |
| #define TWI_IRQ_NACK (1 << 8) /* No ACK */ |
| #define TWI_IRQ_ARBLST (1 << 9) /* Arbitration lost */ |
| #define TWI_IRQ_SCLWS (1 << 10) /* Clock wait state */ |
| #define TWI_IRQ_EOSACC (1 << 11) /* End of slave access */ |
| #define TWI_IRQ_ENDRX (1 << 12) /* End of RX buffer (PDC) */ |
| #define TWI_IRQ_ENDTX (1 << 13) /* End of TX buffer (PDC) */ |
| #define TWI_IRQ_RXBUFF (1 << 14) /* RX buffer full (PDC) */ |
| #define TWI_IRQ_TXBUFE (1 << 15) /* TX buffer full (PDC) */ |
| |
| #define TWI_IRQ_PDC \ |
| (TWI_IRQ_ENDRX | TWI_IRQ_ENDTX | TWI_IRQ_RXBUFF | TWI_IRQ_TXBUFE) |
| |
| /* Bits to disable all interrupts */ |
| #define TWI_IRQ_DISABLE (0x0000FF77) |
| |
| /* |
| * Receive Holding Register |
| */ |
| #define TWI_RHR_POS (0) |
| #define TWI_RHR_MASK (0xFF << TWI_RHR_POS) |
| |
| /* |
| * Transmit Holding Register |
| */ |
| #define TWI_THR_POS (0) |
| #define TWI_THR_MASK (0xFF << TWI_THR_POS) |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _DRIVERS_I2C_ATMEL_SAM3H_ */ |