nRF52

nRF52840에서 USB Mass Storage Class (MSC) 사용하기

임베디드 친구 2024. 9. 8. 11:35
728x90
반응형

nRF52840에서 USB Mass Storage Class (MSC) 사용하기

Nordic Semiconductor의 nRF52 시리즈 마이크로컨트롤러는 IoT 및 임베디드 시스템에서 널리 사용되는 다재다능한 장치입니다. 이 시리즈는 USB Mass Storage Class (MSC)를 지원하여 마이크로컨트롤러가 컴퓨터에 USB로 연결될 때 외장 저장 장치로 동작할 수 있게 해줍니다. 이 가이드는 nRF52 장치, 특히 nRF52840에서 USB MSC를 설정하고 구현하는 방법을 다루며, 이를 통해 컴퓨터에서 nRF52840 보드를 파일 읽기 및 쓰기 용도로 인식할 수 있도록 합니다.

1. nRF52에서 USB MSC 개요

USB Mass Storage Class (MSC)는 마이크로컨트롤러가 USB 연결을 통해 외부 저장 장치로 인식되도록 하는 USB 표준 프로토콜입니다. 이를 통해 nRF52 보드를 컴퓨터에 연결하면 쉽게 파일을 읽거나 쓸 수 있습니다. nRF52 시리즈에서 USB MSC를 사용하면 다음과 같은 이점이 있습니다:

  • 간편한 파일 관리: FAT 파일 시스템을 사용하여 컴퓨터에서 파일을 쉽게 관리할 수 있습니다.
  • 표준화된 프로토콜: USB의 Mass Storage Bulk-Only Transport (BOT) 프로토콜을 따르며, 다양한 운영 체제에서 호환성을 제공합니다.

2. USB MSC 모듈 설정

nRF52 시리즈에서 USB MSC를 사용하려면 몇 가지 설정이 필요합니다. 이를 위해 SDK 설정 파일과 라이브러리를 수정해야 합니다.

sdk_config.h 설정

우선, sdk_config.h 파일에서 USB MSC 기능을 활성화해야 합니다. 다음 매크로를 활성화합니다.

#define APP_USBD_MSC_ENABLED    1

nRF 라이브러리

USB MSC 기능을 사용하기 위해 필요한 라이브러리 경로는 다음과 같습니다.

./components/libraries/usbd/class/msc/app_usbd_msc.c

이 라이브러리는 USB MSC 클래스의 핵심 구현을 포함하고 있습니다.

3. nRF52에서 USB MSC 구현

이제 USB MSC를 실제로 구현하는 방법을 알아보겠습니다. 이전 챕터에서 USB CDC ACM과 파일 시스템을 적용했으며, USB MSC는 이들 위에 간단한 코드 추가만으로 구현할 수 있습니다.

3.1 USB MSC 클래스 정의

먼저, APP_USBD_MSC_GLOBAL_DEF 매크로를 이용해 USB MSC 클래스를 정의합니다. 이 매크로는 USB 장치의 엔드포인트와 작업 버퍼 등을 설정하는 역할을 합니다.

/**
 * @brief Endpoint list passed to @ref APP_USBD_MSC_GLOBAL_DEF
 */
#define ENDPOINT_LIST() APP_USBD_MSC_ENDPOINT_LIST(3, 2)

/**
 * @brief Mass storage class work buffer size
 */
#define MSC_WORKBUFFER_SIZE (1024)

/*lint -save -e26 -e64 -e123 -e505 -e651*/
/**
 * @brief Mass storage class instance
 */
/**
 * @brief Mass storage class user event handler
 */
static void msc_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_msc_user_event_t     event);

APP_USBD_MSC_GLOBAL_DEF(m_app_msc, 2, msc_user_ev_handler, ENDPOINT_LIST(), BLOCKDEV_LIST(), MSC_WORKBUFFER_SIZE);

3.2 USB MSC 클래스 추가 및 제거

USB MSC 클래스를 동적으로 추가하거나 제거할 수 있습니다. 예를 들어, USB CDC ACM 작업이 시작될 때 append_usb_msc()를 호출하여 USB MSC 클래스를 추가할 수 있습니다. 특정 상황에서는 USB CDC ACM만 사용해야 하는 경우가 있을 수 있습니다. 이때는 mass storage 클래스만 제거하면 됩니다. 주의할 점은 USB 데몬이 정지하고 비활성화된 상태에서만 클래스를 추가하거나 제거해야 한다는 것입니다. 활성화된 상태에서 클래스를 추가 제거하려고 하면 시스템이 멈출 수 있습니다.

