diff options
Diffstat (limited to 'firmware/target/arm/imx233/lcdif-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/lcdif-imx233.c | 79 |
1 files changed, 29 insertions, 50 deletions
diff --git a/firmware/target/arm/imx233/lcdif-imx233.c b/firmware/target/arm/imx233/lcdif-imx233.c index ad0931de40..f947fa69f1 100644 --- a/firmware/target/arm/imx233/lcdif-imx233.c +++ b/firmware/target/arm/imx233/lcdif-imx233.c | |||
@@ -21,30 +21,29 @@ | |||
21 | #include "lcdif-imx233.h" | 21 | #include "lcdif-imx233.h" |
22 | 22 | ||
23 | static unsigned lcdif_word_length = 0; | 23 | static unsigned lcdif_word_length = 0; |
24 | static unsigned lcdif_byte_packing = 0; | ||
25 | 24 | ||
26 | void imx233_lcdif_enable_underflow_recover(bool enable) | 25 | void imx233_lcdif_enable_underflow_recover(bool enable) |
27 | { | 26 | { |
28 | if(enable) | 27 | if(enable) |
29 | __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RECOVER_ON_UNDERFLOW; | 28 | BF_SET(LCDIF_CTRL1, RECOVER_ON_UNDERFLOW); |
30 | else | 29 | else |
31 | __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RECOVER_ON_UNDERFLOW; | 30 | BF_CLR(LCDIF_CTRL1, RECOVER_ON_UNDERFLOW); |
32 | } | 31 | } |
33 | 32 | ||
34 | void imx233_lcdif_enable_bus_master(bool enable) | 33 | void imx233_lcdif_enable_bus_master(bool enable) |
35 | { | 34 | { |
36 | if(enable) | 35 | if(enable) |
37 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__LCDIF_MASTER; | 36 | BF_SET(LCDIF_CTRL, LCDIF_MASTER); |
38 | else | 37 | else |
39 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__LCDIF_MASTER; | 38 | BF_CLR(LCDIF_CTRL, LCDIF_MASTER); |
40 | } | 39 | } |
41 | 40 | ||
42 | void imx233_lcdif_enable(bool enable) | 41 | void imx233_lcdif_enable(bool enable) |
43 | { | 42 | { |
44 | if(enable) | 43 | if(enable) |
45 | __REG_CLR(HW_LCDIF_CTRL) = __BLOCK_CLKGATE; | 44 | BF_CLR(LCDIF_CTRL, CLKGATE); |
46 | else | 45 | else |
47 | __REG_SET(HW_LCDIF_CTRL) = __BLOCK_CLKGATE; | 46 | BF_SET(LCDIF_CTRL, CLKGATE); |
48 | } | 47 | } |
49 | 48 | ||
50 | void imx233_lcdif_reset(void) | 49 | void imx233_lcdif_reset(void) |
@@ -55,64 +54,45 @@ void imx233_lcdif_reset(void) | |||
55 | void imx233_lcdif_set_timings(unsigned data_setup, unsigned data_hold, | 54 | void imx233_lcdif_set_timings(unsigned data_setup, unsigned data_hold, |
56 | unsigned cmd_setup, unsigned cmd_hold) | 55 | unsigned cmd_setup, unsigned cmd_hold) |
57 | { | 56 | { |
58 | HW_LCDIF_TIMING = (data_setup << HW_LCDIF_TIMING__DATA_SETUP_BP) | | 57 | HW_LCDIF_TIMING = BF_OR4(LCDIF_TIMING, DATA_SETUP(data_setup), |
59 | (data_hold << HW_LCDIF_TIMING__DATA_HOLD_BP) | | 58 | DATA_HOLD(data_hold), CMD_SETUP(cmd_setup), CMD_HOLD(cmd_hold)); |
60 | (cmd_setup << HW_LCDIF_TIMING__CMD_SETUP_BP) | | ||
61 | (cmd_hold << HW_LCDIF_TIMING__CMD_HOLD_BP); | ||
62 | } | 59 | } |
63 | 60 | ||
64 | void imx233_lcdif_set_lcd_databus_width(unsigned width) | 61 | void imx233_lcdif_set_lcd_databus_width(unsigned width) |
65 | { | 62 | { |
66 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__LCD_DATABUS_WIDTH_BM; | 63 | BF_WR(LCDIF_CTRL, LCD_DATABUS_WIDTH, width); |
67 | __REG_SET(HW_LCDIF_CTRL) = width; | ||
68 | } | 64 | } |
69 | 65 | ||
70 | void imx233_lcdif_set_word_length(unsigned word_length) | 66 | void imx233_lcdif_set_word_length(unsigned word_length) |
71 | { | 67 | { |
72 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__WORD_LENGTH_BM; | 68 | BF_WR(LCDIF_CTRL, WORD_LENGTH, word_length); |
73 | __REG_SET(HW_LCDIF_CTRL) = word_length; | ||
74 | lcdif_word_length = word_length; | 69 | lcdif_word_length = word_length; |
75 | } | 70 | } |
76 | 71 | ||
77 | unsigned imx233_lcdif_enable_irqs(unsigned irq_bm) | ||
78 | { | ||
79 | unsigned old_msk = __XTRACT(HW_LCDIF_CTRL1, IRQ_EN); | ||
80 | /* clear irq status */ | ||
81 | __REG_CLR(HW_LCDIF_CTRL1) = irq_bm << HW_LCDIF_CTRL1__IRQ_BP; | ||
82 | /* disable irqs */ | ||
83 | __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__IRQ_EN_BM; | ||
84 | /* enable irqs */ | ||
85 | __REG_SET(HW_LCDIF_CTRL1) = irq_bm << HW_LCDIF_CTRL1__IRQ_EN_BP; | ||
86 | |||
87 | return old_msk; | ||
88 | } | ||
89 | |||
90 | void imx233_lcdif_set_byte_packing_format(unsigned byte_packing) | 72 | void imx233_lcdif_set_byte_packing_format(unsigned byte_packing) |
91 | { | 73 | { |
92 | __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__BYTE_PACKING_FORMAT_BM; | 74 | BF_WR(LCDIF_CTRL1, BYTE_PACKING_FORMAT, byte_packing); |
93 | __REG_SET(HW_LCDIF_CTRL1) = byte_packing << HW_LCDIF_CTRL1__BYTE_PACKING_FORMAT_BP; | ||
94 | lcdif_byte_packing = byte_packing; | ||
95 | } | 75 | } |
96 | 76 | ||
97 | void imx233_lcdif_set_data_format(bool data_fmt_16, bool data_fmt_18, bool data_fmt_24) | 77 | void imx233_lcdif_set_data_format(bool data_fmt_16, bool data_fmt_18, bool data_fmt_24) |
98 | { | 78 | { |
99 | if(data_fmt_16) | 79 | if(data_fmt_16) |
100 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_16_BIT; | 80 | BF_SET(LCDIF_CTRL, DATA_FORMAT_16_BIT); |
101 | else | 81 | else |
102 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_16_BIT; | 82 | BF_CLR(LCDIF_CTRL, DATA_FORMAT_16_BIT); |
103 | if(data_fmt_18) | 83 | if(data_fmt_18) |
104 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_18_BIT; | 84 | BF_SET(LCDIF_CTRL, DATA_FORMAT_18_BIT); |
105 | else | 85 | else |
106 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_18_BIT; | 86 | BF_CLR(LCDIF_CTRL, DATA_FORMAT_18_BIT); |
107 | if(data_fmt_24) | 87 | if(data_fmt_24) |
108 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_24_BIT; | 88 | BF_SET(LCDIF_CTRL, DATA_FORMAT_24_BIT); |
109 | else | 89 | else |
110 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_FORMAT_24_BIT; | 90 | BF_CLR(LCDIF_CTRL, DATA_FORMAT_24_BIT); |
111 | } | 91 | } |
112 | 92 | ||
113 | void imx233_lcdif_wait_ready(void) | 93 | void imx233_lcdif_wait_ready(void) |
114 | { | 94 | { |
115 | while(HW_LCDIF_CTRL & HW_LCDIF_CTRL__RUN); | 95 | while(BF_RD(LCDIF_CTRL, RUN)); |
116 | } | 96 | } |
117 | 97 | ||
118 | void imx233_lcdif_pio_send(bool data_mode, unsigned len, uint32_t *buf) | 98 | void imx233_lcdif_pio_send(bool data_mode, unsigned len, uint32_t *buf) |
@@ -120,10 +100,9 @@ void imx233_lcdif_pio_send(bool data_mode, unsigned len, uint32_t *buf) | |||
120 | unsigned max_xfer_size = 0xffff; | 100 | unsigned max_xfer_size = 0xffff; |
121 | if(len == 0) | 101 | if(len == 0) |
122 | return; | 102 | return; |
123 | if(lcdif_word_length == HW_LCDIF_CTRL__WORD_LENGTH_16_BIT) | 103 | if(lcdif_word_length == BV_LCDIF_CTRL_WORD_LENGTH__16_BIT) |
124 | max_xfer_size = 0x1fffe; | 104 | max_xfer_size = 0x1fffe; |
125 | imx233_lcdif_wait_ready(); | 105 | imx233_lcdif_wait_ready(); |
126 | unsigned msk = imx233_lcdif_enable_irqs(0); | ||
127 | imx233_lcdif_enable_bus_master(false); | 106 | imx233_lcdif_enable_bus_master(false); |
128 | 107 | ||
129 | do | 108 | do |
@@ -131,7 +110,7 @@ void imx233_lcdif_pio_send(bool data_mode, unsigned len, uint32_t *buf) | |||
131 | unsigned burst = MIN(len, max_xfer_size); | 110 | unsigned burst = MIN(len, max_xfer_size); |
132 | len -= burst; | 111 | len -= burst; |
133 | unsigned count = burst; | 112 | unsigned count = burst; |
134 | if(lcdif_word_length != HW_LCDIF_CTRL__WORD_LENGTH_8_BIT) | 113 | if(lcdif_word_length != BV_LCDIF_CTRL_WORD_LENGTH__8_BIT) |
135 | { | 114 | { |
136 | if(burst & 1) | 115 | if(burst & 1) |
137 | burst++; | 116 | burst++; |
@@ -141,20 +120,20 @@ void imx233_lcdif_pio_send(bool data_mode, unsigned len, uint32_t *buf) | |||
141 | count = burst; | 120 | count = burst; |
142 | HW_LCDIF_TRANSFER_COUNT = 0; | 121 | HW_LCDIF_TRANSFER_COUNT = 0; |
143 | HW_LCDIF_TRANSFER_COUNT = 0x10000 | count; | 122 | HW_LCDIF_TRANSFER_COUNT = 0x10000 | count; |
144 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_SELECT | HW_LCDIF_CTRL__RUN; | 123 | BF_CLR(LCDIF_CTRL, DATA_SELECT); |
124 | BF_CLR(LCDIF_CTRL, RUN); | ||
145 | if(data_mode) | 125 | if(data_mode) |
146 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_SELECT; | 126 | BF_SET(LCDIF_CTRL, DATA_SELECT); |
147 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__RUN; | 127 | BF_SET(LCDIF_CTRL, RUN); |
148 | burst = (burst + 3) / 4; | 128 | burst = (burst + 3) / 4; |
149 | while(burst-- > 0) | 129 | while(burst-- > 0) |
150 | { | 130 | { |
151 | while(HW_LCDIF_STAT & HW_LCDIF_STAT__LFIFO_FULL); | 131 | while(BF_RD(LCDIF_STAT, LFIFO_FULL)); |
152 | HW_LCDIF_DATA = *buf++; | 132 | HW_LCDIF_DATA = *buf++; |
153 | } | 133 | } |
154 | while(HW_LCDIF_CTRL & HW_LCDIF_CTRL__RUN); | 134 | imx233_lcdif_wait_ready(); |
155 | }while(len > 0); | 135 | }while(len > 0); |
156 | imx233_lcdif_enable_bus_master(true); | 136 | imx233_lcdif_enable_bus_master(true); |
157 | imx233_lcdif_enable_irqs(msk); | ||
158 | } | 137 | } |
159 | 138 | ||
160 | void imx233_lcdif_dma_send(void *buf, unsigned width, unsigned height) | 139 | void imx233_lcdif_dma_send(void *buf, unsigned width, unsigned height) |
@@ -162,7 +141,7 @@ void imx233_lcdif_dma_send(void *buf, unsigned width, unsigned height) | |||
162 | HW_LCDIF_CUR_BUF = (uint32_t)buf; | 141 | HW_LCDIF_CUR_BUF = (uint32_t)buf; |
163 | HW_LCDIF_TRANSFER_COUNT = 0; | 142 | HW_LCDIF_TRANSFER_COUNT = 0; |
164 | HW_LCDIF_TRANSFER_COUNT = (height << 16) | width; | 143 | HW_LCDIF_TRANSFER_COUNT = (height << 16) | width; |
165 | __REG_CLR(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__RUN; | 144 | BF_CLR(LCDIF_CTRL, RUN); |
166 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__DATA_SELECT; | 145 | BF_SET(LCDIF_CTRL, DATA_SELECT); |
167 | __REG_SET(HW_LCDIF_CTRL) = HW_LCDIF_CTRL__RUN; | 146 | BF_SET(LCDIF_CTRL, RUN); |
168 | } | 147 | } |