【外设移植】+LCD_ST7735+M61开发板+GB2312字库

[复制链接]
查看1050 | 回复12 | 2024-4-1 09:13:02 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-4-19 16:20 编辑

Ai-M61-32SU 有4M flash,可以装载一个完整的200多K的GB2312_80字库。本文实现字库装载并通过驱动ST7735屏幕,显示文字。

微信图片_20240401092501.jpg
一、将gb2312_80.bin(字库文件)烧录到Ai-M61-32SU中

1、将gb2312_80.bin放到工程的根目录

2、修改flash_prog_cfg.ini文件,增加了partition和media部分

  1. [cfg]
  2. # 0: no erase, 1:programmed section erase, 2: chip erase
  3. erase = 1
  4. # skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated
  5. skip_mode = 0x0, 0x0
  6. # 0: not use isp mode, #1: isp mode
  7. boot2_isp_mode = 0

  8. [FW]
  9. filedir = ./build/build_out/gpio*_$(CHIPNAME).bin
  10. address = 0x000000

  11. [partition]
  12. filedir = ./build/build_out/partition.bin
  13. address = 0xE000

  14. [media]
  15. filedir = ./gb2312_80.bin
  16. address = @partition
复制代码


gb2312_80.bin的起始地址由partition.bin决定。
partition.bin的参数由aithinker_Ai-M6X_SDK\bsp\board\bl616dk\config\partition_cfg_4M.toml决定。partition_cfg_4M.toml有如下内容:
  1. [[pt_entry]]
  2. type = 2
  3. name = "media"
  4. device = 0
  5. address0 = 0x378000
  6. size0 = 0x71000
  7. address1 = 0
  8. size1 = 0
复制代码

所以meida 分区起始地址为0x378000,空间为0X71000,大概500k。
3、程序烧录时顺便把字库也烧进区


  1. make flash COMX=COM10
复制代码
这样就可以把gb2312_80.bin烧录到0x378000

二、 用于LCD显示及字库读取的程序main.c
  1. #include "bflb_gpio.h"
  2. #include "bflb_uart.h"

  3. #include "board.h"

  4. #include "lcd.h"
  5. #include "hzk.h"

  6. struct bflb_device_s *uartx;
  7. struct bflb_device_s *gpio;


  8. void uart_isr(int irq, void *arg)
  9. {
  10.     uint32_t intstatus = bflb_uart_get_intstatus(uartx);

  11.     if (intstatus & UART_INTSTS_RX_FIFO) {
  12.         printf("rx fifo\r\n");
  13.         while (bflb_uart_rxavailable(uartx)) {
  14.             printf("0x%02x\r\n", bflb_uart_getchar(uartx));
  15.         }
  16.         bflb_uart_feature_control(uartx, UART_CMD_SET_RTS_VALUE, 1);
  17.     }
  18.     if (intstatus & UART_INTSTS_RTO) {
  19.         printf("rto\r\n");
  20.         while (bflb_uart_rxavailable(uartx)) {
  21.             printf("0x%02x\r\n", bflb_uart_getchar(uartx));
  22.         }
  23.         bflb_uart_int_clear(uartx, UART_INTCLR_RTO);
  24.     }
  25. }

  26. void uart_init(void)
  27. {
  28.     uartx = bflb_device_get_by_name(DEFAULT_TEST_UART);
  29.     struct bflb_uart_config_s cfg;

  30.     cfg.baudrate = 115200;
  31.     cfg.data_bits = UART_DATA_BITS_8;
  32.     cfg.stop_bits = UART_STOP_BITS_1;
  33.     cfg.parity = UART_PARITY_NONE;
  34.     cfg.flow_ctrl = 0;
  35.     cfg.tx_fifo_threshold = 7;
  36.     cfg.rx_fifo_threshold = 7;
  37.     bflb_uart_init(uartx, &cfg);

  38.     bflb_uart_rxint_mask(uartx, false);
  39.     bflb_irq_attach(uartx->irq_num, uart_isr, NULL);
  40.     bflb_irq_enable(uartx->irq_num);

  41.     bflb_uart_feature_control(uartx, UART_CMD_SET_SW_RTS_CONTROL, true);
  42.     bflb_uart_feature_control(uartx, UART_CMD_SET_RTS_VALUE, 0);
  43. }

  44. int main(void)
  45. {
  46.     board_init();
  47.     board_uartx_gpio_init();
  48.     uart_init();
  49.     lcd_init();


  50.     lcd_clear(LCD_COLOR_RGB565(255,0,0));

  51.     gpio = bflb_device_get_by_name("gpio");
  52.     printf("gpio output\r\n");

  53.     bflb_gpio_init(gpio, GPIO_PIN_17, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
  54.     bflb_gpio_set(gpio, GPIO_PIN_17);


  55.     GUI_Write16CnCharMatrix(0,32,(uint8_t*)"蒹葭苍苍白露为霜",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));
  56.     GUI_Write16CnCharMatrix(0,52,(uint8_t*)"所谓伊人在水一方",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));
  57.     GUI_Write16CnCharMatrix(0,72,(uint8_t*)"溯洄从之道阻且长",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));
  58.     GUI_Write16CnCharMatrix(0,92,(uint8_t*)"溯游从之宛在水中央",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));


  59.     while (1) {


  60.     }
  61. }
