summaryrefslogtreecommitdiff
path: root/bsp/allwinner/libraries/sunxi-hal/include/hal/sunxi_hal_ir.h
blob: 6d4fc5cfc61a08e4d86f386a0b59e27fca3bb297 (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
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * ===========================================================================================
 *
 *       Filename:  sunxi_hal_spi.h
 *
 *    Description:  SPI HAL definition.
 *
 *        Version:  Melis3.0
 *         Create:  2020-04-08 11:11:56
 *       Revision:  none
 *       Compiler:  GCC:version 9.2.1
 *
 *         Author:  [email protected]
 *   Organization:  SWC-BPD
 *  Last Modified:  2020-04-08 16:02:11
 *
 * ===========================================================================================
 */

#ifndef SUNXI_IR_RX_H
#define SUNXI_IR_RX_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "sunxi_hal_common.h"
#include <hal_gpio.h>
#include <hal_sem.h>
#include <hal_clk.h>


#define SUNXI_IRADC_PBASE         0X07040000 /* 0x34 */

#define SUNXI_IRQ_IRADC                 155

#define IRADC_PIN    GPIO_PH0
#define IR_MUXSEL 4
#define IR_DRVSEL 2


/* Registers */
#define IR_CTRL_REG     (0x00)  /* IR Control */
#define IR_RXCFG_REG        (0x10)  /* Rx Config */
#define IR_RXDAT_REG        (0x20)  /* Rx Data */
#define IR_RXINTE_REG       (0x2C)  /* Rx Interrupt Enable */
#define IR_RXINTS_REG       (0x30)  /* Rx Interrupt Status */
#define IR_SPLCFG_REG       (0x34)  /* IR Sample Config */

#define IR_FIFO_SIZE        (64)    /* 64Bytes */

#define IR_SIMPLE_UNIT      (21000)     /* simple in ns */
#define IR_CLK          (24000000)  /* 24Mhz */
#define IR_SAMPLE_DEV       (0x3<<0)    /* 24MHz/512 =46875Hz (~21us) */

/* Active Threshold (0+1)*128clock*21us = 2.6ms */
#define IR_ACTIVE_T     ((0&0xff)<<16)

/* Filter Threshold = 16*21us = 336us < 500us */
#define IR_RXFILT_VAL       (((16)&0x3f)<<2)

/* Filter Threshold = 22*21us = 336us < 500us */
#define IR_RXFILT_VAL_RC5   (((22)&0x3f)<<2)

/* Idle Threshold = (5+1)*128clock*21us = 16ms > 9ms */
#define IR_RXIDLE_VAL       (((5)&0xff)<<8)

/* Active Threshold (0+1)*128clock*21us = 2.6ms */
#define IR_ACTIVE_T_SAMPLE  ((16&0xff)<<16)

#define IR_ACTIVE_T_C       (1<<23)     /* Active Threshold */
#define IR_CIR_MODE     (0x3<<4)    /* CIR mode enable */
#define IR_ENTIRE_ENABLE    (0x3<<0)    /* IR entire enable */
#define IR_FIFO_20      (((20)-1)<<8)
#define IR_IRQ_STATUS       ((0x1<<4)|0x3)
#define IR_BOTH_PULSE       (0x1 << 6)
#define IR_LOW_PULSE        (0x2 << 6)
#define IR_HIGH_PULSE       (0x3 << 6)

/*Bit Definition of IR_RXINTS_REG Register*/
#define IR_RXINTS_RXOF      (0x1<<0)    /* Rx FIFO Overflow */
#define IR_RXINTS_RXPE      (0x1<<1)    /* Rx Packet End */
#define IR_RXINTS_RXDA      (0x1<<4)    /* Rx FIFO Data Available */


enum ir_mode {
    CIR_MODE_ENABLE,
    IR_MODULE_ENABLE,
    IR_BOTH_PULSE_MODE, /* new feature to avoid noisy */
    IR_LOW_PULSE_MODE,
    IR_HIGH_PULSE_MODE,
};

enum ir_sample_config {
    IR_SAMPLE_REG_CLEAR,
    IR_CLK_SAMPLE,
    IR_FILTER_TH_NEC,
    IR_FILTER_TH_RC5,
    IR_IDLE_TH,
    IR_ACTIVE_TH,
    IR_ACTIVE_TH_SAMPLE,
};

enum ir_irq_config {
    IR_IRQ_STATUS_CLEAR,
    IR_IRQ_ENABLE,
    IR_IRQ_FIFO_SIZE,
};

typedef enum
{
    IR_PIN_ERR = -3,
    IR_CLK_ERR = -2,
    IR_IRQ_ERR = -1,
    IR_OK = 0,
} hal_ir_status_t;

typedef int (*ir_callback_t)(uint32_t data_type, uint32_t data);

typedef struct sunxi_ir
{
    uint16_t irq_num;
    uint32_t reg_base;

    gpio_pin_t pin;
    uint8_t pin_mux;
    uint8_t pin_drv;

    ir_callback_t callback;
} hal_ir_t;

int hal_ir_register_callback(ir_callback_t callback);
int hal_ir_init(void);

#ifdef __cplusplus
}
#endif


#endif