embox

Форк
0
106 строк · 2.9 Кб
1
/**
2
 * @file ldb.c
3
 * @brief LVDS Display Bridge
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version
6
 * @date 07.10.2017
7
 */
8

9
#include <util/log.h>
10

11
#include <drivers/common/memory.h>
12
#include <hal/reg.h>
13

14
#include <drivers/clk/ccm_imx6.h>
15
#include <drivers/iomuxc.h>
16

17
#include <framework/mod/options.h>
18
#include <embox/unit.h>
19

20
EMBOX_UNIT_INIT(ldb_init);
21

22
#define LDB_CTRL       OPTION_GET(NUMBER,base_addr)
23
#define DATA_WIDTH     OPTION_GET(NUMBER,data_width)
24

25
#define LDB_CH0_OFF     0x0
26
#define LDB_CH0_DI0     0x1
27
#define LDB_CH0_DI1     0x3
28

29
#define LDB_CH1_OFF     0x0
30
#define LDB_CH1_DI0     0x4
31
#define LDB_CH1_DI1     0xC
32

33
#define CCM_ANALOG_MISC1            0x20C8160
34

35
#define LDB_BGREF_RMODE_MASK        0x00008000
36
#define LDB_BGREF_RMODE_INT         0x00008000
37
#define LDB_BGREF_RMODE_EXT         0x0
38

39
#define LDB_DI1_VS_POL_MASK         0x00000400
40
#define LDB_DI1_VS_POL_ACT_LOW      0x00000400
41
#define LDB_DI1_VS_POL_ACT_HIGH     0x0
42
#define LDB_DI0_VS_POL_MASK         0x00000200
43
#define LDB_DI0_VS_POL_ACT_LOW      0x00000200
44
#define LDB_DI0_VS_POL_ACT_HIGH     0x0
45

46
#define LDB_BIT_MAP_CH1_MASK        0x00000100
47
#define LDB_BIT_MAP_CH1_JEIDA       0x00000100
48
#define LDB_BIT_MAP_CH1_SPWG        0x0
49
#define LDB_BIT_MAP_CH0_MASK        0x00000040
50
#define LDB_BIT_MAP_CH0_JEIDA       0x00000040
51
#define LDB_BIT_MAP_CH0_SPWG        0x0
52

53
#define LDB_DATA_WIDTH_CH1_MASK     0x00000080
54
#define LDB_DATA_WIDTH_CH1_24       0x00000080
55
#define LDB_DATA_WIDTH_CH1_18       0x0
56
#define LDB_DATA_WIDTH_CH0_MASK     0x00000020
57
#define LDB_DATA_WIDTH_CH0_24       0x00000020
58
#define LDB_DATA_WIDTH_CH0_18       0x0
59

60
#define LDB_CH1_MODE_MASK           0x0000000C
61
#define LDB_CH1_MODE_EN_TO_DI1      0x0000000C
62
#define LDB_CH1_MODE_EN_TO_DI0      0x00000004
63
#define LDB_CH1_MODE_DISABLE        0x0
64
#define LDB_CH0_MODE_MASK           0x00000003
65
#define LDB_CH0_MODE_EN_TO_DI1      0x00000003
66
#define LDB_CH0_MODE_EN_TO_DI0      0x00000001
67
#define LDB_CH0_MODE_DISABLE        0x0
68

69
#define LDB_SPLIT_MODE_EN           0x00000010
70

71
static int ldb_init(void) {
72
	uint32_t reg;
73

74
	iomuxc_write(IOMUXC_GPR3, iomuxc_read(IOMUXC_GPR3) & ~(3 << 6));
75

76
	reg = REG32_LOAD(LDB_CTRL);
77

78
	reg &= ~LDB_BGREF_RMODE_MASK;
79
	reg |= LDB_BGREF_RMODE_EXT;
80
	reg &= ~(LDB_BIT_MAP_CH0_MASK | LDB_BIT_MAP_CH1_MASK);
81
	reg |= LDB_BIT_MAP_CH0_SPWG | LDB_BIT_MAP_CH1_SPWG;
82
	reg &= ~(LDB_CH0_MODE_MASK | LDB_CH1_MODE_MASK);
83
	reg &= ~(LDB_DATA_WIDTH_CH0_MASK | LDB_DATA_WIDTH_CH1_MASK);
84
#if DATA_WIDTH == 18
85
	reg |= LDB_DATA_WIDTH_CH0_18 | LDB_DATA_WIDTH_CH1_18;
86
#elif DATA_WIDTH == 24
87
	reg |= LDB_DATA_WIDTH_CH0_24 | LDB_DATA_WIDTH_CH1_24;
88
#else
89
#error "Unsupported data width"
90
#endif
91
	reg &= ~LDB_SPLIT_MODE_EN;
92
	reg |= LDB_CH0_MODE_EN_TO_DI0;
93
	REG32_STORE(LDB_CTRL, reg);
94

95
	clk_enable("ldb_di0");
96

97
	return 0;
98
}
99

100
int ldb_bits(void) {
101
	return DATA_WIDTH;
102
}
103

104
PERIPH_MEMORY_DEFINE(ldb_iomux, 0x20E0000, 0x1000);
105

106
PERIPH_MEMORY_DEFINE(ccm_analog, 0x20C8000, 0x200);
107

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.