复制代码

hzk.h

  1. #ifndef ___HZK_H___
  2. #define ___HZK_H___


  3. void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, uint8_t *cn, unsigned short wordColor, unsigned short backColor);

  4. #endif
复制代码
hzk.c

  1. #include "bflb_flash.h"
  2. #include "lcd.h"
  3. #include "hzk.h"

  4. uint32_t FLASH_ADDR_BASE=0x378000;
  5. uint8_t MatrixBuff[32];

  6. void getMatrix(const unsigned short nmCode)
  7. {
  8.         uint8_t i;
  9.         uint32_t offset;
  10.         unsigned char GBH,GBL;
  11.         unsigned short nm=nmCode;

  12.         GBH=nm>>8;
  13.         GBL=nm;
  14.         if(GBH>=0xb0)
  15.         {
  16.                 offset=((GBH-0xa7)*94+GBL-0xa1)*32;
  17.         }else
  18.         {
  19.                 offset=((GBH-0xa1)*94+GBL-0xa1)*32;
  20.         }

  21.     bflb_flash_read(FLASH_ADDR_BASE+offset+i, MatrixBuff, sizeof(MatrixBuff));

  22. }


  23. void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, uint8_t *cn, unsigned short wordColor, unsigned short backColor)
  24. {
  25.     uint8_t i, j, wordNum;
  26.         uint16_t zm;
  27.     uint16_t color;
  28.     while (*cn != '\0')
  29.     {
  30.         //setXY(x, y, x+15, y+15);
  31.                                                 zm=*cn;
  32.                                                 zm<<=8;
  33.                                                 zm|=*(cn+1);

  34.                                                 getMatrix(zm);


  35.                 for(i=0; i<32; i++)
  36.                 {   //MSK的位数
  37.                     color=MatrixBuff[i];
  38.                     for(j=0;j<8;j++)
  39.                     {
  40.                         if((color&0x80)==0x80)
  41.                         {
  42.                             //lcd_write_data_word(wordColor);
  43.                             if(i%2==0) lcd_draw_point(x+j,y+i/2,wordColor);
  44.                             else lcd_draw_point(x+j+8,y+i/2,wordColor);
  45.                         }
  46.                         else
  47.                         {
  48.                             //lcd_write_data_word(backColor);
  49.                             if(i%2==0) lcd_draw_point(x+j,y+i/2,backColor);
  50.                             else lcd_draw_point(x+j+8,y+i/2,backColor);
  51.                         }
  52.                         color<<=1;
  53.                     }//for(j=0;j<8;j++)结束
  54.                 }


  55.         cn += 2;
  56.         x += 16;
  57.     }
  58. }
