From 57c8a2bd793a81e2644e9f4e2025f6a3f7303238 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 5 Mar 2021 20:09:19 +0800 Subject: [PATCH 1/4] copy memory close interrupt --- bsp/raspberry-pi/raspi4-32/driver/drv_eth.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c index 20ae855b6c..d0d2dc5414 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c +++ b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c @@ -636,10 +636,12 @@ rt_err_t rt_eth_tx(rt_device_t device, struct pbuf *p) if (link_flag == 1) { rt_sem_take(&sem_lock, RT_WAITING_FOREVER); + rt_ubase_t level = rt_hw_interrupt_disable(); pbuf_copy_partial(p, (void *)&send_cache_pbuf[0], p->tot_len, 0); rt_memcpy((void *)sendbuf, send_cache_pbuf, p->tot_len); bcmgenet_gmac_eth_send((void *)sendbuf, p->tot_len); + rt_hw_interrupt_enable(level); rt_sem_release(&sem_lock); } return RT_EOK; @@ -654,6 +656,7 @@ struct pbuf *rt_eth_rx(rt_device_t device) if (link_flag == 1) { rt_sem_take(&sem_lock, RT_WAITING_FOREVER); + rt_ubase_t level = rt_hw_interrupt_disable(); recv_len = bcmgenet_gmac_eth_recv((rt_uint8_t **)&addr_point[0]); if (recv_len > 0) { @@ -662,6 +665,7 @@ struct pbuf *rt_eth_rx(rt_device_t device) addr_point[0] = (rt_uint32_t)(addr_point[0] + (eth_recv_no_cache - RECV_DATA_NO_CACHE)); rt_memcpy(pbuf->payload, (char *)addr_point[0], recv_len); } + rt_hw_interrupt_enable(level); rt_sem_release(&sem_lock); } return pbuf; -- Gitee From 62a5a265ff8095b86a56aa3d21f3b10120bb3a50 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 5 Mar 2021 20:23:28 +0800 Subject: [PATCH 2/4] rt-smart add lcd and touch driver --- bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c | 102 ++++++++++++++++++- bsp/raspberry-pi/raspi4-32/driver/mbox.c | 18 ++++ bsp/raspberry-pi/raspi4-32/driver/mbox.h | 6 ++ bsp/raspberry-pi/raspi4-32/driver/rt_lcd.h | 65 ++++++++++++ 4 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 bsp/raspberry-pi/raspi4-32/driver/rt_lcd.h diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c index a8d68fd9cf..847cb5e7c8 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c +++ b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c @@ -10,13 +10,23 @@ #include #include + +#include +#include +#include + #include "mbox.h" +#include "rt_lcd.h" #include "drv_hdmi.h" +static volatile uint32_t touchbuf; + +#define MAXIMUM_SUPPORTED_POINTS 10 + #ifdef BSP_USING_HDMI #define LCD_WIDTH (800) #define LCD_HEIGHT (480) -#define LCD_DEPTH (32) +#define LCD_DEPTH (0) #define LCD_BPP (32) #define TAG_ALLOCATE_BUFFER 0x00040001 @@ -28,6 +38,9 @@ #define TAG_SET_VIRT_OFFSET 0x00048009 #define TAG_END 0x00000000 +static rt_uint32_t touch_x; +static rt_uint32_t touch_y; +static rt_uint32_t touch_state; enum { MBOX_TAG_FB_GET_GPIOVIRT = 0x00040010, @@ -111,6 +124,37 @@ rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args) info->framebuffer = lcd->fb; } break; + + case FBIOGET_FSCREENINFO: + { + #ifdef RT_USING_USERSPACE + struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args; + strncpy(info->id, "lcd", sizeof(info->id)); + info->smem_len = lcd->width * lcd->height * (LCD_BPP/8); + info->smem_start = (uint32_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb, + info->smem_len, 1); + info->line_length = lcd->width * (LCD_BPP/8); + #endif + } + break; + + case FBIOGET_VSCREENINFO: + { + struct fb_var_screeninfo *info = (struct fb_var_screeninfo *)args; + info->bits_per_pixel = 16; + info->xres = lcd->width; + info->yres = lcd->height; + } + break; + + case FBIO_CURSOR: + { + struct touch_screeninfo *info = (struct touch_screeninfo *)args; + info->xres = touch_x; + info->yres = touch_y; + info->touch_state = touch_state; + } + break; } return RT_EOK; } @@ -288,8 +332,58 @@ void *bcm271x_mbox_fb_alloc(int width, int height, int bpp, int nrender) return (void *)((rt_uint32_t)(mbox[5] & 0x3fffffff)); } +struct touch_regs +{ + uint8_t device_mode; + uint8_t gesture_id; + uint8_t num_points; + struct touch { + uint8_t xh; + uint8_t xl; + uint8_t yh; + uint8_t yl; + uint8_t res1; + uint8_t res2; + } point[MAXIMUM_SUPPORTED_POINTS]; +}; + +void touch_service(void *param) +{ + int ii = 0; + int cnt = 0; + touchbuf = bcm271x_mbox_get_touch(); + touchbuf = (size_t)rt_hw_kernel_phys_to_virt((void*)touchbuf, 0x1000); + while (1) + { + cnt = cnt + 1; + struct touch_regs* regs = (struct touch_regs*)touchbuf; + int known_ids = 0; + int modified_ids = 0, released_ids; + + if((regs->num_points > 0) && (regs->num_points < MAXIMUM_SUPPORTED_POINTS)) + { + for (ii = 0; ii < regs->num_points; ii++) + { + + touch_x = (((int)regs->point[ii].xh & 0xf) << 8) + regs->point[ii].xl; + touch_y = (((int)regs->point[ii].yh & 0xf) << 8) + regs->point[ii].yl; + int touchid = (regs->point[ii].yh >> 4) & 0xf; + } + touch_state = 1; + } + else + { + touch_state = 0; + } + + rt_thread_mdelay(50); + } +} + int hdmi_fb_init(void) { + rt_thread_t touch_tid; + _hdmi.fb = (rt_uint8_t *)bcm271x_mbox_fb_alloc(LCD_WIDTH, LCD_HEIGHT, LCD_BPP, 1); bcm271x_mbox_fb_setoffset(0, 0); bcm271x_mbox_fb_set_porder(0); @@ -299,7 +393,11 @@ int hdmi_fb_init(void) _hdmi.pitch = 0; _hdmi.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB888; - //rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb); + touch_tid = rt_thread_create("touch", touch_service, NULL, 4096, 26, 10); + if (touch_tid != RT_NULL) + rt_thread_startup(touch_tid); + + rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb); rt_hdmi_fb_device_init(&_hdmi, "lcd"); return 0; diff --git a/bsp/raspberry-pi/raspi4-32/driver/mbox.c b/bsp/raspberry-pi/raspi4-32/driver/mbox.c index 177b043a8a..367d99e09e 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/mbox.c +++ b/bsp/raspberry-pi/raspi4-32/driver/mbox.c @@ -51,6 +51,24 @@ int mbox_call(unsigned char ch, int mmu_enable) return 0; } +rt_uint32_t bcm271x_mbox_get_touch(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_GET_TOUCHBUF; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + return (rt_uint32_t)(mbox[5] & ~0xC0000000); +} + int bcm271x_notify_reboot(void) { mbox[0] = 7*4; // length of the message diff --git a/bsp/raspberry-pi/raspi4-32/driver/mbox.h b/bsp/raspberry-pi/raspi4-32/driver/mbox.h index eae6572503..37102da33a 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/mbox.h +++ b/bsp/raspberry-pi/raspi4-32/driver/mbox.h @@ -133,6 +133,12 @@ enum { #define MBOX_TAG_NOTIFY_REBOOT 0x00030048 #define MBOX_TAG_NOTIFY_XHCI_RESET 0x00030058 +/* +* touch +*/ +#define MBOX_TAG_GET_TOUCHBUF (0x0004000F) + + #define MBOX_ADDR 0x08000000 extern uint32_t mbox_addr; diff --git a/bsp/raspberry-pi/raspi4-32/driver/rt_lcd.h b/bsp/raspberry-pi/raspi4-32/driver/rt_lcd.h new file mode 100644 index 0000000000..6cd2f12a0f --- /dev/null +++ b/bsp/raspberry-pi/raspi4-32/driver/rt_lcd.h @@ -0,0 +1,65 @@ +#ifndef RT_LCD_H__ +#define RT_LCD_H__ + +/* ioctls + 0x46 is 'F' */ +#define FBIOGET_VSCREENINFO 0x4600 +#define FBIOPUT_VSCREENINFO 0x4601 +#define FBIOGET_FSCREENINFO 0x4602 +#define FBIOGETCMAP 0x4604 +#define FBIOPUTCMAP 0x4605 +#define FBIOPAN_DISPLAY 0x4606 +#define FBIO_CURSOR 0x4608 +/* #define FBIOGET_MONITORSPEC 0x460C */ +/* #define FBIOPUT_MONITORSPEC 0x460D */ +/* #define FBIOSWITCH_MONIBIT 0x460E */ +#define FBIOGET_CON2FBMAP 0x460F +#define FBIOPUT_CON2FBMAP 0x4610 +#define FBIOBLANK 0x4611 /* arg: 0 or vesa level + 1 */ +#define FBIOGET_VBLANK 0x4612 +#define FBIO_ALLOC 0x4613 +#define FBIO_FREE 0x4614 +#define FBIOGET_GLYPH 0x4615 +#define FBIOGET_HWCINFO 0x4616 +#define FBIOPUT_MODEINFO 0x4617 +#define FBIOGET_DISPINFO 0x4618 +#define FBIO_WAITFORVSYNC 0x4620 + +struct fb_bitfield +{ + uint32_t offset; /* beginning of bitfield */ + uint32_t length; /* length of bitfield */ + uint32_t msb_right; /* != 0 : Most significant bit is */ + /* right */ +}; + +struct fb_var_screeninfo +{ + uint32_t xres; + uint32_t yres; + + uint32_t bits_per_pixel; + + struct fb_bitfield red; /* bitfield in fb mem if true color, */ + struct fb_bitfield green; /* else only length is significant */ + struct fb_bitfield blue; + struct fb_bitfield transp; /* transparency */ +}; + +struct fb_fix_screeninfo +{ + char id[16]; + unsigned long smem_start; + uint32_t smem_len; + + uint32_t line_length; +}; + +struct touch_screeninfo +{ + uint32_t xres; + uint32_t yres; + uint32_t touch_state; +}; + +#endif -- Gitee From 31b2a090c994101f3d7933606ac5d65fb20fc0fe Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 5 Mar 2021 20:38:54 +0800 Subject: [PATCH 3/4] fix code format --- bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c | 30 +++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c index 847cb5e7c8..7cefc07ccf 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c +++ b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c @@ -130,7 +130,7 @@ rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args) #ifdef RT_USING_USERSPACE struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args; strncpy(info->id, "lcd", sizeof(info->id)); - info->smem_len = lcd->width * lcd->height * (LCD_BPP/8); + info->smem_len = lcd->width * lcd->height * (LCD_BPP/8); info->smem_start = (uint32_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb, info->smem_len, 1); info->line_length = lcd->width * (LCD_BPP/8); @@ -334,17 +334,17 @@ void *bcm271x_mbox_fb_alloc(int width, int height, int bpp, int nrender) struct touch_regs { - uint8_t device_mode; - uint8_t gesture_id; - uint8_t num_points; - struct touch { - uint8_t xh; - uint8_t xl; - uint8_t yh; - uint8_t yl; - uint8_t res1; - uint8_t res2; - } point[MAXIMUM_SUPPORTED_POINTS]; + uint8_t device_mode; + uint8_t gesture_id; + uint8_t num_points; + struct touch { + uint8_t xh; + uint8_t xl; + uint8_t yh; + uint8_t yl; + uint8_t res1; + uint8_t res2; + } point[MAXIMUM_SUPPORTED_POINTS]; }; void touch_service(void *param) @@ -358,7 +358,7 @@ void touch_service(void *param) cnt = cnt + 1; struct touch_regs* regs = (struct touch_regs*)touchbuf; int known_ids = 0; - int modified_ids = 0, released_ids; + int modified_ids = 0, released_ids = 0; if((regs->num_points > 0) && (regs->num_points < MAXIMUM_SUPPORTED_POINTS)) { @@ -366,7 +366,7 @@ void touch_service(void *param) { touch_x = (((int)regs->point[ii].xh & 0xf) << 8) + regs->point[ii].xl; - touch_y = (((int)regs->point[ii].yh & 0xf) << 8) + regs->point[ii].yl; + touch_y = (((int)regs->point[ii].yh & 0xf) << 8) + regs->point[ii].yl; int touchid = (regs->point[ii].yh >> 4) & 0xf; } touch_state = 1; @@ -395,7 +395,9 @@ int hdmi_fb_init(void) touch_tid = rt_thread_create("touch", touch_service, NULL, 4096, 26, 10); if (touch_tid != RT_NULL) + { rt_thread_startup(touch_tid); + } rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb); rt_hdmi_fb_device_init(&_hdmi, "lcd"); -- Gitee From 608a06d79350704974ee9d7571fb4554d0db4814 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 5 Mar 2021 20:47:37 +0800 Subject: [PATCH 4/4] code format --- bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c | 8 ++++---- bsp/raspberry-pi/raspi4-32/driver/mbox.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c index 7cefc07ccf..760f0932c7 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c +++ b/bsp/raspberry-pi/raspi4-32/driver/drv_hdmi.c @@ -127,14 +127,14 @@ rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args) case FBIOGET_FSCREENINFO: { - #ifdef RT_USING_USERSPACE +#ifdef RT_USING_USERSPACE struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args; strncpy(info->id, "lcd", sizeof(info->id)); - info->smem_len = lcd->width * lcd->height * (LCD_BPP/8); + info->smem_len = lcd->width*lcd->height*(LCD_BPP/8); info->smem_start = (uint32_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb, info->smem_len, 1); - info->line_length = lcd->width * (LCD_BPP/8); - #endif + info->line_length = lcd->width*(LCD_BPP/8); +#endif } break; diff --git a/bsp/raspberry-pi/raspi4-32/driver/mbox.h b/bsp/raspberry-pi/raspi4-32/driver/mbox.h index 37102da33a..88c68eed38 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/mbox.h +++ b/bsp/raspberry-pi/raspi4-32/driver/mbox.h @@ -138,7 +138,6 @@ enum { */ #define MBOX_TAG_GET_TOUCHBUF (0x0004000F) - #define MBOX_ADDR 0x08000000 extern uint32_t mbox_addr; -- Gitee