본문 바로가기
임베디드.일렉트로닉스

Dialog 사. SDK 이용 BLE 코딩 핵심개념.

by 리치굿맨 2015. 7. 26.

 

 

개요

 

 Dialog사의 SDK 기반 BLE기능 코딩하기 위한 핵심 개념 정리.  

 

 본 정보는 제조사 제공 UM-B-015 : User Manual - Software Architecture ( pdf 바로보기 )  의 내용기반으로 정리한 것임.

 

기반정보.

Dialog 사 SDK 개요. http://igotit.tistory.com/370

 

 

 

 

 

 

 

Software 설정.

 

 

6.3.1 . 내장, 외부 MCU 모드 선택.

 응용측 개발을 내장 MCU사용하는 모드 혹은 외부 MCU이용하는 모드가 가능하며 개발시 jump table의 첫번째 요소에서  모드를 지정할 수 있다.

 

const uint32_t* const jump_table_base[88] __attribute__((section
("jump_table_mem_area"))) =
{
#if (BLE_APP_PRESENT)
(const uint32_t*) TASK_APP, // Integrated processor
#else
(const uint32_t*) TASK_GTL, // External processor
#endif 

 

즉, 위 코드에서 보이듯이 TASK_APP 가 선택된 것이 응용코드를 내장 MCU에서 구현하는 경우의 설정이며,

TASK_GTL 을 선택하게 되면 외부 MCU에서 응용코드 구현하는 경우의 설정이다. 

 

6.3.2 Configuration derectives.

 

da14580_config.h

모든 SDK 프로젝트는 configuration header file인 da14580_config.h(Keil_projects 폴더에 있음.) 를 인클루드 하고 있고 응용측의 다양한 셋팅이 가능하다.

예로 CFG_APP 를 define 한 경우는 내장MCU 에 응용코드 구현모드 로 설정되고 정의하지 않은 경우 외부 MCU에서 응용코드구현모드로 설정된다.

da14580_scatter_config.h : Scatter file and memory map configuration.. <- 수정하면안됨.

da14580_stack_config.h : BLE stack and kernel definition. <-수정하면 안됨.

 

추가의 설정가능한 stack parameter 는 아래 2개 파일에 있다.

● dk_apps\src\ip\ble\hl\src\rwble_hl\rwble_hl_config.h
● dk_apps\src\modules\rwip\api\rwip_config.h

 

 

 

 

 

 

내장 MCU mode API

 

 Integrated processor mode API 

 

 SDK 예제 코드 중 proximity reporter 예제코드로 설명.

 

6.4.1 Application to kernel API.

 응용측에서 kernel 과 통신하기 위해서는 아래 2개 파일을 include 해야한다.

 ke_task.h

 ke_timer.h

 

 Adding an application task.

 응용개발자는 각 state마다 state handler table 을 정의해야하고, default handler app_default_handler() 도 제공되어야 한다.

 예제코드에서는 app_task.c 와 app_task.h 에서 구현되어있다.

 

 Creating an applicaition environment

 connection handle, security tag 같은 주요 데이터들을 저장가능해야한다. 환경변수 구조체 app_env_tag 는 app.h 에 선언되어있고,

 app.c  에서 struct app_env_tag app_env; 로 정의되어있다.

 

 System startup

 main 함수에서 요구되는 startup 필수 요구사항.

 BLE Stack initialization .

 

6.4.2 Applicaiton initialisation

 상기 System startup 과정에서 호출되는 app_init() 함수 내에서 처리되어야 할 사항.

 1. lintialise the profiles.

 2. application task 생성과 초기화.

 3. security task 초기화. (CFG_APP_SEC 활성화 한 경우 )

 

6.4.3 Application to GAP API.

RW-BLE GAP 에서는 BLE기기의 discovery, link 를 담당하며, 또한 securty mode,levels 사용과 관련 처리사항들도 정의된다.

 

Adding GAP event handler.

 앞의 system startup에서 main_func() 내에서 BLE Stack initialization이 이뤄지고 이 과정에서 GAP entity 도 초기화 되어 상위 계층으로 서비스 가능한 상태가 되었을때 이벤트 : GAPM_DEVICE_READY_IND 가 상위 계층으로 전달된다.  응용코드에서의 이 이벤트를 수신한 application task에서  함수 : gapm_device_ready_ind_handler() 를 호출한다. 개발자 임의로 필요한 GAP 이벤트 핸들러를 추가할 수 있다.

 

참고. GAP module 은 2개의 task로 구성되어있다.

GAP Manager (TASK_GAPM)

GAP Controller(TASK_GAPC)

 

GAP setup

 

단계1. 예제코드(proximity reporter) 에서는 이벤트 : GAPM_DEVICE_READY_IND 수신한 application 은 가장 먼저 GAP module 의 TASK_GAPM에 커맨드 : GAPM_RESET_CMD 를 전송하면 GAPM 은 GAPM_CMP_EVT 발생으로 반응하고 이를 수신하는 응용측 핸들러는 gapm_cmp_evt_handler() 이며, 커맨드: GAPM_SET_DEV_CONFIG_CMD 를 TASK_GAPM 으로 전송한다. 최종적으로 달성된 상태는 PM에서 이전 커맨드 처리되었고 TASK_GAPM 의 initialization이 완료.

 

단계2. 상기 단계1 의 최종상태 달성 이후 함수 : app_db_init() 호출하여 profile database 를 초기화 한다. (모든 프로파일들에 대해서 이뤄져야한다. 앞의 6.4.2 절에서의 모든 프로파일.)

 

단계3. 상기 단계 2 이후 profile task(kernel측) 는 "프로파일이름_CREATE_DB_CFM" message 를 응용측으로 전송하고 이를 처리하는 핸들러  프로파일이름_create_db_cfm_handler() 가 실행되면서  APP_MODULE_INIT_CMP_EVT 메시지가 TASK_APP 로 전송되면 이를 처리하는 핸들러 app_module_init_cmp_evt_handler() 가 실행되면서 다음 프로파일(있다면) 에  대한 함수 : app_db_init() 호출된다. 다름 프로파일이 없다면 함수 : app_adv_start() 호출되어 advertising procudure 가 시작된다.

 

Advertising data

예제코드 proximity reporter 인 경우 advertising data 는 app_proxr_proj.h 에 정의되어있고 아래와 같다.

#define APP_ADV_DATA "\x07\x03\x03\x18\x02\x18\x04\x18"
#define APP_ADV_DATA_LEN (8)

의미는 아래와 같다.

x07 Length
x03 Complete list of 16-bit UUIDs available
x03\x18 Link Loss Service UUID
x02\x18 Immediate Alert Service UUID
x04\x18 Tx Power Service UUID

 

Advertising procedure

앞의 단계3의 app_adv_start() 함수내에는 app_adv_func() 에서는 GAPM측으로 GAPM_START_ADVERTISE_CMD 메시지를 전송한다. 메시지 데이터 예는 아래와 같다.

 

cmd->op.code = GAPM_ADV_UNDIRECT;
cmd->op.addr_src = GAPM_PUBLIC_ADDR;
cmd->intv_min = APP_ADV_INT_MIN;
cmd->intv_max = APP_ADV_INT_MAX;
cmd->channel_map = APP_ADV_CHMAP;
cmd->info.host.mode = GAP_GEN_DISCOVERABLE;

cmd->info.host.adv_data_len 에는 advertising data size 를 정확히 기록해야한다. 데이터 사이즈가 정확하지 않은 경우 GAPM은 해당 메시지 처리하지 않고 무시한다.

 

응용측에서 advertising 절차를 중단하고 싶은경우 함수 app_adv_stop() 호출한다.

 

Device connected

Advertising 이후 connected state 로 진입한 경우 GAPC 는 GAPC_CONNECTION_REQ_IND 메시지 전송하고 이를 처리하는 핸들러 gapc_connection_req_ind_handler() 실행되면서 app_connection_func() 함수를 호출하게된다.

 

응용측에서는 GAPC 로 GAPC_CONNECTION_CFM 메시지 전송하는 것으로 connection confirm 한다. 만일 Security 가 필요한 경우에는 함수 app_security_enable() 호출되어 security mode 로 셋업되고, security parameter 가 GAPC 로 전달된다.

 

이 단계가 기기는 connected 된 것이며 응용측은 profile service 를 사용할 수 있는 상태가 달성된 것.

 

6.4.4 Application to profile API.

proxomity reporter 를 비롯한  profile API 활용정보는 별도로 제공되는 문서와 헤더파일 proximity 인 경우 proxr_task.h 를 참조하여 구현한다.

 

 

위 전체 내용 상세 : UM-B-015 : User Manual – Software Architecture 의 페이지 14 6.4 절 전체.

 

 

 

 

외부 MCU mode API

 

 External processor API

 이 모드에선 GAP계층 이하만 DA14580/1/3 에서 구동되고, 응용계층(host applicaiton)은 외부 별도 MCU 에서 작동되며, 외부  MCU와 BLE 칩과는 UART 통신한다.

 

SDK 에서 제공되는 proximity monitor 예제코드가 External processor mode 구현예이다.

상세 : UM-B-015 : User Manual – Software Architecture 의 페이지 19. 6.5 절 내용.

 

 

 

 

본 글이 포함된 상위 정리 글.

 

Connectivity : http://igotit.tistory.com/280  의 Bluetooth

 

 

 

/// http://igotit.tistory.com/384

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT