summaryrefslogtreecommitdiff
path: root/bsp/nuvoton/libraries/nu_packages/ILI9341/ili9341_ebi.c
blob: 732bebc0e08fe4cce6d00eb07f7818f6c679c3a1 (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
/**************************************************************************//**
*
* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date            Author       Notes
* 2020-1-16       Wayne        First version
*
******************************************************************************/

#include <rtconfig.h>

#if defined(NU_PKG_USING_ILI9341_EBI)

#include <lcd_ili9341.h>
#include "drv_pdma.h"

#define ILI9341_ADDR_CMD  0x0
#define ILI9341_ADDR_DATA 0x0030000

#define ili9341_reg_write(u32RegAddr)   (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_CMD))) = (u32RegAddr))
#define ili9341_read_data()             (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))))
#define ili9341_write_data(u32Data)     (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))) = (u32Data))

static rt_uint32_t g_uint32_ili9341_base = 0;

void ili9341_send_cmd(rt_uint8_t cmd)
{
    CLR_RS;
    ili9341_reg_write(cmd);
    SET_RS;
}

void ili9341_send_cmd_parameter(rt_uint8_t data)
{
    ili9341_write_data(data);
}

void ili9341_send_pixel_data(rt_uint16_t color)
{
    ili9341_write_data(color);
}

void ili9341_send_pixels(rt_uint16_t *pixels, int len)
{
    int count = len / sizeof(rt_uint16_t);
    if (count < 1024)
    {
        // CPU feed
        int i = 0;
        while (i < count)
        {
            ili9341_write_data(pixels[i]);
            i++;
        }
    }
    else
    {
        // PDMA-M2M feed
        nu_pdma_mempush((void *)(g_uint32_ili9341_base + (ILI9341_ADDR_DATA)), (void *)pixels, 16, count);
    }
}

void ili9341_set_column(uint16_t StartCol, uint16_t EndCol)
{
    ili9341_send_cmd(0x2A);
    ili9341_write_data((StartCol >> 8) & 0xFF);
    ili9341_write_data(StartCol & 0xFF);
    ili9341_write_data((EndCol >> 8) & 0xFF);
    ili9341_write_data(EndCol & 0xFF);
}

void ili9341_set_page(uint16_t StartPage, uint16_t EndPage)
{
    ili9341_send_cmd(0x2B);
    ili9341_write_data((StartPage >> 8) & 0xFF);
    ili9341_write_data(StartPage & 0xFF);
    ili9341_write_data((EndPage >> 8) & 0xFF);
    ili9341_write_data(EndPage & 0xFF);
}

void ili9341_lcd_get_pixel(char *color, int x, int y)
{
    rt_uint16_t red = 0;
    rt_uint16_t green = 0;
    rt_uint16_t blue = 0;

    if (x >= XSIZE_PHYS || y >= YSIZE_PHYS)
    {
        *(rt_uint16_t *)color = 0;
        return;
    }

    ili9341_set_column(x, x);
    ili9341_set_page(y, y);
    ili9341_send_cmd(0x2E);

    ili9341_read_data();           // Dummy
    red = ili9341_read_data();     // Red[4:0]@D15~D11
    blue = ili9341_read_data();    // Blue[4:0]@D15~D11
    green = ili9341_read_data();   // Green[5:0]@D15~D10

    //BGR565: B in High byte, R in low byte
    //*(rt_uint16_t *)color = (((blue >> 11) << 11) | ((green >> 10) << 5) | (red >> 11));

    //RGB565: R in High byte, B in low byte
    *(rt_uint16_t *)color = (((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11));
}

rt_err_t rt_hw_lcd_ili9341_ebi_init(rt_uint32_t ili9341_base)
{
    g_uint32_ili9341_base = ili9341_base;
    return RT_EOK;
}

#endif /* if defined(NU_PKG_USING_ILI9341_EBI) */