复制代码
为了支持LCD显示,在aithinker_Ai-M6X_SDK\bsp\common\lcd\spi中添加了2个文件:st7735s_spi.h

  1. /**
  2. * @file st7735s.h
  3. * @brief
  4. *
  5. * Copyright (c) 2021 Bouffalolab team
  6. *
  7. * Licensed to the Apache Software Foundation (ASF) under one or more
  8. * contributor license agreements.  See the NOTICE file distributed with
  9. * this work for additional information regarding copyright ownership.  The
  10. * ASF licenses this file to you under the Apache License, Version 2.0 (the
  11. * "License"); you may not use this file except in compliance with the
  12. * License.  You may obtain a copy of the License at
  13. *
  14. *   http://www.apache.org/licenses/LICENSE-2.0
  15. *
  16. * Unless required by applicable law or agreed to in writing, software
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
  19. * License for the specific language governing permissions and limitations
  20. * under the License.
  21. *
  22. */

  23. #ifndef _ST7735S_SPI_H_
  24. #define _ST7735S_SPI_H_

  25. #include "../lcd_conf.h"

  26. #if defined LCD_SPI_ST7735S

  27. /* Do not modify the following */

  28. #define ST7735S_SPI_COLOR_DEPTH 16

  29. typedef struct {
  30.     uint8_t cmd; /* 0xFF : delay(databytes)ms */
  31.     const char *data;
  32.     uint8_t databytes; /* Num of data in data; or delay time */
  33. } st7735s_spi_init_cmd_t;

  34. typedef uint16_t st7735s_spi_color_t;

  35. int st7735s_spi_init();
  36. void st7735s_spi_async_callback_enable(bool enable);
  37. void st7735s_spi_async_callback_register(void (*callback)(void));
  38. int st7735s_spi_set_dir(uint8_t dir, uint8_t mir_flag);
  39. void st7735s_spi_set_draw_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
  40. void st7735s_spi_draw_point(uint16_t x, uint16_t y, st7735s_spi_color_t color);
  41. void st7735s_spi_draw_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t color);
  42. void st7735s_spi_draw_picture_nonblocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture);
  43. void st7735s_spi_draw_picture_blocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture);
  44. int st7735s_spi_draw_is_busy(void);

  45. #endif
  46. #endif
