【NUCLEO-L552ZE测评】-2: Stay in TrustZone
<div class='showpostmsg'> 本帖最后由 MianQi 于 2020-12-29 10:53 编辑<p>上一个帖子里说到,按照教程里的步骤设置完以后,看不到EXTI Line 13,看到的是14。这个问题的解决办法是在“Pinout view”里设置一下:</p>
<p> </p>
<p></p>
<p> </p>
<p>但接下来还有问题——在外部中断13(也包括14)的右边勾选框里,却不能选中,但在下方的图例中却有提示——灰色标示“Enabled”:</p>
<p></p>
<p> </p>
<p>既然是这样,不妨继续往下走,生成的工程代码是这样(看左上角):</p>
<p></p>
<p> </p>
<p>教程(https://www.stmcu.com.cn/ecosystem/chip/chipfamily-STM32L5-4)里的设想是这样:</p>
<p>1、PC7(绿色LED)和 PB7(蓝色LED)作为指示灯分别设置到S(安全)和NS(非安全)区域;</p>
<p>2、PC13(蓝色的用户按键开关)作为外部中断的接入口;</p>
<p>3、PG7和PG8分别作为LPUART1的TX和RX,用来实现PC与mcu的交互。设在NS非安全区;</p>
<p>4、在安全和非安全区的中断服务子程序(EXTI_ISR()中设置同一段代码——翻转蓝绿两个LED。</p>
<p>实际要看到的效果是:默认的情况下,EXTI 13的中断指向安全区,但是,通过API调用Secure代码,可以重置EXTI 13的指向——安全区或者非安全区的NVIC。这样,就能观察到,安全区内的EXTI_ISR()对两个灯都有效,而非安全区,仅对一个灯有效。</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>谢谢分享!期待后续评测!</p>
本帖最后由 MianQi 于 2020-12-31 17:32 编辑
<p>“项目配置代码生成”按键在这里:(左上角)</p>
<p></p>
<p>生成的项目文件树是这样:</p>
<p></p>
<p>注意:安全区比非安全区多了一个文件:secure_nsc.c</p>
<p> </p>
<p>按照教程(https://www.stmcu.com.cn/ecosystem/chip/chipfamily-STM32L5-4)里的说明:在S(安全)区和NS(非安全)区分别做两项工作:</p>
<p>安全区:MX_MX_GPIO_Init() 和 MX_GTZC_Init()</p>
<p>非安全区:MX_MX_GPIO_Init() 和 MX_LPUART1_UART_Init()</p>
<p>在S和 NS区各自添加两段代码:第一段代码是相同的,都是“EXTI.13_ISR”,位置都在main.c的这里:</p>
<p>/* USER CODE BEGIN 4 */</p>
<p>/* USER CODE END 4 */</p>
<p>代码的内容是:</p>
<p>void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)</p>
<p>{</p>
<p>UNUSED(GPIO_Pin);</p>
<p>HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);</p>
<p>HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);</p>
<p>}</p>
<p><br />
</p>
<p>第二段代码,S区的内容是:</p>
<p>CMSE_NS_ENTRY void SECURE_RetargetISR(uint8_t flag)</p>
<p>{</p>
<p>if (flag == 0x31)</p>
<p>{</p>
<p>NVIC_DisableIRQ (EXTI13_IRQn);</p>
<p>HAL_EXTI_ConfigLineAttributes(EXTI_LINE_13, EXTI_LINE_NSEC);</p>
<p>NVIC_SetTargetState (EXTI13_IRQn);</p>
<p>NVIC_EnableIRQ (EXTI13_IRQn);</p>
<p>}</p>
<p>else if (flag == 0x30)</p>
<p>{</p>
<p>NVIC_DisableIRQ(EXTI13_IRQn);</p>
<p>HAL_EXTI_ConfigLineAttributes (EXTI_LINE_13, EXTI_LINE_SEC);</p>
<p>NVIC_ClearTargetState (EXTI13_IRQn);</p>
<p>NVIC_EnableIRQ (EXTI13_IRQn);</p>
<p>}</p>
<p>}</p>
<p>目的是:实现供NS调用的切换EXTI.13 target函数。位置在secure_nsc.c里。</p>
<p><br />
</p>
<p>NS区的内容是:</p>
<p>while (HAL_UART_Receive (&hlpuart1, &InputChar, 1, 1000) == HAL_OK)</p>
<p>{</p>
<p>if (InputChar != Status)</p>
<p>{</p>
<p>if (InputChar == 0x30)</p>
<p>HAL_UART_Transmit (&hlpuart1, “\r\n to be switched to S world.”);</p>
<p>else if (InputChar == 0x31)</p>
<p>HAL_UART_Transmit (&hlpuart1, “\r\n to be switched to NS world.”);</p>
<p> </p>
<p>SECURE_RetargetISR (InputChar);</p>
<p>Status = InputChar;</p>
<p>if (Status = 0x30)</p>
<p>HAL_UART_Transmit(&hlpuart1, “\r\n User Button has been switched to S world.”);</p>
<p>else if (Status == 0x31)</p>
<p>HAL_UART_Transmit (&hlpuart1, “\r\n User Button has been switched to NS world.”);</p>
<p>else</p>
<p>HAL_UART_Transmit (&hlpuart1, “\r\n the same state, do nothing. \n”);</p>
<p>}</p>
<p>位置在:main.c里的while(1)中。</p>
<p><br />
</p>
<p>插上板子,会提示“NODE_L552ZE”。</p>
<p> </p>
<p>编译,会报错:</p>
<p> </p>
<p><span style="color:#0000ff">08:02:08 **** Incremental Build of configuration Debug for project test_TrustZone-1_NonSecure ****</span></p>
<p><span style="color:#000000">make -j8 all </span></p>
<p><span style="color:#000000">arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m33 -std=gnu11 -g3 -DUSE_HAL_DRIVER -DSTM32L552xx -DDEBUG -c -I../Core/Inc -I../../Secure_nsclib -I../../Drivers/STM32L5xx_HAL_Driver/Inc -I../../Drivers/CMSIS/Device/ST/STM32L5xx/Include -I../../Drivers/STM32L5xx_HAL_Driver/Inc/Legacy -I../../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -o "Core/Src/main.o"</span></p>
<p><span style="color:#000000">../Core/Src/main.c: In function 'main':</span></p>
<p><span style="color:#000000">../Core/Src/main.c:102:41: error: 'InputChar' undeclared (first use in this function)</span></p>
<p><span style="color:#000000">while (HAL_UART_Receive (&hlpuart1, &InputChar, 1, 1000) == HAL_OK)</span></p>
<p><span style="color:#000000">^~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:102:41: note: each undeclared identifier is reported only once for each function it appears in</span></p>
<p><span style="color:#000000">../Core/Src/main.c:104:22: error: 'Status' undeclared (first use in this function); did you mean 'ITStatus'?</span></p>
<p><span style="color:#000000">if (InputChar != Status)</span></p>
<p><span style="color:#000000">^~~~~~</span></p>
<p><span style="color:#000000">ITStatus</span></p>
<p><span style="color:#000000">../Core/Src/main.c:107:37: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]</span></p>
<p><span style="color:#000000">HAL_UART_Transmit (&hlpuart1, "\r\n to be switched to S world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:107:7: error: too few arguments to function 'HAL_UART_Transmit'</span></p>
<p><span style="color:#000000">HAL_UART_Transmit (&hlpuart1, "\r\n to be switched to S world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: declared here</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:109:37: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]</span></p>
<p><span style="color:#000000">HAL_UART_Transmit (&hlpuart1, "\r\n to be switched to NS world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:109:7: error: too few arguments to function 'HAL_UART_Transmit'</span></p>
<p><span style="color:#000000">HAL_UART_Transmit (&hlpuart1, "\r\n to be switched to NS world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: declared here</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:111:6: warning: implicit declaration of function 'SECURE_RetargetISR' [-Wimplicit-function-declaration]</span></p>
<p><span style="color:#000000">SECURE_RetargetISR (InputChar);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:115:36: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n User Button has been switched to S world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:115:7: error: too few arguments to function 'HAL_UART_Transmit'</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n User Button has been switched to S world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: declared here</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:117:36: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n User Button has been switched to NS world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:117:7: error: too few arguments to function 'HAL_UART_Transmit'</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n User Button has been switched to NS world.");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: declared here</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:120:36: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n the same state, do nothing. \n");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c:120:7: error: too few arguments to function 'HAL_UART_Transmit'</span></p>
<p><span style="color:#000000">HAL_UART_Transmit(&hlpuart1, "\r\n the same state, do nothing. \n");</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">In file included from ../Core/Inc/stm32l5xx_hal_conf.h:402:0,</span></p>
<p><span style="color:#000000">from ../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal.h:30,</span></p>
<p><span style="color:#000000">from ../Core/Inc/main.h:31,</span></p>
<p><span style="color:#000000">from ../Core/Src/main.c:21:</span></p>
<p><span style="color:#000000">../../Drivers/STM32L5xx_HAL_Driver/Inc/stm32l5xx_hal_uart.h:1581:19: note: declared here</span></p>
<p><span style="color:#000000">HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">../Core/Src/main.c: In function 'HAL_GPIO_EXTI_Rising_Callback':</span></p>
<p><span style="color:#000000">../Core/Src/main.c:293:21: error: 'LED_GREEN_GPIO_Port' undeclared (first use in this function); did you mean 'LED_BLUE_GPIO_Port'?</span></p>
<p><span style="color:#000000">HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">LED_BLUE_GPIO_Port</span></p>
<p><span style="color:#000000">../Core/Src/main.c:293:42: error: 'LED_GREEN_Pin' undeclared (first use in this function); did you mean 'LED_BLUE_Pin'?</span></p>
<p><span style="color:#000000">HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);</span></p>
<p><span style="color:#000000">^~~~~~~~~~~~~</span></p>
<p><span style="color:#000000">LED_BLUE_Pin</span></p>
<p><span style="color:#000000">make: *** Error 1</span></p>
<p><span style="color:#000000">"make -j8 all" terminated with exit code 2. Build might be incomplete.</span></p>
<p> </p>
<p><span style="color:#0000ff">08:02:08 Build Failed. 10 errors, 6 warnings. (took 665ms)</span></p>
本帖最后由 MianQi 于 2021-1-8 17:44 编辑
<p>对TrustZone的探索还在继续,这次,换了一台机子,操作系统从Ubuntu 20.04 换成 Windows 10。</p>
<p> </p>
<p>测试的步骤也变了:</p>
<p>1、先用STM32CubeProgrammer进行选项字节配置,再用独立的STM32CubeMX进行初始设置,然后从STM32CubeMX的提示中直接进入STM32CubeIDE。</p>
<p>2、将示例中的四段代码逐个输入,每输入一个进行一次build。</p>
<p> </p>
<p></p>
<p> </p>
<p>测试的结果是,问题出在第四段,也就是NS区域的第二段代码处。</p>
<p> </p>
<p> </p>
<p>最新进展:Bulid的时候没有错,RUN的时候报错:</p>
<p></p>
<p></p>
<p> </p>
<p>新的进展 —— 可以Run了:</p>
<p></p>
<p>于是,用户按键(User Button)也生效了:https://v.youku.com/v_show/id_XNTA3NDAxMDI2OA==.html</p>
<p>现正的问题是,不能实现串口通信,试了Putty和VS Code,两个都不能键盘输入,也没有对话。还在查找原因。</p>
页:
[1]