summaryrefslogtreecommitdiff
path: root/bsp/raspberry-pi/raspi4-32/driver/drv_i2c.h
blob: bfb724ad93ed52ed832def695767c2f84cf00d98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author         Notes
 * 2020-11-28     bigmagic       first version
 */

#ifndef __DRV_I2C_H__
#define __DRV_I2C_H__

#include <rthw.h>

#define BSC_C(BASE)         __REG32(BASE + 0x0000)    /* BSC Master Control */
#define BSC_S(BASE)         __REG32(BASE + 0x0004)    /* BSC Master Status */
#define BSC_DLEN(BASE)      __REG32(BASE + 0x0008)    /* BSC Master Data Length */
#define BSC_A(BASE)         __REG32(BASE + 0x000c)    /* BSC Master Slave Address */
#define BSC_FIFO(BASE)      __REG32(BASE + 0x0010)    /* BSC Master Data FIFO */
#define BSC_DIV(BASE)       __REG32(BASE + 0x0014)    /* BSC Master Clock Divider */
#define BSC_DEL(BASE)       __REG32(BASE + 0x0018)    /* BSC Master Data Delay */
#define BSC_CLKT(BASE)      __REG32(BASE + 0x001c)    /* BSC Master Clock Stretch Timeout */

/* Register masks for C Register */
#define BSC_C_I2CEN         (0x00008000) /* I2C Enable, 0 = disabled, 1 = enabled */
#define BSC_C_INTR          (0x00000400) /* Interrupt on RX */
#define BSC_C_INTT          (0x00000200) /* Interrupt on TX */
#define BSC_C_INTD          (0x00000100) /* Interrupt on DONE */
#define BSC_C_ST            (0x00000080) /* Start transfer, 1 = Start a new transfer */
#define BSC_C_CLEAR_1       (0x00000020) /* Clear FIFO Clear */
#define BSC_C_CLEAR_2       (0x00000010) /* Clear FIFO Clear */
#define BSC_C_READ          (0x00000001) /* Read transfer */

/* Register masks for S Register */
#define BSC_S_CLKT          (0x00000200) /* Clock stretch timeout */
#define BSC_S_ERR           (0x00000100) /* ACK error */
#define BSC_S_RXF           (0x00000080) /* RXF FIFO full, 0 = FIFO is not full, 1 = FIFO is full */
#define BSC_S_TXE           (0x00000040) /* TXE FIFO full, 0 = FIFO is not full, 1 = FIFO is full */
#define BSC_S_RXD           (0x00000020) /* RXD FIFO contains data */
#define BSC_S_TXD           (0x00000010) /* TXD FIFO can accept data */
#define BSC_S_RXR           (0x00000008) /* RXR FIFO needs reading (full) */
#define BSC_S_TXW           (0x00000004) /* TXW FIFO needs writing (full) */
#define BSC_S_DONE          (0x00000002) /* Transfer DONE */
#define BSC_S_TA            (0x00000001) /* Transfer Active */

#define BSC_FIFO_SIZE  (16)  /* BSC FIFO size */

typedef enum
{
    I2C_REASON_OK           = 0x00,      /* Success */
    I2C_REASON_ERROR_NACK   = 0x01,      /* Received a NACK */
    I2C_REASON_ERROR_CLKT   = 0x02,      /* Received Clock Stretch Timeout */
    I2C_REASON_ERROR_DATA   = 0x04       /* Not all data is sent / received */
} i2c_reason_codes;

int rt_hw_i2c_init(void);

#endif