复制代码
st7735s_spi.c

  1. /**
  2. * @file st7735s_spi.c
  3. * @brief
  4. *
  5. * Copyright (c) 2021 Bouffalolab team
  6. *
  7. * Licensed to the Apache Software Foundation (ASF) under one or more
  8. * contributor license agreements.  See the NOTICE file distributed with
  9. * this work for additional information regarding copyright ownership.  The
  10. * ASF licenses this file to you under the Apache License, Version 2.0 (the
  11. * "License"); you may not use this file except in compliance with the
  12. * License.  You may obtain a copy of the License at
  13. *
  14. *   http://www.apache.org/licenses/LICENSE-2.0
  15. *
  16. * Unless required by applicable law or agreed to in writing, software
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
  19. * License for the specific language governing permissions and limitations
  20. * under the License.
  21. *
  22. */

  23. #include "../lcd.h"

  24. #if defined(LCD_SPI_ST7735S)

  25. #if (LCD_SPI_INTERFACE_TYPE == 1)
  26. #include "bl_spi_hard_4.h"

  27. #define lcd_spi_init                          lcd_spi_hard_4_init
  28. #define lcd_spi_isbusy                        lcd_spi_hard_4_is_busy

  29. #define lcd_spi_transmit_cmd_para             lcd_spi_hard_4_transmit_cmd_para
  30. #define lcd_spi_transmit_cmd_pixel_sync       lcd_spi_hard_4_transmit_cmd_pixel_sync
  31. #define lcd_spi_transmit_cmd_pixel_fill_sync  lcd_spi_hard_4_transmit_cmd_pixel_fill_sync

  32. #define lcd_spi_sync_callback_enable          lcd_spi_hard_4_async_callback_enable
  33. #define lcd_spi_async_callback_register       lcd_spi_hard_4_async_callback_register
  34. #define lcd_spi_transmit_cmd_pixel_async      lcd_spi_hard_4_transmit_cmd_pixel_async
  35. #define lcd_spi_transmit_cmd_pixel_fill_async lcd_spi_hard_4_transmit_cmd_pixel_fill_async

  36. static lcd_spi_hard_4_init_t spi_para = {
  37.     .clock_freq = 40 * 1000 * 1000,
  38. #if (ST7735S_SPI_PIXEL_FORMAT == 1)
  39.     .pixel_format = LCD_SPI_LCD_PIXEL_FORMAT_RGB565,
  40. #elif (ST7735S_SPI_PIXEL_FORMAT == 2)
  41.     .pixel_format = LCD_SPI_LCD_PIXEL_FORMAT_NRGB8888,
  42. #endif
  43. };

  44. #else

  45. #error "Configuration error"

  46. #endif
  47. const st7735s_spi_init_cmd_t st7735s_spi_init_cmds[] = {
  48.     { 0x11, NULL, 0},
  49.     { 0xFF, NULL, 120 },

  50.     { 0xB1, "\x02\x35\x36", 3 }, //Frame rate 80Hz
  51.     { 0xB2, "\x02\x35\x36", 3 }, //Frame rate 80Hz
  52.     { 0xB3, "\x02\x35\x36\x02\x35\x36", 6 },
  53.     { 0xB4, "\x03", 1 },
  54.     { 0xC0, "\xA2\x02\x84", 3 },
  55.     { 0xC1, "\xC5", 1 },
  56.     { 0xC2, "\x0D\x00", 2},
  57.     { 0xC3, "\x8D\x2A", 2},
  58.     { 0xC4, "\x8D\xEE", 2},
  59.     { 0xC5, "\x0A", 1},
  60.     { 0x36, "\xC8", 1},
  61.     { 0xE0, "\x12\x1C\x10\x18\x33\x2C\x25\x28\x28\x27\x2F\x3c\x00\x03\x03\x10", 16},
  62.     { 0xE1, "\x12\x1C\x10\x18\x2D\x28\x23\x28\x28\x26\x2F\x3B\x00\x03\x03\x10", 16},
  63.     { 0x3A, "\x05", 1},  //65k mode

  64.     { 0x29, NULL, 0 },  //Display on
  65. };

  66. /**
  67. * @brief st7735s_spi_async_callback_enable
  68. *
  69. * @return
  70. */
  71. void st7735s_spi_async_callback_enable(bool enable)
  72. {
  73.     lcd_spi_sync_callback_enable(enable);
  74. }

  75. /**
  76. * @brief st7735s_spi_async_callback_register
  77. *
  78. * @return
  79. */
  80. void st7735s_spi_async_callback_register(void (*callback)(void))
  81. {
  82.     lcd_spi_async_callback_register(callback);
  83. }

  84. /**
  85. * @brief st7735s_spi_draw_is_busy, After the call st7735s_spi_draw_picture_dma must check this,
  86. *         if st7735s_spi_draw_is_busy() == 1, Don't allow other draw !!
  87. *         can run in the DMA interrupt callback function.
  88. *
  89. * @return int 0:draw end; 1:Being draw
  90. */
  91. int st7735s_spi_draw_is_busy(void)
  92. {
  93.     return lcd_spi_isbusy();
  94. }

  95. /**
  96. * @brief st7735s_spi_init
  97. *
  98. * @return int
  99. */
  100. int st7735s_spi_init()
  101. {
  102.     lcd_spi_init(&spi_para);

  103.     for (uint16_t i = 0; i < (sizeof(st7735s_spi_init_cmds) / sizeof(st7735s_spi_init_cmds[0])); i++) {
  104.         if (st7735s_spi_init_cmds[i].cmd == 0xFF && st7735s_spi_init_cmds[i].data == NULL && st7735s_spi_init_cmds[i].databytes) {
  105.             bflb_mtimer_delay_ms(st7735s_spi_init_cmds[i].databytes);
  106.         } else {
  107.             lcd_spi_transmit_cmd_para(st7735s_spi_init_cmds[i].cmd, (void *)(st7735s_spi_init_cmds[i].data), st7735s_spi_init_cmds[i].databytes);
  108.         }
  109.     }

  110.     return 0;
  111. }

  112. /**
  113. * @brief
  114. *
  115. * @param dir
  116. * @param mir_flag
  117. */
  118. int st7735s_spi_set_dir(uint8_t dir, uint8_t mir_flag)
  119. {
  120.     uint8_t param;

  121.     switch (dir) {
  122.         case 0:
  123.             if (!mir_flag)
  124.                 param = 0x00;
  125.             else
  126.                 param = 0x40;
  127.             break;
  128.         case 1:
  129.             if (!mir_flag)
  130.                 param = 0x20;
  131.             else
  132.                 param = 0xA0;
  133.             break;
  134.         case 2:
  135.             if (!mir_flag)
  136.                 param = 0x80;
  137.             else
  138.                 param = 0xC0;
  139.             break;
  140.         case 3:
  141.             if (!mir_flag)
  142.                 param = 0xE0;
  143.             else
  144.                 param = 0x60;

  145.             break;
  146.         default:
  147.             return -1;
  148.             break;
  149.     }

  150.     lcd_spi_transmit_cmd_para(0x36, (void *)&param, 1);

  151.     return dir;
  152. }

  153. /**
  154. * @brief st7735s_spi_set_draw_window
  155. *
  156. * @param x1
  157. * @param y1
  158. * @param x2
  159. * @param y2
  160. */
  161. void st7735s_spi_set_draw_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
  162. {
  163. #if ST7735S_SPI_OFFSET_X
  164.     x1 += ST7735S_SPI_OFFSET_X;
  165.     x2 += ST7735S_SPI_OFFSET_X;
  166. #endif
  167. #if ST7735S_SPI_OFFSET_Y
  168.     y1 += ST7735S_SPI_OFFSET_Y;
  169.     y2 += ST7735S_SPI_OFFSET_Y;
  170. #endif

  171.     int8_t param[4];

  172.     param[0] = (x1 >> 8) & 0xFF;
  173.     param[1] = x1 & 0xFF;
  174.     param[2] = (x2 >> 8) & 0xFF;
  175.     param[3] = x2 & 0xFF;

  176.     lcd_spi_transmit_cmd_para(0x2A, (void *)param, 4);

  177.     param[0] = (y1 >> 8) & 0xFF;
  178.     param[1] = y1 & 0xFF;
  179.     param[2] = (y2 >> 8) & 0xFF;
  180.     param[3] = y2 & 0xFF;

  181.     lcd_spi_transmit_cmd_para(0x2B, (void *)param, 4);
  182. }

  183. /**
  184. * @brief st7735s_spi_draw_point
  185. *
  186. * @param x
  187. * @param y
  188. * @param color
  189. */
  190. void st7735s_spi_draw_point(uint16_t x, uint16_t y, st7735s_spi_color_t color)
  191. {
  192.     /* set window */
  193.     st7735s_spi_set_draw_window(x, y, x, y);

  194.     lcd_spi_transmit_cmd_pixel_sync(0x2C, (void *)&color, 1);
  195. }

  196. /**
  197. * @brief st7735s_draw_area
  198. *
  199. * @param x1
  200. * @param y1
  201. * @param x2
  202. * @param y2
  203. * @param color
  204. */
  205. void st7735s_spi_draw_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t color)
  206. {
  207.     uint32_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);

  208.     /* set window */
  209.     st7735s_spi_set_draw_window(x1, y1, x2, y2);

  210.     lcd_spi_transmit_cmd_pixel_fill_sync(0x2C, (uint32_t)color, pixel_cnt);
  211. }

  212. /**
  213. * @brief st7735s_draw_picture_dma, Non-blocking! Using DMA acceleration, Not waiting for the draw end
  214. *  After the call, No other operations are allowed until (st7735s_draw_is_busy()==0)
  215. *
  216. * @param x1
  217. * @param y1
  218. * @param x2
  219. * @param y2
  220. * @param picture
  221. */
  222. void st7735s_spi_draw_picture_nonblocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture)
  223. {
  224.     size_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);

  225.     /* set window */
  226.     st7735s_spi_set_draw_window(x1, y1, x2, y2);

  227.     lcd_spi_transmit_cmd_pixel_async(0x2C, (void *)picture, pixel_cnt);
  228. }

  229. /**
  230. * @brief st7735s_draw_picture,Blocking,Using DMA acceleration,Waiting for the draw end
  231. *
  232. * @param x1
  233. * @param y1
  234. * @param x2
  235. * @param y2
  236. * @param picture
  237. */
  238. void st7735s_spi_draw_picture_blocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture)
  239. {
  240.     size_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);

  241.     /* set window */
  242.     st7735s_spi_set_draw_window(x1, y1, x2, y2);

  243.     lcd_spi_transmit_cmd_pixel_sync(0x2C, (void *)picture, pixel_cnt);
  244. }

  245. #endif
复制代码
aithinker_Ai-M6X_SDK\bsp\common\lcd\lcd.h中指定位置增加:

  1. #elif defined LCD_SPI_ST7735S

  2. #include "spi/st7735s_spi.h"
  3. #define LCD_INTERFACE_TYPE           LCD_INTERFACE_SPI
  4. #define LCD_W                        ST7735S_SPI_W
  5. #define LCD_H                        ST7735S_SPI_H
  6. #define LCD_COLOR_DEPTH              ST7735S_SPI_COLOR_DEPTH
  7. #define _LCD_FUNC_DEFINE(_func, ...) st7735s_spi_##_func(__VA_ARGS__)
复制代码

二、说明
1、proj.conf需做如下修改,启用SDK中的LCD模块
set(CONFIG_COMPONENT1 1)
set(CONFIG_BSP_LCD 1)
2、CMakeLists.txt,要加入
sdk_add_include_directories(.)
target_sources(app PRIVATE hzk.c)
编译时可以包含当前目录的.h,编译项目根目录的hzk.c
cmake_minimum_required(VERSION 3.15)

include(proj.conf)

find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})

sdk_add_include_directories(.)
target_sources(app PRIVATE hzk.c)
sdk_set_main_file(main.c)

project(gpio_input_output)


3、main.c 文件需要用VScode中报文为GB2312编码的文件。否则汉字部分无法正确显示。
微信图片_20240401092514.jpg
4、aithinker_Ai-M6X_SDK\bsp\common\CMakeLists.txt

