blend2d.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. #include <string.h>
  2. #include "FreeRTOS.h"
  3. #include "chip.h"
  4. #include "board.h"
  5. #include "lcd.h"
  6. #include "blend2d.h"
  7. #include "ff_stdio.h"
  8. #define REGS_BLEND2D REGS_BLEND2D_BASE
  9. #define BLEND2D_AWTK_MODE_EN 1
  10. /* BLEND2D MODULE */
  11. #define BLEND2D_ENABLE 0x000
  12. #define BLEND2D_START 0x004
  13. #define BLEND2D_CTL_ENABLE 0x008
  14. #define BLEND2D_MODE 0x00C
  15. #define BLEND2D_WRITE_WAIT 0x010
  16. #define BLEND2D_ALPHA_THROLDT 0x014
  17. #define BLEND2D_ALPHA_THROLD_2 0X018
  18. #define BLEND2D_LAYER1_BURST_CTL 0x020
  19. #define BLEND2D_LAYER1_CTL 0x024
  20. #define BLEND2D_LAYER1_SIZE 0x028
  21. #define BLEND2D_LAYER1_ADDR 0x02C
  22. #define BLEND2D_LAYER2_BURST_CTL 0x030
  23. #define BLEND2D_LAYER2_CTL 0x034
  24. #define BLEND2D_LAYER2_SIZE 0x038
  25. #define BLEND2D_LAYER2_ADDR 0x03C
  26. #define BLEND2D_COLOR_KEY_MASK_THLD_LAYER1 0x040
  27. #define BLEND2D_COLOR_KEY_MASK_THLD_LAYER2 0x044
  28. #define BLEND2D_COLOR_KEY_MASK_VALUE_LAYER1 0x048
  29. #define BLEND2D_COLOR_KEY_MASK_VALUE_LAYER2 0x04C
  30. #define BLEND2D_LAYER1_WINDOW_POINT 0x050
  31. #define BLEND2D_LAYER2_WINDOW_POINT 0x054
  32. #define BLEND2D_LAYER1_SOURCE_SIZE 0x058
  33. #define BLEND2D_LAYER2_SOURCE_SIZE 0x05C
  34. #define BLEND2D_WRITE_BACK_SOURCE_SIZE 0x060
  35. #define BLEND2D_BLD_SIZE 0x064
  36. #define BLEND2D_BLD_WINDOW_POINT 0x068
  37. #define BLEND2D_BLD_ADDR 0x06C
  38. #define BLEND2D_BLD_CTL 0x070
  39. #define BLEND2D_LAYER1_BACK_COLOR 0x074
  40. #define BLEND2D_LAYER2_BACK_COLOR 0x078
  41. #define BLEND2D_INT_CTL 0x080
  42. #define BLEND2D_INT_CLR 0x084
  43. #define BLEND2D_INT_STA 0x088
  44. void blend2d_start(void)
  45. {
  46. writel(1, REGS_BLEND2D + BLEND2D_START);
  47. udelay(10);
  48. writel(0, REGS_BLEND2D + BLEND2D_START);
  49. }
  50. void blend2d_clear_int(void)
  51. {
  52. writel(0, REGS_BLEND2D + BLEND2D_INT_CLR);
  53. }
  54. void blend2d_read_wait_enable(int enable, unsigned int wait_time)
  55. {
  56. unsigned int reg;
  57. reg = readl(REGS_BLEND2D + BLEND2D_MODE);
  58. reg &= ~((0xffff << 16) | (1 <<5));
  59. wait_time &= 0xffff;
  60. if(enable)
  61. reg |= (wait_time << 16) | (1 << 5);
  62. writel(reg, REGS_BLEND2D + BLEND2D_MODE);
  63. }
  64. void blend2d_write_wait_enable(unsigned int enable, unsigned int wait_time)
  65. {
  66. unsigned int reg;
  67. reg = readl(REGS_BLEND2D + BLEND2D_WRITE_WAIT);
  68. reg &= ~((1 << 12) | 0xfff);
  69. wait_time &= 0xfff;
  70. if(enable)
  71. reg |= (1 << 12) | wait_time;
  72. writel(reg, REGS_BLEND2D + BLEND2D_WRITE_WAIT);
  73. }
  74. void blend2d_layer_enable(int layer, int enable)
  75. {
  76. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_CTL_ENABLE);
  77. if (layer == BLEND2D_LAYER1) {
  78. if (enable)
  79. reg |= 1;
  80. else
  81. reg &= ~1;
  82. } else if (layer == BLEND2D_LAYER2) {
  83. if (enable)
  84. reg |= 1 << 1;
  85. else
  86. reg &= ~(1 << 1);
  87. }
  88. writel(reg, REGS_BLEND2D + BLEND2D_CTL_ENABLE);
  89. }
  90. void blend2d_set_layer_point(int layer, int x, int y)
  91. {
  92. x &= 0xfff;
  93. y &= 0xfff;
  94. if (layer == BLEND2D_LAYER1)
  95. writel((y << 12) | x, REGS_BLEND2D + BLEND2D_LAYER1_WINDOW_POINT);
  96. else if (layer == BLEND2D_LAYER2)
  97. writel((y << 12) | x, REGS_BLEND2D + BLEND2D_LAYER2_WINDOW_POINT);
  98. }
  99. void blend2d_set_layer_size(int layer, int width, int height)
  100. {
  101. width &= 0xfff;
  102. height &= 0xfff;
  103. if (layer == BLEND2D_LAYER1)
  104. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_LAYER1_SIZE);
  105. else if (layer == BLEND2D_LAYER2)
  106. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_LAYER2_SIZE);
  107. }
  108. void blend2d_set_layer_source_size(int layer, int width, int height)
  109. {
  110. width &= 0xfff;
  111. height &= 0xfff;
  112. if (layer == BLEND2D_LAYER1)
  113. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_LAYER1_SOURCE_SIZE);
  114. else if (layer == BLEND2D_LAYER2)
  115. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_LAYER2_SOURCE_SIZE);
  116. }
  117. void blend2d_set_layer_addr(int layer, unsigned int addr)
  118. {
  119. if (layer == BLEND2D_LAYER1)
  120. writel(addr, REGS_BLEND2D + BLEND2D_LAYER1_ADDR);
  121. else if (layer == BLEND2D_LAYER2)
  122. writel(addr, REGS_BLEND2D + BLEND2D_LAYER2_ADDR);
  123. }
  124. void blend2d_set_layer_format(int layer, int format, int rgb_order)
  125. {
  126. format &= 0xf;
  127. rgb_order &= 0x7;
  128. if (layer == BLEND2D_LAYER1)
  129. writel(rgb_order << 4 | format, REGS_BLEND2D + BLEND2D_LAYER1_CTL);
  130. else if (layer == BLEND2D_LAYER2)
  131. writel(rgb_order << 4 | format, REGS_BLEND2D + BLEND2D_LAYER2_CTL);
  132. }
  133. void blend2d_set_layer_alpha_mode(int layer, int mode)
  134. {
  135. unsigned int reg;
  136. if (layer == BLEND2D_LAYER1) {
  137. reg = readl(REGS_BLEND2D + BLEND2D_LAYER1_BURST_CTL);
  138. if (mode == BLEND2D_ALPHA_DATA)
  139. reg &= ~(1 << 15);
  140. else if (mode == BLEND2D_ALPHA_REG)
  141. reg |= 1 << 15;
  142. writel(reg, REGS_BLEND2D + BLEND2D_LAYER1_BURST_CTL);
  143. } else if (layer == BLEND2D_LAYER2) {
  144. reg = readl(REGS_BLEND2D + BLEND2D_LAYER2_BURST_CTL);
  145. if (mode == BLEND2D_ALPHA_DATA)
  146. reg &= ~(1 << 15);
  147. else if (mode == BLEND2D_ALPHA_REG)
  148. reg |= 1 << 15;
  149. writel(reg, REGS_BLEND2D + BLEND2D_LAYER2_BURST_CTL);
  150. }
  151. }
  152. void blend2d_set_layer_alpha(int layer, uint8_t alpha)
  153. {
  154. unsigned int reg;
  155. if (layer == BLEND2D_LAYER1) {
  156. reg = readl(REGS_BLEND2D + BLEND2D_LAYER1_BURST_CTL);
  157. reg &= ~(0xf << 16);
  158. reg |= alpha << 16;
  159. writel(reg, REGS_BLEND2D + BLEND2D_LAYER1_BURST_CTL);
  160. } else if (layer == BLEND2D_LAYER2) {
  161. reg = readl(REGS_BLEND2D + BLEND2D_LAYER2_BURST_CTL);
  162. reg &= ~(0xf << 16);
  163. reg |= alpha << 16;
  164. writel(reg, REGS_BLEND2D + BLEND2D_LAYER2_BURST_CTL);
  165. }
  166. }
  167. void blend2d_set_layer_colorkey(int layer, int enable, uint8_t r, uint8_t g, uint8_t b)
  168. {
  169. unsigned int reg;
  170. if (layer == BLEND2D_LAYER1) {
  171. reg = readl(REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER1);
  172. reg &= ~0x1ffffff;
  173. reg |= (r << 16) | (g << 8) | b;
  174. if (enable)
  175. reg |= 1 << 24;
  176. writel(reg, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER1);
  177. } else if (layer == BLEND2D_LAYER2) {
  178. reg = readl(REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER2);
  179. reg &= ~0x1ffffff;
  180. reg |= (r << 16) | (g << 8) | b;
  181. if (enable)
  182. reg |= 1 << 24;
  183. writel(reg, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER2);
  184. }
  185. }
  186. void blend2d_set_layer_colorkey_thld(int layer, uint8_t r, uint8_t g, uint8_t b)
  187. {
  188. if (layer == BLEND2D_LAYER1)
  189. writel((r << 16) | (g << 8) | b, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_THLD_LAYER1);
  190. else if (layer == BLEND2D_LAYER2)
  191. writel((r << 16) | (g << 8) | b, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_THLD_LAYER2);
  192. }
  193. void blend2d_set_layer_colorkey_backcolor(int layer, int enable, uint8_t r, uint8_t g, uint8_t b)
  194. {
  195. unsigned int reg;
  196. if (layer == BLEND2D_LAYER1) {
  197. reg = readl(REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER1);
  198. if (enable)
  199. reg |= 1 << 25;
  200. else
  201. reg &= ~(1 << 25);
  202. writel(reg, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER1);
  203. writel((r << 16) | (g << 8) | b, REGS_BLEND2D + BLEND2D_LAYER1_BACK_COLOR);
  204. } else if (layer == BLEND2D_LAYER2) {
  205. reg = readl(REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER2);
  206. if (enable)
  207. reg |= 1 << 25;
  208. else
  209. reg &= ~(1 << 25);
  210. writel(reg, REGS_BLEND2D + BLEND2D_COLOR_KEY_MASK_VALUE_LAYER2);
  211. writel((r << 16) | (g << 8) | b, REGS_BLEND2D + BLEND2D_LAYER2_BACK_COLOR);
  212. }
  213. }
  214. void blend2d_set_blend_point(int x, int y)
  215. {
  216. x &= 0xfff;
  217. y &= 0xfff;
  218. writel((y << 12) | x, REGS_BLEND2D + BLEND2D_BLD_WINDOW_POINT);
  219. }
  220. void blend2d_set_blend_source_size(int width, int height)
  221. {
  222. width &= 0xfff;
  223. height &= 0xfff;
  224. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_WRITE_BACK_SOURCE_SIZE);
  225. }
  226. void blend2d_set_blend_size(int width, int height)
  227. {
  228. width &= 0xfff;
  229. height &= 0xfff;
  230. writel((height << 12) | width, REGS_BLEND2D + BLEND2D_BLD_SIZE);
  231. }
  232. void blend2d_set_blend_mode(int mode)
  233. {
  234. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_MODE);
  235. reg &= ~((0xf << 8) | (1 << 4));
  236. reg |= (mode << 8) | (1 << 0);
  237. writel(reg, REGS_BLEND2D + BLEND2D_MODE);
  238. }
  239. void blend2d_set_blend_addr(uint32_t addr)
  240. {
  241. writel(addr, REGS_BLEND2D + BLEND2D_BLD_ADDR);
  242. }
  243. void blend2d_set_blend_format(int format)
  244. {
  245. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_BLD_CTL);
  246. format &= 0xf;
  247. reg &= ~0xf;
  248. reg |= format;
  249. writel(reg, REGS_BLEND2D + BLEND2D_BLD_CTL);
  250. }
  251. void blend2d_set_blend_endian(int endian)
  252. {
  253. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_BLD_CTL);
  254. if (endian == BLEND2D_ARGB)
  255. reg |= 1 << 4;
  256. else if (endian == BLEND2D_RGBA)
  257. reg &= ~(1 << 4);
  258. writel(reg, REGS_BLEND2D + BLEND2D_BLD_CTL);
  259. }
  260. void blend2d_set_blend_alpha(uint8_t alpha)
  261. {
  262. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_BLD_CTL);
  263. reg &= ~(0xff << 24);
  264. reg |= alpha << 24;
  265. writel(reg, REGS_BLEND2D + BLEND2D_BLD_CTL);
  266. }
  267. void blend2d_set_blend_alpha_mode(
  268. BLEND2D_BLENDING_ALPHA_MODE blending_alpha_mode,
  269. BLEND2D_BLEND_ALPHA_MODE wb_alpha_mode)
  270. {
  271. unsigned int reg = readl(REGS_BLEND2D + BLEND2D_BLD_CTL);
  272. reg &= ~((1 << 21) | (1 << 20));
  273. switch(blending_alpha_mode){
  274. case BLEND2D_BLD_ALPHA_NORMAL:
  275. break;
  276. case BLEND2D_BLD_ALPHA_SLAYER_DLAYER_ALPAH:
  277. reg |= (1<<20);
  278. break;
  279. case BLEND2D_BLD_ALPHA_SLAYER_DLAYER_GLOBAL_ALPAH:
  280. reg |= (1<<21) | (1<<20);
  281. break;
  282. default:
  283. break;
  284. }
  285. reg &= ~((1 << 22) | (0x3 << 5));
  286. switch(wb_alpha_mode){
  287. case BLEND2D_ALPHA_LAYER1:
  288. reg |= (0<<5);
  289. break;
  290. case BLEND2D_ALPHA_LAYER2:
  291. reg |= (1<<5);
  292. break;
  293. case BLEND2D_ALPHA_BLEND_REG:
  294. reg |= (2<<5);
  295. break;
  296. case BLEND2D_ALPHA_LAYER1_2_BLEND_REG:
  297. reg |= (1<<22);
  298. break;
  299. default:
  300. break;
  301. }
  302. reg &= ~((0x1ff << 8));
  303. reg |= (256 << 8);
  304. writel(reg, REGS_BLEND2D + BLEND2D_BLD_CTL);
  305. }
  306. void blend2d_layer1_data_preproces_en(int enable)
  307. {
  308. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  309. if(enable){
  310. val |= (1<<11);
  311. }else{
  312. val &= ~(1<<11);
  313. }
  314. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  315. }
  316. void blend2d_layer0_data_preproces_en(int enable)
  317. {
  318. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  319. if(enable){
  320. val |= (1<<10);
  321. }else{
  322. val &= ~(1<<10);
  323. }
  324. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  325. }
  326. void blend2d_awtk_premul_mode_enable(int enable)
  327. {
  328. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  329. if(enable){
  330. val &= ~(1<<9);
  331. }else{
  332. val |= (1<<9);
  333. }
  334. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  335. }
  336. void blend2d_awtk_alpha_out_mode_enable(int enable)
  337. {
  338. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  339. if(enable){
  340. val &= ~(1<<8);
  341. }else{
  342. val |= (1<<8);
  343. }
  344. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  345. }
  346. void blend2d_set_global_alpha_a_big(uint8_t alpha)
  347. {
  348. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  349. val &= ~0xff;
  350. val |= alpha;
  351. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLD_2);
  352. }
  353. void blend2d_set_dest_alpha_a_big(uint8_t alpha)
  354. {
  355. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  356. val &= ~(0xff << 24);
  357. val |= alpha << 24;
  358. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  359. }
  360. void blend2d_set_dest_alpha_a_small(uint8_t alpha)
  361. {
  362. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  363. val &= ~(0xff << 16);
  364. val |= alpha << 16;
  365. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  366. }
  367. void blend2d_set_source_alpha_a_small(uint8_t alpha)
  368. {
  369. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  370. val &= ~(0xff << 8);
  371. val |= alpha << 8;
  372. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  373. }
  374. void blend2d_set_source_alpha_a_big(uint8_t alpha)
  375. {
  376. uint32_t val = readl(REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  377. val &= ~(0xff << 0);
  378. val |= alpha << 0;
  379. writel(val, REGS_BLEND2D + BLEND2D_ALPHA_THROLDT);
  380. }
  381. void blend2d_fill(uint32_t address, int xpos, int ypos, int width, int height, int source_width, int source_height,
  382. uint8_t cr, uint8_t cg, uint8_t cb, int format, uint8_t opa, int alpha_byte)
  383. {
  384. /* printf("addr 0x%x, %d,%d,%d,%d-%d,%d r=%d, g=%d, b=%d, format=%d, opa=0x%x.\n",
  385. address, xpos, ypos, width, height, source_width, source_height, cr, cg, cb, format, opa); */
  386. blend2d_set_layer_format(BLEND2D_LAYER1, format & 0xf, (format >> 8) & 0xf);
  387. blend2d_set_layer_addr(BLEND2D_LAYER1, address);
  388. blend2d_set_layer_point(BLEND2D_LAYER1, 0, 0);
  389. blend2d_set_layer_size(BLEND2D_LAYER1, width, height);
  390. blend2d_set_layer_source_size(BLEND2D_LAYER1, width, height);
  391. blend2d_set_layer_colorkey(BLEND2D_LAYER1, 1, 0, 0, 0);
  392. blend2d_set_layer_colorkey_thld(BLEND2D_LAYER1, 0xff, 0xff, 0xff);
  393. blend2d_set_layer_colorkey_backcolor(BLEND2D_LAYER1, 1, cr, cg, cb);
  394. blend2d_set_layer_alpha(BLEND2D_LAYER1, opa);
  395. blend2d_set_layer_alpha_mode(BLEND2D_LAYER1, BLEND2D_ALPHA_REG);
  396. blend2d_layer_enable(BLEND2D_LAYER1, 1);
  397. blend2d_set_layer_format(BLEND2D_LAYER2, format & 0xf, (format >> 8) & 0xf);
  398. blend2d_set_layer_addr(BLEND2D_LAYER2, address);
  399. blend2d_set_layer_point(BLEND2D_LAYER2, 0, 0);
  400. blend2d_set_layer_size(BLEND2D_LAYER2, width, height);
  401. blend2d_set_layer_source_size(BLEND2D_LAYER2, source_width, source_height);
  402. blend2d_layer_enable(BLEND2D_LAYER2, 1);
  403. blend2d_set_blend_format(format & 0xf);
  404. blend2d_set_blend_addr(address);
  405. blend2d_set_blend_point(xpos, ypos);
  406. blend2d_set_blend_size(width, height);
  407. blend2d_set_blend_source_size(source_width, source_height);
  408. blend2d_set_blend_mode(BLEND2D_MIX_BLEND);
  409. blend2d_set_blend_endian(BLEND2D_ARGB);
  410. blend2d_set_blend_alpha(0xff);
  411. if (alpha_byte)
  412. blend2d_set_blend_alpha_mode(BLEND2D_BLD_ALPHA_NORMAL ,BLEND2D_ALPHA_LAYER2);
  413. else
  414. blend2d_set_blend_alpha_mode(BLEND2D_BLD_ALPHA_NORMAL ,BLEND2D_ALPHA_BLEND_REG);
  415. blend2d_read_wait_enable(1, 0x3f);
  416. }
  417. void blend2d_blit(uint32_t dst_addr, int dst_w, int dst_h, int dst_x, int dst_y, int dst_format, int width, int height,
  418. uint32_t src_addr, int src_w, int src_h, int src_x, int src_y, int src_format, uint8_t opa, int alpha_byte)
  419. {
  420. blend2d_set_layer_format(BLEND2D_LAYER1, src_format & 0xf, (src_format >> 8) & 0xf);
  421. blend2d_set_layer_addr(BLEND2D_LAYER1, src_addr);
  422. blend2d_set_layer_point(BLEND2D_LAYER1, src_x, src_y);
  423. blend2d_set_layer_size(BLEND2D_LAYER1, width, height);
  424. blend2d_set_layer_source_size(BLEND2D_LAYER1, src_w, src_h);
  425. blend2d_set_layer_colorkey(BLEND2D_LAYER1, 0, 0, 0, 0);
  426. blend2d_set_layer_colorkey_thld(BLEND2D_LAYER1, 0, 0, 0);
  427. blend2d_set_layer_colorkey_backcolor(BLEND2D_LAYER1, 0, 0, 0, 0);
  428. blend2d_set_layer_alpha(BLEND2D_LAYER1, opa);
  429. if (alpha_byte)
  430. blend2d_set_layer_alpha_mode(BLEND2D_LAYER1, BLEND2D_ALPHA_DATA);
  431. else
  432. blend2d_set_layer_alpha_mode(BLEND2D_LAYER1, BLEND2D_ALPHA_REG);
  433. blend2d_layer_enable(BLEND2D_LAYER1, 1);
  434. blend2d_set_layer_format(BLEND2D_LAYER2, dst_format & 0xf, (dst_format >> 8) & 0xf);
  435. blend2d_set_layer_addr(BLEND2D_LAYER2, dst_addr);
  436. blend2d_set_layer_point(BLEND2D_LAYER2, dst_x, dst_y);
  437. blend2d_set_layer_size(BLEND2D_LAYER2, width, height);
  438. blend2d_set_layer_source_size(BLEND2D_LAYER2, dst_w, dst_h);
  439. blend2d_set_layer_colorkey(BLEND2D_LAYER2, 0, 0, 0, 0);
  440. blend2d_set_layer_colorkey_thld(BLEND2D_LAYER2, 0, 0, 0);
  441. blend2d_set_layer_colorkey_backcolor(BLEND2D_LAYER2, 0, 0, 0, 0);
  442. blend2d_set_layer_alpha(BLEND2D_LAYER2, opa);
  443. blend2d_set_layer_alpha_mode(BLEND2D_LAYER2, BLEND2D_ALPHA_DATA);
  444. blend2d_layer_enable(BLEND2D_LAYER2, 1);
  445. blend2d_set_blend_format(dst_format & 0xf);
  446. blend2d_set_blend_addr(dst_addr);
  447. blend2d_set_blend_point(dst_x, dst_y);
  448. blend2d_set_blend_size(width, height);
  449. blend2d_set_blend_source_size(dst_w, dst_h);
  450. blend2d_set_blend_mode(BLEND2D_MIX_BLEND);
  451. blend2d_set_blend_endian(BLEND2D_ARGB);
  452. blend2d_set_blend_alpha(0xff);
  453. if (alpha_byte)
  454. blend2d_set_blend_alpha_mode(BLEND2D_BLD_ALPHA_NORMAL ,BLEND2D_ALPHA_LAYER2);
  455. else
  456. blend2d_set_blend_alpha_mode(BLEND2D_BLD_ALPHA_NORMAL ,BLEND2D_ALPHA_LAYER1);
  457. blend2d_read_wait_enable(1, 0x3f);
  458. }
  459. static void blend2d_fill_test(void)
  460. {
  461. unsigned char *buf = pvPortMalloc(1024*600*4);
  462. memset(buf, 0, 1024*600*4);
  463. CP15_clean_dcache_for_dma((uint32_t)buf, (uint32_t)buf + 1024*600*4);
  464. ark_lcd_set_osd_yaddr(LCD_OSD1, (uint32_t)buf);
  465. ark_lcd_set_osd_sync(LCD_OSD1);
  466. blend2d_fill((uint32_t)buf, 0, 0, 1024, 600, 1024, 600, 0xff, 0, 0, BLEND2D_FORAMT_ARGB888, 0x20, 0);
  467. blend2d_run();
  468. }
  469. static void blend2d_demo_thread(void *param)
  470. {
  471. blend2d_fill_test();
  472. vTaskDelay(portMAX_DELAY);
  473. }
  474. int blend2d_demo(void)
  475. {
  476. /* Create a task to play animation */
  477. if (xTaskCreate(blend2d_demo_thread, "axiblendemo", configMINIMAL_STACK_SIZE, NULL,
  478. configMAX_PRIORITIES / 3, NULL) != pdPASS) {
  479. printf("create axiblend demo task fail.\n");
  480. return -1;
  481. }
  482. vTaskDelay(portMAX_DELAY);
  483. return 0;
  484. }
  485. static QueueHandle_t blend2d_done;
  486. static void blend2d_int_handler(void *para)
  487. {
  488. unsigned int status;
  489. status = readl(REGS_BLEND2D + BLEND2D_INT_STA);
  490. blend2d_clear_int();
  491. if(status & 0x2) {
  492. printf("blend2d err int 0x%x.\n", status);
  493. }
  494. xQueueSendFromISR(blend2d_done, NULL, 0);
  495. }
  496. int blend2d_init(void)
  497. {
  498. blend2d_done = xQueueCreate(1, 0);
  499. request_irq(BLEND2D_IRQn, 0, blend2d_int_handler, NULL);
  500. writel(0x82, REGS_BLEND2D + BLEND2D_LAYER1_BURST_CTL);
  501. writel(0x82, REGS_BLEND2D + BLEND2D_LAYER2_BURST_CTL);
  502. writel(0x3, REGS_BLEND2D + BLEND2D_INT_CTL);
  503. writel(1, REGS_BLEND2D + BLEND2D_ENABLE);
  504. #if BLEND2D_AWTK_MODE_EN
  505. blend2d_awtk_premul_mode_enable(1);
  506. blend2d_awtk_alpha_out_mode_enable(1);
  507. blend2d_layer0_data_preproces_en(1);
  508. blend2d_layer1_data_preproces_en(1);
  509. blend2d_set_source_alpha_a_small(0x8);
  510. blend2d_set_source_alpha_a_big(0xf8);
  511. #else
  512. blend2d_awtk_premul_mode_enable(0);
  513. blend2d_awtk_alpha_out_mode_enable(0);
  514. blend2d_layer0_data_preproces_en(0);
  515. blend2d_layer1_data_preproces_en(0);
  516. blend2d_set_source_alpha_a_small(0x0);
  517. blend2d_set_source_alpha_a_big(0xff);
  518. #endif
  519. return 0;
  520. }
  521. int blend2d_run(void)
  522. {
  523. xQueueReset(blend2d_done);
  524. blend2d_start();
  525. if (xQueueReceive(blend2d_done, NULL, pdMS_TO_TICKS(1000)) != pdTRUE) {
  526. printf("blend2d_run timeout.\n");
  527. return -1;
  528. }
  529. return 0;
  530. }