• BL808学习日志-2-LVGL for M0 and D0


    一、lvgl测试环境

            对拿到的M1S_DOCK开发板进行开发板测试,博流的官方SDK是支持M0和D0两个内核都进行测试的;但是目前只实现了M0的LVGLBenchmark,测试D0内核中发现很多莫名其妙的问题。一会详细记录。

            使用的是开发板自带的SPI显示屏,280*240分辨率。

    二、M0内核lvgl测试

            使用官方默认的SDK进行编译会报错缓存不够,按照下列方式修改SDK中的.ld内存分布文件

    /bouffalo_sdk/bsp/board/bl808dk/bl808_flash_m0.ld文件。主要目的就是修改ram_memory的大小,把ram_wifi的大小暂时调整为0,因为目前官方SDK无法启用无线功能。如果测试过程中卡住,就是ram_memory太小了,缓存不够使用了,调大即可。

    1. /****************************************************************************************
    2. * @file flash.ld
    3. *
    4. * @brief This file is the link script file (gnuarm or armgcc).
    5. *
    6. * Copyright (C) BouffaloLab 2021
    7. *
    8. ****************************************************************************************
    9. */
    10. /* configure the CPU type */
    11. OUTPUT_ARCH( "riscv" )
    12. /* configure the entry point */
    13. ENTRY(__start)
    14. StackSize = 0x0400; /* 1KB */
    15. HeapMinSize = 0x1000; /* 4KB */
    16. psram_min_size = 0x1000;
    17. __EM_SIZE = DEFINED(btble_controller_init) ? 32K : 0K;
    18. MEMORY
    19. {
    20. fw_header_memory (rx) : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4K
    21. xip_memory (rx) : ORIGIN = 0x58000000, LENGTH = 32M
    22. ram_psram (wxa) : ORIGIN = 0x50000000, LENGTH = 64M
    23. itcm_memory (rx) : ORIGIN = 0x62020000, LENGTH = 32K
    24. dtcm_memory (rx) : ORIGIN = 0x62028000, LENGTH = 16K
    25. nocache_ram_memory (!rx) : ORIGIN = 0x2202C000, LENGTH = 16K
    26. ram_memory (!rx) : ORIGIN = 0x62038000, LENGTH = 128K
    27. ram_wifi (wxa) : ORIGIN = 0x22058000, LENGTH = 0K
    28. xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
    29. }
    30. SECTIONS
    31. {
    32. .fw_header :
    33. {
    34. KEEP(*(.fw_header))
    35. } > fw_header_memory
    36. .init :
    37. {
    38. KEEP (*(SORT_NONE(.init)))
    39. KEEP (*(SORT_NONE(.vector)))
    40. } > xip_memory
    41. .text :
    42. {
    43. . = ALIGN(4);
    44. __text_code_start__ = .;
    45. *(.text)
    46. *(.text.*)
    47. /* section information for shell */
    48. . = ALIGN(4);
    49. __fsymtab_start = .;
    50. KEEP(*(FSymTab))
    51. __fsymtab_end = .;
    52. . = ALIGN(4);
    53. __vsymtab_start = .;
    54. KEEP(*(VSymTab))
    55. __vsymtab_end = .;
    56. /* section information for usb usbh_class_info */
    57. . = ALIGN(4);
    58. __usbh_class_info_start__ = .;
    59. KEEP(*(.usbh_class_info))
    60. . = ALIGN(4);
    61. __usbh_class_info_end__ = .;
    62. /*put .rodata**/
    63. *(EXCLUDE_FILE( *bl808_glb*.o* \
    64. *bl808_glb_gpio*.o* \
    65. *bl808_pds*.o* \
    66. *bl808_aon*.o* \
    67. *bl808_hbn*.o* \
    68. *bl808_l1c*.o* \
    69. *bl808_common*.o* \
    70. *bl808_clock*.o* \
    71. *bl808_ef_ctrl*.o* \
    72. *bl808_sf_cfg*.o* \
    73. *bl808_sf_ctrl*.o* \
    74. *bl808_sflash*.o* \
    75. *bl808_xip_sflash*.o* \
    76. *bl808_romapi_patch*.o* ) .rodata*)
    77. *(.srodata)
    78. *(.srodata.*)
    79. . = ALIGN(4);
    80. __text_code_end__ = .;
    81. } > xip_memory
    82. . = ALIGN(4);
    83. __itcm_load_addr = .;
    84. .itcm_region : AT (__itcm_load_addr)
    85. {
    86. . = ALIGN(4);
    87. __tcm_code_start__ = .;
    88. *(.tcm_code.*)
    89. *(.tcm_const.*)
    90. *(.sclock_rlt_code.*)
    91. *(.sclock_rlt_const.*)
    92. *bl808_glb*.o*(.rodata*)
    93. *bl808_glb_gpio*.o*(.rodata*)
    94. *bl808_pds*.o*(.rodata*)
    95. *bl808_aon*.o*(.rodata*)
    96. *bl808_hbn*.o*(.rodata*)
    97. *bl808_l1c*.o*(.rodata*)
    98. *bl808_common*.o*(.rodata*)
    99. *bl808_clock*.o*(.rodata*)
    100. *bl808_ef_ctrl*.o*(.rodata*)
    101. *bl808_sf_cfg*.o*(.rodata*)
    102. *bl808_sf_ctrl*.o*(.rodata*)
    103. *bl808_sflash*.o*(.rodata*)
    104. *bl808_xip_sflash*.o*(.rodata*)
    105. *bl808_romapi_patch*.o*(.rodata*)
    106. . = ALIGN(4);
    107. __tcm_code_end__ = .;
    108. } > itcm_memory
    109. __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
    110. .dtcm_region : AT (__dtcm_load_addr)
    111. {
    112. . = ALIGN(4);
    113. __tcm_data_start__ = .;
    114. *(.tcm_data)
    115. /* *finger_print.o(.data*) */
    116. . = ALIGN(4);
    117. __tcm_data_end__ = .;
    118. } > dtcm_memory
    119. /*************************************************************************/
    120. /* .stack_dummy section doesn't contains any symbols. It is only
    121. * used for linker to calculate size of stack sections, and assign
    122. * values to stack symbols later */
    123. .stack_dummy (NOLOAD):
    124. {
    125. . = ALIGN(0x4);
    126. . = . + StackSize;
    127. . = ALIGN(0x4);
    128. } > dtcm_memory
    129. /* Set stack top to end of RAM, and stack limit move down by
    130. * size of stack_dummy section */
    131. __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
    132. PROVIDE( __freertos_irq_stack_top = __StackTop);
    133. __StackLimit = __StackTop - SIZEOF(.stack_dummy);
    134. /* Check if data + heap + stack exceeds RAM limit */
    135. ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
    136. /*************************************************************************/
    137. __nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region);
    138. .nocache_ram_region : AT (__nocache_ram_load_addr)
    139. {
    140. . = ALIGN(4);
    141. __nocache_ram_data_start__ = .;
    142. *(.nocache_ram)
    143. . = ALIGN(4);
    144. __nocache_ram_data_end__ = .;
    145. } > nocache_ram_memory
    146. __ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region);
    147. /* Data section */
    148. RAM_DATA : AT (__ram_load_addr)
    149. {
    150. . = ALIGN(4);
    151. __ram_data_start__ = .;
    152. PROVIDE( __global_pointer$ = . + 0x800 );
    153. *(.data)
    154. *(.data.*)
    155. *(.sdata)
    156. *(.sdata.*)
    157. *(.sdata2)
    158. *(.sdata2.*)
    159. . = ALIGN(4);
    160. __bflog_tags_start__ = .;
    161. *(.bflog_tags_array)
    162. . = ALIGN(4);
    163. __bflog_tags_end__ = .;
    164. __ram_data_end__ = .;
    165. } > ram_memory
    166. __psram_load_addr = (__ram_load_addr + SIZEOF (RAM_DATA));
    167. .psram_data_region : AT (__psram_load_addr)
    168. {
    169. . = ALIGN(4);
    170. __psram_data_start__ = .;
    171. KEEP(*(.psram_data*))
    172. . = ALIGN(4);
    173. __psram_data_end__ = .;
    174. } > ram_psram
    175. __etext_final = (__psram_load_addr + SIZEOF (.psram_data_region));
    176. ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow")
    177. .bss (NOLOAD) :
    178. {
    179. . = ALIGN(4);
    180. __bss_start__ = .;
    181. *(.bss*)
    182. *(.sbss*)
    183. *(COMMON)
    184. . = ALIGN(4);
    185. __bss_end__ = .;
    186. } > ram_memory
    187. .noinit_data (NOLOAD) :
    188. {
    189. . = ALIGN(4);
    190. __noinit_data_start__ = .;
    191. *(.noinit_data*)
    192. . = ALIGN(4);
    193. __noinit_data_end__ = .;
    194. } > ram_memory
    195. .nocache_noinit_ram_region (NOLOAD) :
    196. {
    197. . = ALIGN(4);
    198. __nocache_noinit_ram_data_start__ = .;
    199. *(.nocache_noinit_ram)
    200. *(.noncacheable)
    201. . = ALIGN(4);
    202. __nocache_noinit_ram_data_end__ = .;
    203. } > nocache_ram_memory
    204. .heap (NOLOAD):
    205. {
    206. . = ALIGN(4);
    207. __HeapBase = .;
    208. /*__end__ = .;*/
    209. /*end = __end__;*/
    210. KEEP(*(.heap*))
    211. . = ALIGN(4);
    212. __HeapLimit = .;
    213. } > ram_memory
    214. __HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory);
    215. ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow")
    216. .psram_noinit_data (NOLOAD):
    217. {
    218. . = ALIGN(4);
    219. __psram_noinit_data_start__ = .;
    220. KEEP(*(.psram_noinit*))
    221. . = ALIGN(4);
    222. __psram_noinit_data_end__ = .;
    223. } > ram_psram
    224. .psram_heap (NOLOAD):
    225. {
    226. . = ALIGN(4);
    227. __psram_heap_base = .;
    228. KEEP(*(.psram_heap*))
    229. . = ALIGN(4);
    230. __psram_heap_end = .;
    231. } > ram_psram
    232. __psram_limit = ORIGIN(ram_psram) + LENGTH(ram_psram);
    233. ASSERT(__psram_limit - __psram_heap_base >= psram_min_size, "psram heap region overflow")
    234. .wifibss (NOLOAD) :
    235. {
    236. PROVIDE( __wifi_bss_start = ADDR(.wifibss) );
    237. PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) );
    238. *ipc_shared.o(COMMON)
    239. *sdu_shared.o(COMMON)
    240. *hal_desc.o(COMMON)
    241. *txl_buffer_shared.o(COMMON)
    242. *txl_frame_shared.o(COMMON)
    243. *scan_shared.o(COMMON)
    244. *scanu_shared.o(COMMON)
    245. *mfp_bip.o(COMMON)
    246. *me_mic.o(COMMON)
    247. *bl_sta_mgmt_others.o(COMMON)
    248. *bl_pmk_mgmt.o(COMMON)
    249. *bl_pmk_mgmt_internal.o(COMMON)
    250. *libwifi_drv.a:bl_utils.o(COMMON)
    251. *libwifi_drv.a:bl_utils.o(.bss*)
    252. *(.wifi_ram*)
    253. . = ALIGN(16);
    254. } > ram_wifi
    255. PROVIDE(__LD_CONFIG_EM_SEL = __EM_SIZE);
    256. }

            修改完成后最好把LP内核的内存分布文件也修改一下。这里引申出一个问题,就是内存的分布肯定是LP和M0内核共享OCRAM+WRAM,但是不知道两个内核的itcm_memory 和dtcm_memory的大小是不是要按照规格书改成32K+16K,官方默认的大小是20K+4K,搞不懂是什么用意。而且两个内核的部分区域在官方SDK中竟然重叠了,好奇怪。对于初学者来说,实在是头大,官方也没有任何说明。

            这里直接贴图一个成绩。

    1. ____ __ __ _ _ _
    2. | _ \ / _|/ _| | | | | | |
    3. | |_) | ___ _ _| |_| |_ __ _| | ___ | | __ _| |__
    4. | _ < / _ \| | | | _| _/ _` | |/ _ \| |/ _` | '_ \
    5. | |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) |
    6. |____/ \___/ \__,_|_| |_| \__,_|_|\___/|_|\__,_|_.__/
    7. Build:10:29:32,Oct 4 2023
    8. Copyright (c) 2022 Bouffalolab team
    9. ======== flash cfg ========
    10. flash size 0x01000000
    11. jedec id 0xEF4018
    12. mid 0xEF
    13. iomode 0x04
    14. clk delay 0x01
    15. clk invert 0x01
    16. read reg cmd0 0x05
    17. read reg cmd1 0x35
    18. write reg cmd0 0x01
    19. write reg cmd1 0x31
    20. qe write len 0x01
    21. cread support 0x00
    22. cread code 0xFF
    23. burst wrap cmd 0x77
    24. ===========================
    25. dynamic memory init success,heap size = 86 Kbyte
    26. sig1:ffff32ff
    27. sig2:0000ffff
    28. lvgl case
    29. lvgl success
    30. [LVGL]
    31. LVGL v8.3.7 Benchmark (in csv format)
    32. [LVGL] Weighted FPS: 67
    33. [LVGL] Opa. speed: 97%
    34. [LVGL] Text small,19
    35. [LVGL] Text small + opa,[LVGL] 19
    36. [LVGL] Text medium,19
    37. [LVGL] Text medium + opa,[LVGL] 19
    38. [LVGL] Text large,19
    39. [LVGL] Text large + opa,[LVGL] 19
    40. [LVGL] Text large compressed,16
    41. [LVGL] Substr. shadow,19
    42. [LVGL] Substr. text,15
    43. [LVGL] Rectangle,60
    44. [LVGL] Rectangle + opa,[LVGL] 57
    45. [LVGL] Rectangle rounded,53
    46. [LVGL] Rectangle rounded + opa,[LVGL] 52
    47. [LVGL] Circle,49
    48. [LVGL] Circle + opa,[LVGL] 48
    49. [LVGL] Border,59
    50. [LVGL] Border + opa,[LVGL] 59
    51. [LVGL] Border rounded,52
    52. [LVGL] Border rounded + opa,[LVGL] 52
    53. [LVGL] Circle border,46
    54. [LVGL] Circle border + opa,[LVGL] 46
    55. [LVGL] Border top,54
    56. [LVGL] Border top + opa,[LVGL] 54
    57. [LVGL] Border left,54
    58. [LVGL] Border left + opa,[LVGL] 54
    59. [LVGL] Border top + left,53
    60. [LVGL] Border top + left + opa,[LVGL] 52
    61. [LVGL] Border left + right,53
    62. [LVGL] Border left + right + opa,[LVGL] 52
    63. [LVGL] Border top + bottom,52
    64. [LVGL] Border top + bottom + opa,[LVGL] 53
    65. [LVGL] Shadow small,40
    66. [LVGL] Shadow small + opa,[LVGL] 39
    67. [LVGL] Shadow small offset,35
    68. [LVGL] Shadow small offset + opa,[LVGL] 35
    69. [LVGL] Shadow large,26
    70. [LVGL] Shadow large + opa,[LVGL] 25
    71. [LVGL] Shadow large offset,27
    72. [LVGL] Shadow large offset + opa,[LVGL] 28
    73. [LVGL] Image RGB,170
    74. [LVGL] Image RGB + opa,[LVGL] 180
    75. [LVGL] Image ARGB,161
    76. [LVGL] Image ARGB + opa,[LVGL] 154
    77. [LVGL] Image chorma keyed,165
    78. [LVGL] Image chorma keyed + opa,[LVGL] 164
    79. [LVGL] Image indexed,150
    80. [LVGL] Image indexed + opa,[LVGL] 151
    81. [LVGL] Image alpha only,158
    82. [LVGL] Image alpha only + opa,[LVGL] 150
    83. [LVGL] Image RGB recolor,156
    84. [LVGL] Image RGB recolor + opa,[LVGL] 150
    85. [LVGL] Image ARGB recolor,142
    86. [LVGL] Image ARGB recolor + opa,[LVGL] 141
    87. [LVGL] Image chorma keyed recolor,151
    88. [LVGL] Image chorma keyed recolor + opa,[LVGL] 142
    89. [LVGL] Image indexed recolor,144
    90. [LVGL] Image indexed recolor + opa,[LVGL] 143
    91. [LVGL] Image RGB rotate,118
    92. [LVGL] Image RGB rotate + opa,[LVGL] 118
    93. [LVGL] Image RGB rotate anti aliased,100
    94. [LVGL] Image RGB rotate anti aliased + opa,[LVGL] 96
    95. [LVGL] Image ARGB rotate,114
    96. [LVGL] Image ARGB rotate + opa,[LVGL] 112
    97. [LVGL] Image ARGB rotate anti aliased,86
    98. [LVGL] Image ARGB rotate anti aliased + opa,[LVGL] 86
    99. [LVGL] Image RGB zoom,125
    100. [LVGL] Image RGB zoom + opa,[LVGL] 121
    101. [LVGL] Image RGB zoom anti aliased,108
    102. [LVGL] Image RGB zoom anti aliased + opa,[LVGL] 107
    103. [LVGL] Image ARGB zoom,118
    104. [LVGL] Image ARGB zoom + opa,[LVGL] 120
    105. [LVGL] Image ARGB zoom anti aliased,97
    106. [LVGL] Image ARGB zoom anti aliased + opa,[LVGL] 98
    107. [LVGL] Text small,19
    108. [LVGL] Text small + opa,[LVGL] 19
    109. [LVGL] Text medium,19
    110. [LVGL] Text medium + opa,[LVGL] 19
    111. [LVGL] Text large,19
    112. [LVGL] Text large + opa,[LVGL] 19
    113. [LVGL] Text small compressed,18
    114. [LVGL] Text small compressed + opa,[LVGL] 18
    115. [LVGL] Text medium compressed,17
    116. [LVGL] Text medium compressed + opa,[LVGL] 17
    117. [LVGL] Text large compressed,16
    118. [LVGL] Text large compressed + opa,[LVGL] 16
    119. [LVGL] Line,53
    120. [LVGL] Line + opa,[LVGL] 54
    121. [LVGL] Arc think,44
    122. [LVGL] Arc think + opa,[LVGL] 43
    123. [LVGL] Arc thick,44
    124. [LVGL] Arc thick + opa,[LVGL] 43
    125. [LVGL] Substr. rectangle,36
    126. [LVGL] Substr. rectangle + opa,[LVGL] 36
    127. [LVGL] Substr. border,37
    128. [LVGL] Substr. border + opa,[LVGL] 37
    129. [LVGL] Substr. shadow,19
    130. [LVGL] Substr. shadow + opa,[LVGL] 19
    131. [LVGL] Substr. image,125
    132. [LVGL] Substr. image + opa,[LVGL] 126
    133. [LVGL] Substr. line,33
    134. [LVGL] Substr. line + opa,[LVGL] 33
    135. [LVGL] Substr. arc,42
    136. [LVGL] Substr. arc + opa,[LVGL] 42
    137. [LVGL] Substr. text,15
    138. [LVGL] Substr. text + opa,[LVGL] 15

    三、D0内核调试挖坑!!!

            测试D0内核花费了3天时间也没搞定,总是进入初始化以后,直接就卡屏卡死了。因为在假期,没带DEBUG工具,只能随便打点测试了一下;

            1.SPI1无法启用

    按照官方SDK进行测试,发现根本没有使用SPI1,而且在lcd_spi_hard_4_init(lcd_spi_hard_4_init_t *dbi_parra)初始化过程中,spi_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_NAME);得到的是spi0。。。

    1. int lcd_spi_hard_4_init(lcd_spi_hard_4_init_t *dbi_parra)
    2. {
    3. /* spi */
    4. struct bflb_spi_config_s spi_cfg = {
    5. .freq = dbi_parra->clock_freq,
    6. .role = SPI_ROLE_MASTER,
    7. .mode = SPI_MODE3,
    8. .data_width = SPI_DATA_WIDTH_8BIT,
    9. .bit_order = SPI_BIT_MSB,
    10. .byte_order = SPI_BYTE_LSB,
    11. .tx_fifo_threshold = 0,
    12. .rx_fifo_threshold = 0,
    13. };
    14. /* dma cfg */
    15. struct bflb_dma_channel_config_s dma_spi_tx_cfg = {
    16. .direction = DMA_MEMORY_TO_PERIPH,
    17. .src_req = DMA_REQUEST_NONE,
    18. .dst_req = DMA_REQUEST_SPI0_TX,
    19. .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE,
    20. .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE,
    21. .src_burst_count = DMA_BURST_INCR4,
    22. .dst_burst_count = DMA_BURST_INCR4,
    23. .src_width = DMA_DATA_WIDTH_16BIT,
    24. .dst_width = DMA_DATA_WIDTH_16BIT,
    25. };
    26. pixel_format = dbi_parra->pixel_format;
    27. #if (SPI_FIFO_WIDTH_VARIABLE_SUPPORT)
    28. /* SPI support burst*4 */
    29. spi_cfg.tx_fifo_threshold = (2 * 4 - 1);
    30. spi_cfg.rx_fifo_threshold = (2 * 4 - 1);
    31. spi_cfg.byte_order = SPI_BYTE_MSB;
    32. #elif
    33. spi_cfg.tx_fifo_threshold = 4 - 1;
    34. spi_cfg.rx_fifo_threshold = 4 - 1;
    35. #endif
    36. spi_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_NAME);
    37. /* CS and DC pin init */
    38. gpio = bflb_device_get_by_name("gpio");
    39. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CS, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
    40. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DC, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
    41. LCD_SPI_HARD_4_CS_HIGH;
    42. LCD_SPI_HARD_4_DC_HIGH;
    43. if (spi_hd->idx == 0) {
    44. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CLK, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);
    45. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DAT, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);
    46. }
    47. #if defined(GPIO_FUNC_SPI1)
    48. else if (spi_hd->idx == 1) {
    49. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CLK, GPIO_FUNC_SPI1 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);
    50. bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DAT, GPIO_FUNC_SPI1 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);
    51. }
    52. #endif
    53. /* spi init */
    54. bflb_spi_init(spi_hd, &spi_cfg);
    55. /* spi enabled continuous mode */
    56. // bflb_spi_feature_control(spi_hd, SPI_CMD_SET_CS_INTERVAL, true);
    57. if (pixel_format == LCD_SPI_LCD_PIXEL_FORMAT_RGB565) {
    58. dma_spi_tx_cfg.src_width = DMA_DATA_WIDTH_16BIT;
    59. dma_spi_tx_cfg.dst_width = DMA_DATA_WIDTH_16BIT;
    60. }
    61. if (spi_hd->idx == 0) {
    62. dma_spi_tx_cfg.dst_req = DMA_REQUEST_SPI0_TX;
    63. spi_tx_fifo_address = DMA_ADDR_SPI0_TDR;
    64. }
    65. #if defined(DMA_REQUEST_SPI1_TX)
    66. else if (spi_hd->idx == 1) {
    67. dma_spi_tx_cfg.dst_req = DMA_REQUEST_SPI1_TX;
    68. spi_tx_fifo_address = DMA_ADDR_SPI1_TDR;
    69. }
    70. #endif
    71. /* dma init */
    72. spi_dma_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_DMA_NAME);
    73. bflb_dma_channel_init(spi_dma_hd, &dma_spi_tx_cfg);
    74. /* dma int cfg */
    75. bflb_dma_channel_irq_attach(spi_dma_hd, spi_dma_callback, NULL);
    76. return 0;
    77. }

    按照device_table.c文件中,竟然没有规定spi1..........,也没有规定DMA2的对应0-7个通道,但是却规定了DMA0的0-7个通道,官方datasheet中DMA0和DMA1只有一个通道。8个通道的寄存器基地址都是DMA0_BASE(  #define DMA0_BASE ((uint32_t)0x2000c000)),在else这个分支里面竟然中断号都是0XFF,真是被这SDK搞懵了。看这样子好像官方并不想让使用spi1来使用?????这个问题等待后续解决。

    1. { .name = "spi0",
    2. .reg_base = SPI0_BASE,
    3. #if defined(CPU_M0) || defined(CPU_LP)
    4. .irq_num = BL808_IRQ_SPI0,
    5. #else
    6. .irq_num = 0xff,
    7. #endif
    8. .idx = 0,
    9. .dev_type = BFLB_DEVICE_TYPE_SPI,
    10. .user_data = NULL
    11. },
    12. { .name = "dma0_ch0",
    13. .reg_base = DMA0_BASE + 1 * DMA_CHANNEL_OFFSET,
    14. #if defined(CPU_M0) || defined(CPU_LP)
    15. .irq_num = BL808_IRQ_DMA0_ALL,
    16. #else
    17. .irq_num = 0xff,
    18. #endif
    19. .idx = 0,
    20. .sub_idx = 0,
    21. .dev_type = BFLB_DEVICE_TYPE_DMA,
    22. .user_data = NULL
    23. },

            2.补充一个使用M1S_DOCK_SDK测试出的D0内核的数据,大概是M0内核的2-2.5倍性能,好像也符合coremark的分数。大概是DMA速度不同吧。

    1. [LVGL]
    2. LVGL v8.3.1 Benchmark (in csv format)
    3. [LVGL] Weighted FPS: 146
    4. [LVGL] Opa. speed: 93%
    5. [LVGL] Rectangle,97
    6. [LVGL] Rectangle + opa,[LVGL] 95
    7. [LVGL] Rectangle rounded,96
    8. [LVGL] Rectangle rounded + opa,[LVGL] 91
    9. [LVGL] Circle,95
    10. [LVGL] Circle + opa,[LVGL] 85
    11. [LVGL] Border,101
    12. [LVGL] Border + opa,[LVGL] 99
    13. [LVGL] Border rounded,96
    14. [LVGL] Border rounded + opa,[LVGL] 95
    15. [LVGL] Circle border,90
    16. [LVGL] Circle border + opa,[LVGL] 90
    17. [LVGL] Border top,98
    18. [LVGL] Border top + opa,[LVGL] 97
    19. [LVGL] Border left,97
    20. [LVGL] Border left + opa,[LVGL] 98
    21. [LVGL] Border top + left,96
    22. [LVGL] Border top + left + opa,[LVGL] 96
    23. [LVGL] Border left + right,96
    24. [LVGL] Border left + right + opa,[LVGL] 95
    25. [LVGL] Border top + bottom,96
    26. [LVGL] Border top + bottom + opa,[LVGL] 96
    27. [LVGL] Shadow small,76
    28. [LVGL] Shadow small + opa,[LVGL] 76
    29. [LVGL] Shadow small offset,66
    30. [LVGL] Shadow small offset + opa,[LVGL] 65
    31. [LVGL] Shadow large,42
    32. [LVGL] Shadow large + opa,[LVGL] 43
    33. [LVGL] Shadow large offset,45
    34. [LVGL] Shadow large offset + opa,[LVGL] 44
    35. [LVGL] Image RGB,418
    36. [LVGL] Image RGB + opa,[LVGL] 388
    37. [LVGL] Image ARGB,418
    38. [LVGL] Image ARGB + opa,[LVGL] 390
    39. [LVGL] Image chorma keyed,415
    40. [LVGL] Image chorma keyed + opa,[LVGL] 388
    41. [LVGL] Image indexed,368
    42. [LVGL] Image indexed + opa,[LVGL] 333
    43. [LVGL] Image alpha only,362
    44. [LVGL] Image alpha only + opa,[LVGL] 328
    45. [LVGL] Image RGB recolor,382
    46. [LVGL] Image RGB recolor + opa,[LVGL] 318
    47. [LVGL] Image ARGB recolor,345
    48. [LVGL] Image ARGB recolor + opa,[LVGL] 322
    49. [LVGL] Image chorma keyed recolor,370
    50. [LVGL] Image chorma keyed recolor + opa,[LVGL] 331
    51. [LVGL] Image indexed recolor,320
    52. [LVGL] Image indexed recolor + opa,[LVGL] 288
    53. [LVGL] Image RGB rotate,264
    54. [LVGL] Image RGB rotate + opa,[LVGL] 225
    55. [LVGL] Image RGB rotate anti aliased,187
    56. [LVGL] Image RGB rotate anti aliased + opa,[LVGL] 170
    57. [LVGL] Image ARGB rotate,263
    58. [LVGL] Image ARGB rotate + opa,[LVGL] 226
    59. [LVGL] Image ARGB rotate anti aliased,178
    60. [LVGL] Image ARGB rotate anti aliased + opa,[LVGL] 167
    61. [LVGL] Image RGB zoom,284
    62. [LVGL] Image RGB zoom + opa,[LVGL] 253
    63. [LVGL] Image RGB zoom anti aliased,220
    64. [LVGL] Image RGB zoom anti aliased + opa,[LVGL] 196
    65. [LVGL] Image ARGB zoom,276
    66. [LVGL] Image ARGB zoom + opa,[LVGL] 267
    67. [LVGL] Image ARGB zoom anti aliased,196
    68. [LVGL] Image ARGB zoom anti aliased + opa,[LVGL] 190
    69. [LVGL] Text small,49
    70. [LVGL] Text small + opa,[LVGL] 51
    71. [LVGL] Text medium,48
    72. [LVGL] Text medium + opa,[LVGL] 50
    73. [LVGL] Text large,49
    74. [LVGL] Text large + opa,[LVGL] 50
    75. [LVGL] Text small compressed,39
    76. [LVGL] Text small compressed + opa,[LVGL] 40
    77. [LVGL] Text medium compressed,38
    78. [LVGL] Text medium compressed + opa,[LVGL] 37
    79. [LVGL] Text large compressed,32
    80. [LVGL] Text large compressed + opa,[LVGL] 33
    81. [LVGL] Line,99
    82. [LVGL] Line + opa,[LVGL] 100
    83. [LVGL] Arc think,87
    84. [LVGL] Arc think + opa,[LVGL] 87
    85. [LVGL] Arc thick,87
    86. [LVGL] Arc thick + opa,[LVGL] 86
    87. [LVGL] Substr. rectangle,85
    88. [LVGL] Substr. rectangle + opa,[LVGL] 76
    89. [LVGL] Substr. border,86
    90. [LVGL] Substr. border + opa,[LVGL] 86
    91. [LVGL] Substr. shadow,44
    92. [LVGL] Substr. shadow + opa,[LVGL] 43
    93. [LVGL] Substr. image,288
    94. [LVGL] Substr. image + opa,[LVGL] 288
    95. [LVGL] Substr. line,78
    96. [LVGL] Substr. line + opa,[LVGL] 80
    97. [LVGL] Substr. arc,86
    98. [LVGL] Substr. arc + opa,[LVGL] 86
    99. [LVGL] Substr. text,38
    100. [LVGL] Substr. text + opa,[LVGL] 38

     

     四、引申出来的RAM分配问题

            下面贴一下官方的SDK中定义的分配方案,看的我脑袋大,有点看不懂能不能这样使用,或者是这样使用会不会出现冲突。(0x62020000的意思是使用chache访问,和直接访问0x2202000是一个意思,但是nocache_ram_memory区域必须使用0x22034000直接访问,不能使用cache访问)。

            1.M0的ram_memory区域,ram_memory  (!rx) : ORIGIN = 0x6202A000, LENGTH = 24K,也就是0x2202A000-0x2203000,但是LP内核的itcm_memory (rx)  : ORIGIN = 0x2202C000, LENGTH = 16K,也就是0x2202C000-0x2203000;

            2.LP内核区域的dtcm_memory (rx)  : ORIGIN = 0x22030000, LENGTH = 16K和M0内核的ram_wifi  (wxa)   : ORIGIN = 0x22030000, LENGTH = 160K - __EM_SIZE冲突,虽然LP内核内部没有cache功能,但是也好奇怪为什么还会划分idata和ddata这两个区域。

            3.我自己曾经尝试过按照不冲突的RAM地址升序顺序和严格按照手册所写的itcm和dtcm大小进行内存划分,没有发现明显区别,coremark和lvgl都没有任何提升。看看后续如何理解这个问题和解决问题。

    1. LP-MEMORY
    2. {
    3. fw_header_memory (rx) : ORIGIN = 0x58020000 - 0x1000, LENGTH = 4K
    4. xip_memory (rx) : ORIGIN = 0x58020000, LENGTH = 1M
    5. itcm_memory (rx) : ORIGIN = 0x2202C000, LENGTH = 16K
    6. dtcm_memory (rx) : ORIGIN = 0x22030000, LENGTH = 16K
    7. nocache_ram_memory (!rx) : ORIGIN = 0x22030000, LENGTH = 0K
    8. ram_memory (!rx) : ORIGIN = 0x22034000, LENGTH = 16K
    9. xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
    10. }
    11. M0-MEMORY
    12. {
    13. fw_header_memory (rx) : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4K
    14. xip_memory (rx) : ORIGIN = 0x58000000, LENGTH = 32M
    15. ram_psram (wxa) : ORIGIN = 0x50000000, LENGTH = 64M
    16. itcm_memory (rx) : ORIGIN = 0x62020000, LENGTH = 20K
    17. dtcm_memory (rx) : ORIGIN = 0x62025000, LENGTH = 4K
    18. nocache_ram_memory (!rx) : ORIGIN = 0x22026000, LENGTH = 16K
    19. ram_memory (!rx) : ORIGIN = 0x6202A000, LENGTH = 24K
    20. ram_wifi (wxa) : ORIGIN = 0x22030000, LENGTH = 160K - __EM_SIZE
    21. xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
    22. }
    23. D0-MEMORY
    24. {
    25. fw_header_memory (rx) : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4K
    26. xip_memory (rx) : ORIGIN = 0x58000000, LENGTH = 32M
    27. itcm_memory (rx) : ORIGIN = 0x3eff0000, LENGTH = 28K
    28. dtcm_memory (rx) : ORIGIN = 0x3eff7000, LENGTH = 4K
    29. nocache_ram_memory (!rx) : ORIGIN = 0x3eff8000, LENGTH = 0K
    30. ram_memory (!rx) : ORIGIN = 0x3eff8000, LENGTH = 32K + 32K
    31. xram_memory (!rx) : ORIGIN = 0x40004000, LENGTH = 16K
    32. }

            还是希望官方能够多给点文档看啊,linux下的M1S_DOCK_SDK好像就有很多正常的功能寄存器,还有库文件,我看文件抬头都是博流写的,真的是无语了。

            后续还是在Linux下使用M1S_DOCK_SDK开发吧,官方的库我实在是搞不懂。浪费精力。

  • 相关阅读:
    【LeetCode】25. 542_01 Matrix · 01矩阵
    react 实战- 玩转 react 全家桶(进阶)学习
    先序遍历序列+中序遍历序列构建二叉树
    Windows Phone 模拟器 (WPR Alpha 0.0.1 WP7/8模拟器) XAP XNA文件使用教程
    使用yolov5训练自己的目标检测模型
    2015软专算法题T1(无向图树)
    How to Debug the Eclipse C/C++ Indexer
    开发者涨薪指南:提升软、硬实力
    LeetCode刷题---无重复字符的最长子串
    【无标题】
  • 原文地址:https://blog.csdn.net/DINGDING_GO/article/details/133562696