新增:
target_sources(app PRIVATE lcd/spi/st7735s_spi.c)
保证st7735s_spi.c被编译。

5、共享下工程链接:
链接:https://pan.baidu.com/s/1V27W_s3Zb1U4dRiKxlLvyw?pwd=xgez
提取码:xgez

6、接线
M61_ST7735接线图.jpg

回复

使用道具 举报

干簧管 | 2024-4-1 09:19:53 | 显示全部楼层
还没编辑完整呢
回复 支持 反对

使用道具 举报

bzhou830 | 2024-4-1 09:39:57 | 显示全部楼层
选择去发光,而不是被照亮
回复

使用道具 举报

1084504793 | 2024-4-1 09:56:08 | 显示全部楼层
回复

使用道具 举报

曹县 | 2024-4-1 11:25:02 | 显示全部楼层
回复

使用道具 举报

曹县 | 2024-4-1 13:58:23 | 显示全部楼层
3211111111111111111111
回复 支持 反对

使用道具 举报

1055173307 | 2024-4-1 16:08:28 | 显示全部楼层
学习
回复

使用道具 举报

WT_0213 | 2024-4-2 08:51:48 | 显示全部楼层
回复

使用道具 举报

lovzx | 2024-4-2 09:12:07 | 显示全部楼层
学习
回复

使用道具 举报

lazy | 2024-4-2 11:56:36 | 显示全部楼层
非常棒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则