How to use user callback from CAAM driver

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

How to use user callback from CAAM driver

1,108件の閲覧回数
jslota13245
Contributor III

There is:

/*! @brief CAAM handle
* Specifies jobRing and optionally the user callback function.
* The user callback functions is invoked only if jobRing interrupt has been enabled by the user.
* By default the jobRing interrupt is disabled (default job complete test is polling CAAM output ring).
*/
typedef struct _caam_handle_t
{
caam_job_ring_t jobRing;

/* Callback functions */
caam_job_callback_t callback; /*!< Callback function */
void *userData; /*!< Parameter for CAAM job complete callback */
} caam_handle_t;

So i wrote a callback and mapped it to caam_handle_t* handle

static void xpnd_CAAM_job_ring_1_complete_clb(void* args) {
BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(sem[ITF_1],
&pxHigherPriorityTaskWoken);
DisableIRQ(CAAM_IRQ1_IRQn);
}

At the very end i tried:

EnableIRQ(CAAM_IRQ1_IRQn);

drv_res = CAAM_RNG_GetRandomDataNonBlocking(
base, handle, kCAAM_RngStateHandle0, desc, data, dataSize,
kCAAM_RngDataAny, NULL);

if (drv_res == kStatus_Success) {
if (pdTRUE != xSemaphoreTake(sem[ITF_1], MS_TIMEOUT)) {
PRINTF("CAAM operation failed\r\n");
return ST_FAILURE;
}
} else {
PRINTF("Failed to setup driver operation, res %d\r\n", drv_res);
return ST_FAILURE;
}

The program crashes after short time i think - because it didn't report an error from semaphore.

Do i need to do something else?

In assembly startup_mimxrt1176 there is CAAM_IRQ0_IRQHandler prototyped but i think it might be not defined - might this be the case?

Also in the driver code i don't see where is the custom callback is called.

タグ(3)
0 件の賞賛
返信
2 返答(返信)

1,049件の閲覧回数
mayliu1
NXP Employee
NXP Employee

Hi @jslota13245 ,

Thank you so much for your interest in our products and for using our community.

I find your code is based on FreeRTOS.
I suggest first testing with the NXP SDK demo " evkbmimxrt1170_caam_cm4".  This demo project is a demonstration program that uses the KSDK software to encrypt plain text and decrypt it back using AES algorithm. CBC and GCM modes are demonstrated. The symmetric key is generated at random, using CAAM's random number generator.
 
Please try running this demo to check whether the issue is caused by your API usage or by the FreeRTOS integration. 
 
Best Regards
MayLiu
0 件の賞賛
返信

1,045件の閲覧回数
jslota13245
Contributor III

Dear @mayliu1 , 

the demo doesn't demonstrate on how to use the user callback - or any interrupt in fact.

I need to have an interrupt from CAAM hardware on completion. Could you help me with that?

