hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/** @file
  I2c Lib to control I2c controller.
 
  Copyright 2020 NXP
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
**/
 
#ifndef I2C_LIB_INTERNAL_H__
#define I2C_LIB_INTERNAL_H__
 
#include <Pi/PiI2c.h>
#include <Uefi.h>
 
/** Module Disable
  0b - The module is enabled. You must clear this field before any other IBCR
       fields have any effect.
  1b - The module is reset and disabled. This is the power-on reset situation.
       When high, the interface is held in reset, but registers can still be
       accessed. Status register fields (IBSR) are not valid when the module
       is disabled.
**/
#define I2C_IBCR_MDIS      BIT7
// I2c Bus Interrupt Enable
#define I2C_IBCR_IBIE      BIT6
/** Master / Slave Mode 0b - Slave mode 1b - Master mode
  When you change this field from 0 to 1, the module generates a START signal
  on the bus and selects the master mode. When you change this field from 1 to
  0, the module generates a STOP signal and changes the operation mode from
  master to slave. You should generate a STOP signal only if IBSR[IBIF]=1.
  The module clears this field without generating a STOP signal when the
  master loses arbitration.
*/
#define I2C_IBCR_MSSL      BIT5
// 0b - Receive 1b - Transmit
#define I2C_IBCR_TXRX      BIT4
/** Data acknowledge disable
  Values written to this field are only used when the I2C module is a receiver,
  not a transmitter.
  0b - The module sends an acknowledge signal to the bus at the 9th clock bit
       after receiving one byte of data.
  1b - The module does not send an acknowledge-signal response (that is,
       acknowledge bit = 1).
**/
#define I2C_IBCR_NOACK     BIT3
/**Repeat START
  If the I2C module is the current bus master, and you program RSTA=1, the I2C
  module generates a repeated START condition. This field always reads as a 0.
  If you attempt a repeated START at the wrong time, if the bus is owned by
  another master the result is loss of arbitration.
**/
#define I2C_IBCR_RSTA      BIT2
// DMA enable
#define I2C_IBCR_DMAEN     BIT1
 
// Transfer Complete
#define I2C_IBSR_TCF       BIT7
// I2C bus Busy. 0b - Bus is idle, 1b - Bus is busy
#define I2C_IBSR_IBB       BIT5
// Arbitration Lost. software must clear this field by writing a one to it.
#define I2C_IBSR_IBAL      BIT4
// I2C bus interrupt flag
#define I2C_IBSR_IBIF      BIT1
// Received acknowledge 0b - Acknowledge received 1b - No acknowledge received
#define I2C_IBSR_RXAK      BIT0
 
//Bus idle interrupt enable
#define I2C_IBIC_BIIE      BIT7
 
// Glitch filter enable
#define I2C_IBDBG_GLFLT_EN BIT3
 
#define I2C_BUS_TEST_BUSY       TRUE
#define I2C_BUS_TEST_IDLE       !I2C_BUS_TEST_BUSY
#define I2C_BUS_TEST_RX_ACK     TRUE
#define I2C_BUS_NO_TEST_RX_ACK  !I2C_BUS_TEST_RX_ACK
 
#define ARRAY_LAST_ELEM(x)      (x)[ARRAY_SIZE (x) - 1]
#define I2C_NUM_RETRIES         500
 
typedef struct _I2C_REGS {
  UINT8 Ibad; // I2c Bus Address Register
  UINT8 Ibfd; // I2c Bus Frequency Divider Register
  UINT8 Ibcr; // I2c Bus Control Register
  UINT8 Ibsr; // I2c Bus Status Register
  UINT8 Ibdr; // I2C Bus Data I/O Register
  UINT8 Ibic; // I2C Bus Interrupt Config Register
  UINT8 Ibdbg; // I2C Bus Debug Register
} I2C_REGS;
 
/*
 * sorted list of clock divisor, Ibfd register value pairs
 */
typedef struct _I2C_CLOCK_DIVISOR_PAIR {
  UINT16  Divisor;
  UINT8   Ibfd; // I2c Bus Frequency Divider Register value
} I2C_CLOCK_DIVISOR_PAIR;
 
typedef struct {
  UINTN                           OperationCount;
  EFI_I2C_OPERATION               Operation[2];
} I2C_REG_REQUEST;
 
#endif // I2C_LIB_INTERNAL_H__