본문 바로가기

펌웨어25

펌웨어와 커스텀 부트로더(SRAM과 보안,MPU) 펌웨어로 개발을 하다보면 부트로더의 개발은 선택이 아닌 필수가 된다. 부트로더는 보통 하드웨어 또는 환경설정( 예:맥어드레스..) 초기화를 하거나 프로그램 다운로드 및 업데이트를 진행한다. 내가 그동안 개발했던 펌웨어 부트로더는 Romless cpu+ Nor flash(또는 spi flash) + sdram 인 케이스, 내부플래쉬에서 점프하는 가장 맘편한 케이스 그리고 지금하는 qspi flash에서 점프하는 케이스가 있다. ​ Romless cpu+ Nor flash(또는 spi flash) + sdram 인 케이스는 NXP의 lpc1820으로 개발한 경우였다. spi flash로 부팅하고 sdram에 메인 프로그램을 복사한 뒤, vector와 스택포인터만 변경해 주면 문제없이 점프를 했다. ​ 내부 .. 2022. 10. 14.
EFR32FG1 HFXO 오실레이터 관련된 개발 이야기 실리콘랩스의 EFR32FG1 시리즈를 개발하고 양산하는 도중, 꽤 많은 생산 불량이 나오기 시작했다. 한 7% 정도... ? ​ 무한 재부팅이 되고, 와치 독을 빼면 어디선가 멈춰서 JTAG도 안되고, 멀쩡한 건 정상 부팅이 되고... ​ 문제를 분석하기 위해 크리스털 발진을 찍어보니 발진을 하는 순간, 리셋이 되었다. 어디인지 보기 위해 디버깅 메시지를 이리저리 추가하니, RAIL_StartRx 함수가 실행되면 다음 리셋이 실행되는 것을 확인했다. (https://docs.silabs.com/rail/latest/group-receive) ​ 무선 RF 통신을 하는 장비가 통신을 하니 멈춘다니.. 우선 크리스털이 문제인가 해서 교체해 봤으나 문제는 해결되지 않았다. 냉납인가 해서 납땜도 다시 해봤으나,.. 2022. 10. 14.
펌웨어로 2개의 wav 오디오 믹싱하기 wav파일은 header구조이 있는 원본 음원 파일이다. header가 없으면 pcm 데이터이다. 오디오 음원 데이터는 여러 가지 타입이 있다. 단순 채널인 모노채널과 좌우 음원으로 구성된 2 채널이 있고 더 나아가서는 5.1 채널 등 여러 가지 타입이 있다. Bit per Sample은 샘플링한 데이터의 데이터 비트 수 인데 보통 16비트를 사용한다. (MP3 압축 데이터를 디코딩하면 16비트 PCM데이터로 나온다). 그리고 16비트 샘플 데이터는 -32,768 ~ 32,767 사이의 음원의 아날로그 값에 대한 디지털 값이다. 이 값을 단순히 키우면 볼륨이 커지고 낮추면 볼륨이 낮아진다. 그리고 2개의 오디오를 합쳐서,믹싱해서 출력을 하려면 각 샘플데이터를 더한 다음 wav로 저장하거나, I2S로 출력.. 2022. 3. 21.
MP3 현재 재생시간 계산하기 (플레이타임) MP3를 재생하다 보면 현재 재생시간을 표시해줘야 한다. 이를 계산하는 방법이 간단하게는.. 재생이 되면 타이머를 써서, 멈출때까지 타이머로 보여주는 방법이 있는데 문제는 지정한 시간으로 재생하고자 할때는 이 방법은 사용할수가 없다. 그래서 조금 귀찮더라도 계산을 통해 얻어야 해야 한다. 우선 MP3 파일을 재생하기 전에 얻을 수 있는 정보는 다음과 같다. 총 재생시간 파일 크기 그외 음원 정보 그리고 재생중에는 현재 파일의 오프셋 (seek) 을 알 수가 있다. 현재 오프셋이 파일의 절반되는 위치에 있으면 4분짜리 음원일 때 2분을 나타내며, 1/4의 위치에 있으면 1분을 나타낸다. 그래서 비율을 계산하면 다음과 같다. 재생 시간 비율 = 현재 파일 오프셋 / 전체 파일 크기 이제 비율을 전체 재생 시.. 2022. 1. 24.
MP3 총 재생 시간 계산하기 MP3 파일의 총 재생 시간을 구하는 방법은 다음과 같다. 총 재생시간(초) 계산식 1 = ( 파일 크기 - ID3를 제외한 첫 MP3 프레임 시작 offset) * 8 / 비트레이트 파일크기 : 파일 전체 크기 ID3를 제외한 첫 MP3 프레임 시작 offset : 첫 번째 MP3 Sync word 가 시작하는 파일 오프셋 비트레이트 : 음원의 비트레이트 (192kbps 등) 예를 들어 파일 크기가 6013734byte 이고, 비트레이드가 192 kbps일때, 시작 offset이 138 이면 ( 6013734 - 138 ) * ( 8 / 192000 ) = 250.56 이 나온다. 분 단위로 변경 하면 250 / 60 = 4분, 250 % 60 = 10초 즉, 4분 10초 짜리 음원이 된다. 단 C언어.. 2022. 1. 24.
펌웨어에서 FAT파일시스템의 확장자 구분 파일 확장자란 해당파일의 종류를 표시하기 위해 사용한다. FAT에서는 기본적으로 파일명은 8자리, 확장자는 3자리를 사용했으나, 긴 파일명도 지원하기에 파일명도 255자, 확장자도 .xlxs 같이 4자리도 사용한다. 이번에 하는 프로젝트에서 USB 메모리 스틱에서 특정 파일 리스트를 정리하는 함수가 필요했다. 음악파일인 MP3만 정리해서 파일 리스트를 뽑아주는 함수였다. 폴더내 파일중에 확장자 .mp3 만 찾아 변수에 정리만 하면 되는데, 특정mp3들이 추가가 안되는 이슈가 발생했다. mp3를 구분하는 함수는 다음과 같다. bool APP_SDCARD_AUDIO_Card_isSupportedAudioFile(int8_t *name) { int i = 0; if(name == NULL) return fal.. 2022. 1. 18.