0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2291862%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ECAAM%20%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%8B%E3%82%89%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2291862%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%8C%E3%81%82%E3%82%8B%EF%BC%9A%3C%2FP%3E%3CP%3E%2F*!%20%40brief%20CAAM%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%3CBR%20%2F%3E*%20jobRing%20%E3%81%A8%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E*%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0%E3%81%AF%E3%80%81%E3%82%B8%E3%83%A7%E3%83%96%E3%83%AA%E3%83%B3%E3%82%B0%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%8C%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AE%E3%81%BF%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E*%20%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E3%81%AF%E3%80%81jobRing%20%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%20(%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%8C%E4%BA%86%E3%83%86%E3%82%B9%E3%83%88%E3%81%AF%20CAAM%20%E5%87%BA%E5%8A%9B%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%9D%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%99)%E3%80%82%3CBR%20%2F%3E*%2F%3CBR%20%2F%3E%20typedef%20%E6%A7%8B%E9%80%A0%E4%BD%93%20_caam_handle_t%3CBR%20%2F%3E%20%7B%3CBR%20%2F%3E%20caam_job_ring_t%20%E3%82%B8%E3%83%A7%E3%83%96%E3%83%AA%E3%83%B3%E3%82%B0%3B%3C%2FP%3E%3CP%3E%2F*%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0%20*%2F%3CBR%20%2F%3E%20caam_job_callback_t%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%3B%20%2F*!%26lt%3B%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0%20*%2F%3CBR%20%2F%3E%20void%20*userData%3B%20%2F*!%26lt%3B%20CAAM%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%8C%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%20*%2F%3CBR%20%2F%3E%20%7D%20caam_handle_t%3B%3CBR%20%2F%3E%3CBR%20%2F%3ESO%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6caam_handle_t*%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%81%AB%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3C%2FP%3E%3CP%3E%E9%9D%99%E7%9A%84void%20xpnd_CAAM_job_ring_1_complete_clb(void*%20args)%20%7B%3CBR%20%2F%3E%20BaseType_t%20pxHigherPriorityTaskWoken%20%3D%20pdFALSE%3B%3CBR%20%2F%3E%20xSemaphoreGiveFromISR(sem%5BITF_1%5D%2C%3CBR%20%2F%3E%20%26amp%3BpxHigherPriorityTaskWoken)%3B%3CBR%20%2F%3E%20IRQ%20%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99(CAAM_IRQ1_IRQn)%3B%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%E6%9C%80%E5%BE%8C%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%9F%E3%81%AE%E3%81%AF%3A%3C%2FP%3E%3CDIV%3EIRQ%20%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%20(CAAM_IRQ1_IRQn)%3B%3C%2FDIV%3E%3CP%3Edrv_res%20%3D%20CAAM_RNG_GetRandomDataNonBlocking(%3CBR%20%2F%3E%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%80%81kCAAM_RngStateHandle0%E3%80%81%E8%AA%AC%E6%98%8E%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%BA%E3%80%81%3CBR%20%2F%3E%20kCAAM_RngDataAny%E3%80%81NULL)%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%3C%2FP%3E%3CP%3Eif%20(drv_res%20%3D%3D%20kStatus_Success)%20%7B%3CBR%20%2F%3E%20pdTRUE%20!%3D%20xSemaphoreTake(sem%5BITF_1%5D%2C%20MS_TIMEOUT)%20%E3%81%AE%E5%A0%B4%E5%90%88%20%7B%3CBR%20%2F%3E%20PRINTF(%22CAAM%20%E6%93%8D%E4%BD%9C%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%5Cr%5Cn%22)%3B%3CBR%20%2F%3E%20ST_FAILURE%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%20%7D%20%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%20%7B%3CBR%20%2F%3E%20PRINTF(%22%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E6%93%8D%E4%BD%9C%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%81res%20%25d%5Cr%5Cn%22%2C%20drv_res)%3B%3CBR%20%2F%3E%20ST_FAILURE%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%20%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%BB%E3%83%9E%E3%83%95%E3%82%A9%E3%81%8B%E3%82%89%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E5%A0%B1%E5%91%8A%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%9F%E3%82%81%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%99%E3%81%90%E3%81%AB%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%9F%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3E%E4%BB%96%E3%81%AB%E4%BD%95%E3%81%8B%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%20startup_mimxrt1176%20%E3%81%AB%E3%81%AF%20CAAM_IRQ0_IRQHandler%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E7%8A%B6%E6%B3%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%81%BE%E3%81%9F%E3%80%81%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AF%E3%80%81%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%8C%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E6%89%80%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2292450%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20How%20to%20use%20user%20callback%20from%20CAAM%20driver%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2292450%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F251438%22%20target%3D%22_blank%22%3E%40jslota13245%E3%81%95%E3%82%93%3C%2FA%3E%E3%80%81%3C%2FP%3E%0A%3CP%3E%E5%BC%8A%E7%A4%BE%E3%81%AE%E8%A3%BD%E5%93%81%E3%81%AB%E3%81%94%E8%88%88%E5%91%B3%E3%82%92%E3%81%8A%E6%8C%81%E3%81%A1%E3%81%84%E3%81%9F%E3%81%A0%E3%81%8D%E3%80%81%E3%81%BE%E3%81%9F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E3%81%94%E5%88%A9%E7%94%A8%E3%81%84%E3%81%9F%E3%81%A0%E3%81%8D%E8%AA%A0%E3%81%AB%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CDIV%3E%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%20FreeRTOS%20%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82%3C%2FDIV%3E%0A%3CDIV%3E%E3%81%BE%E3%81%9A%20NXP%20SDK%20%E3%83%87%E3%83%A2%E3%80%8Cevkbmimxrt1170_caam_cm4%E3%80%8D%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E3%81%8A%E5%8B%A7%E3%82%81%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%87%E3%83%A2%3CSPAN%3E%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AF%E3%80%81KSDK%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%97%E3%80%81AES%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E5%BE%A9%E5%8F%B7%E5%8C%96%E3%81%99%E3%82%8B%E3%83%87%E3%83%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E3%81%99%E3%80%82CBC%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A8GCM%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E3%83%87%E3%83%A2%E3%81%8C%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E5%AF%BE%E7%A7%B0%E9%8D%B5%E3%81%AF%E3%80%81CAAM%E3%81%AE%E4%B9%B1%E6%95%B0%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AB%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FDIV%3E%0A%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%0A%3CDIV%3E%0A%3CDIV%3E%0A%3CDIV%3E%E3%81%93%E3%81%AE%E3%83%87%E3%83%A2%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%80%81%E5%95%8F%E9%A1%8C%E3%81%8C%20API%20%E3%81%AE%E4%BD%BF%E7%94%A8%E3%81%AB%E3%82%88%E3%82%8B%E3%82%82%E3%81%AE%E3%81%8B%E3%80%81FreeRTOS%20%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%AB%E3%82%88%E3%82%8B%E3%82%82%E3%81%AE%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%3C%2FDIV%3E%0A%3C%2FDIV%3E%0A%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%0A%3CDIV%3E%E3%82%88%E3%82%8D%E3%81%97%E3%81%8F%E3%81%8A%E9%A1%98%E3%81%84%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FDIV%3E%0A%3CDIV%3E%E3%83%A1%E3%82%A4%E3%83%AA%E3%83%A5%E3%83%BC%3C%2FDIV%3E%0A%3C%2FDIV%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2292462%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20How%20to%20use%20user%20callback%20from%20CAAM%20driver%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2292462%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E8%A6%AA%E6%84%9B%E3%81%AA%E3%82%8B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F239163%22%20target%3D%22_blank%22%3E%40mayliu1%3C%2FA%3E%E6%A7%98%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%87%E3%83%A2%E3%81%A7%E3%81%AF%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E3%81%AF%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3E%E5%AE%8C%E4%BA%86%E6%99%82%E3%81%AB%20CAAM%20%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%8B%E3%82%89%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%E3%81%9D%E3%82%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%89%8B%E4%BC%9D%E3%81%A3%E3%81%A6%E3%82%82%E3%82%89%E3%81%88%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%3C%2FP%3E%3C%2FLINGO-BODY%3E