ret_code_t append_usb_msc(void)
{
    ret_code_t ret = NRF_SUCCESS;
    app_usbd_class_inst_t const* class_inst_msc = NULL;

    class_inst_msc = app_usbd_msc_class_inst_get(&m_app_msc);
    ret = app_usbd_class_append(class_inst_msc);
    APP_ERROR_CHECK(ret);

    return ret;
}

ret_code_t remove_usb_msc(void)
{
    ret_code_t ret = NRF_SUCCESS;
    app_usbd_class_inst_t const* class_inst_msc = NULL;

    class_inst_msc = app_usbd_msc_class_inst_get(&m_app_msc);
    ret = app_usbd_class_remove(class_inst_msc);
    APP_ERROR_CHECK(ret);

    return ret;
}

3.3 파일 시스템과의 연동

USB CDC ACM 클래스 구현 시 USBD 초기화 과정에서 사용자 이벤트 핸들러를 구현했습니다. 이 핸들러는 USB 전원 감지, USB 시작, 중지와 관련된 이벤트를 수신하며, 그에 따라 USB 데몬을 활성화하거나 비활성화합니다. 파일 시스템 또한 USB MSC와 유기적으로 동작하도록 USB 데몬의 상태 변화에 따라 활성화하거나 비활성화할 필요가 있습니다. 파일 시스템은 nRF52에서 파일에 접근하는 수단이며, USB MSC는 PC나 호스트 장치가 파일에 접근하는 수단입니다. 동시에 접근이 가능하면 좋겠지만, 서로 배타적으로 동작해야 합니다. 그렇지 않으면 PC에서 USB를 연결해도 USB 스토리지가 정상적으로 동작하지 않거나, 반대로 nRF52에서 파일 시스템에 접근할 수 없는 문제가 발생할 수 있습니다. 다음 코드는 이벤트에 따라 파일 시스템을 활성화하거나 비활성화하는 방법을 보여줍니다.

static void usbd_user_ev_handler(app_usbd_event_type_t event)
{
    switch (event)
    {
        case APP_USBD_EVT_STOPPED:
            if(nrf_drv_usbd_is_enabled())
                app_usbd_disable();

#ifdef INTI_ENABLE_USB_MSC
            aika_fs_prepare();
#endif
            break;

        case APP_USBD_EVT_POWER_DETECTED:
            if(!nrf_drv_usbd_is_enabled())
            {
#ifdef INTI_ENABLE_USB_MSC
                aika_fs_stop();
#endif
                app_usbd_enable();
            }
            break;

        case APP_USBD_EVT_POWER_REMOVED:
            if(nrf_drv_usbd_is_started())
                app_usbd_stop();
            break;

        case APP_USBD_EVT_POWER_READY:
            if(!nrf_drv_usbd_is_started())
                app_usbd_start();
            break;

        default:
            break;
    }
}

이제 PC와 nRF52840 DK 보드를 연결해 봅시다. 보통 nRF USB라고 표시된 포트에 연결하면 됩니다.

usb msc
USB 드라이브

4. 테스트 및 배포

위의 설정이 완료되면 nRF52840 DK 보드를 컴퓨터에 연결하여 USB MSC 기능을 테스트할 수 있습니다. 컴퓨터에서 보드가 외장 저장 장치로 인식되면 파일을 읽고 쓸 수 있습니다. 테스트 시에는 다양한 운영 체제에서 장치가 올바르게 인식되는지 확인하는 것이 좋습니다.

5. 주의사항 및 알려진 문제

운영 체제 호환성: Windows와 Linux에서는 USB MSC가 정상적으로 인식되지만, macOS에서는 정상적으로 동작하지 않는 경우가 있습니다. 특히, MacBook에 USB를 연결할 때 파일이 자동으로 삭제되는 문제가 발생할 수 있습니다.
USB 데몬 상태: USB 클래스를 추가하거나 제거할 때는 반드시 USB 데몬이 정지된 상태여야 합니다. 그렇지 않으면 시스템이 멈출 수 있습니다.

6. 결론

nRF52 USB MSC 클래스는 컴퓨터와의 데이터 교환을 용이하게 하며, 간편한 연결 및 사용을 제공합니다. 플러그 앤 플레이 기능 덕분에 다양한 응용 분야에서 표준화된 프로토콜을 활용한 효율적인 데이터 관리가 가능합니다. 이 가이드를 통해 nRF52840 보드에서 USB MSC를 성공적으로 구현하고 테스트할 수 있기를 바랍니다.

728x90
반응형