KT24-1110_65E-HA-651B/include_lib/driver/cpu/br25/asm/iic_hw.h

83 lines
3.0 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#ifndef _IIC_HW_H_
#define _IIC_HW_H_
#include "system/generic/typedef.h"
#define IIC_HW_NUM 1
#define IIC_PORT_GROUP_NUM 4
#define iic_enable(reg) (reg->CON0 |= BIT(0))
#define iic_disable(reg) (reg->CON0 &= ~BIT(0))
#define iic_role_host(reg) (reg->CON0 &= ~BIT(1))
#define iic_role_slave(reg) (reg->CON0 |= BIT(1))
#define iic_cfg_done(reg) (reg->CON0 |= BIT(2))
#define iic_dir_out(reg) (reg->CON0 &= ~BIT(3))
#define iic_dir_in(reg) (reg->CON0 |= BIT(3))
#define iic_preset_end(reg) (reg->CON0 |= BIT(4))
#define iic_preset_restart(reg) (reg->CON0 |= BIT(5))
#define iic_recv_ack(reg) (reg->CON0 &= ~BIT(6))
#define iic_recv_nack(reg) (reg->CON0 |= BIT(6))
#define iic_send_is_ack(reg) (!(reg->CON0 & BIT(7)))
#define iic_isel_direct(reg) (reg->CON0 &= ~BIT(9))
#define iic_isel_filter(reg) (reg->CON0 |= BIT(9))
#define iic_si_mode_en(reg) (reg->CON1 |= BIT(13))
#define iic_si_mode_dis(reg) (reg->CON1 &= ~BIT(13))
#define iic_set_ie(reg) (reg->CON0 |= BIT(8))
#define iic_clr_ie(reg) (reg->CON0 &= ~BIT(8))
#define iic_pnd(reg) (reg->CON0 & BIT(15))
#define iic_pnd_clr(reg) (reg->CON0 |= BIT(14))
#define iic_set_end_ie(reg) (reg->CON0 |= BIT(10))
#define iic_clr_end_ie(reg) (reg->CON0 &= BIT(10))
#define iic_end_pnd(reg) (reg->CON0 & BIT(13))
#define iic_end_pnd_clr(reg) (reg->CON0 |= BIT(12))
#define iic_start_pnd(reg) (reg->CON1 & BIT(15))
#define iic_start_pnd_clr(reg) (reg->CON1 |= BIT(14))
#define iic_baud_reg(reg) (reg->BAUD)
#define iic_buf_reg(reg) (reg->BUF)
typedef const int hw_iic_dev;
enum {IIC_MASTER, IIC_SLAVE};
struct hw_iic_config {
u8 port; //example: 'A', 'B', 'C', 'D'
u32 baudrate;
u8 hdrive;
u8 io_filter;
u8 io_pu;
u8 role;
};
extern const struct hw_iic_config hw_iic_cfg[];
int hw_iic_init(hw_iic_dev iic);
void hw_iic_uninit(hw_iic_dev iic);
void hw_iic_suspend(hw_iic_dev iic);
void hw_iic_resume(hw_iic_dev iic);
void hw_iic_start(hw_iic_dev iic);
void hw_iic_stop(hw_iic_dev iic);
u8 hw_iic_tx_byte(hw_iic_dev iic, u8 byte);
u8 hw_iic_rx_byte(hw_iic_dev iic, u8 ack);
int hw_iic_read_buf(hw_iic_dev iic, void *buf, int len);
int hw_iic_write_buf(hw_iic_dev iic, const void *buf, int len);
int hw_iic_set_baud(hw_iic_dev iic, u32 baud);
void hw_iic_set_ie(hw_iic_dev iic, u8 en);
u8 hw_iic_get_pnd(hw_iic_dev iic);
void hw_iic_clr_pnd(hw_iic_dev iic);
void hw_iic_set_end_ie(hw_iic_dev iic, u8 en);
u8 hw_iic_get_end_pnd(hw_iic_dev iic);
void hw_iic_clr_end_pnd(hw_iic_dev iic);
void hw_iic_slave_set_addr(hw_iic_dev iic, u8 addr, u8 addr_ack);
void hw_iic_slave_rx_prepare(hw_iic_dev iic, u8 ack);
u8 hw_iic_slave_rx_byte(hw_iic_dev iic, bool *is_start_addr);
void hw_iic_slave_tx_byte(hw_iic_dev iic, u8 byte);
u8 hw_iic_slave_tx_check_ack(hw_iic_dev iic);
#endif