우여 곡절 끝에 X86으로 DVR을 완성하고 한숨 돌렸을 때였다.
개발 하고 나서 보면 반성할 점도 많고 후회되는 부분도 많은 제품이었다.
다행인건 , 그렇게 해서라도 잘 동작은 해줬다는 것이었다.
시간이 지나고 새로운 DVR 개발에 대한 요청이 들어왔다.
기간은 6개월, 당시 TOP3 안에 드는 보안업체에 주력 납품될 H.264 코덱 지원하는 DVR개발이었다.
성능은 CIF480 FPS, 당시 그 정도 성능을 내는 저가형 Embedded 제품은 없다고 봐야 하는 것과 마찬가지였다. 아직 hisilicon 칩이 라인업과 성능이 애매하던 시절이었다.
가능성을 조사를 하기 위한 한달의 여유를 경영진에 요청하였다.
일단 코덱의 경우 이전 제품을 만들면서 Softlogic 사와 좋은 관계를 유지하게 되어 , 신형 H.264 코덱에 대한 정보를 받을 수 있었다.
Softlogic사의 코덱인 Solo6110이 새로 출시 될 예정이었고, 압축, 재생 성능과 비디오 출력 기능이 있어 코덱 + 비디오, OSD 기능을 한번에 해결할 수 있었다.
다음은 SOC였다. (메인 CPU)
Solo6110 개발용 EVK 에 장착된 SOC는 프리스케일사의 Power PC 계열의 SOC였다.
이것으로 개발하면 초기 개발은 비교적 쉬워지겠지만 몇 가지 이유가 마음에 걸려 다른 SOC를 찾기로 했다.
일단, 가격이 비싸다. 당시 해당 SOC는 20$ ~ 30$ 가량 하던 SOC로 목표 금액인 200$ 에 맞추기 위해서는 SOC가 차지하는 비중이 너무 컷고, 칩이 크다보니 주변 구성 칩들도 가격이 적지 않았다.
그리고 Big-endian 이었다. 나는 PC 친화적인 방향으로 하여 개발 편의성과 PC 와 연동을 쉽게 하는 것을 목표로 삼고 있었기 때문에, Little-Endian 을 선호하였다.
SOC를 선정하기 위해 아래와 같은 조건의 SOC를 팀원들과 함께 찾아보았다.
1. 가격이 15$ 이하일것
2. Little endian 일것
3. PCI bus 필수 지원 (Solo6110 코덱이 PCI BUS)
4. SATA 지원 (하드디스크 지원 및 백업용 ODD 지원)
마음에 쏙 드는 칩은 없었고, 지금도 그렇지만 문서상 사양과 실제 사용 가능한 사양이 일치하지 않는 경우도 많았다.
여러 칩 벤더의 영업분들과 미팅을 하였고, Cortina 사의 DS3516으로 결정하였다.
칩 사양은 아래와 같았다.
CPU: ARM9TDMI
clock: 200Mhz
RAM TYPE: SDRAM
PCI BUS: 있음
USB : 2.0
SATA : 3G (2gen)
가격 : 8$
Power PC에 비하면 매우 부족한 CPU 성능이었지만, 다른 부가 기능들이 충분히 만족하였으므로, 부족한 CPU성능을 최적화로 극복해 보기로 했다.
부족한 성능을 극복하기 위하여 이번에도 Solo6110의 드라이버를 직접 개발하기로 했다.
DVR의 제일 많이 사용하는 데이터 전송인 압축된 데이터 전송, OSD 출력에 CPU 의존성을 최대한 낮추기 위하여 PCI BUS MASTER DMA를 최대한 활용해야만 했다.
덕분에 DVR의 엔진과도 같은 상당한 기능을 Solo6110 드라이버에서 담당하게 되었다.
덩치 큰 드라이버 개발도 쉽지 않았지만, 생각보다 CPU의 제약 사항도 많았다.
ARM9TDMI 의 성능 한계 상 나눗셈 연산이 매우 느렸고, unaligned memory access 를 지원하지 않아, 데이터를 읽을 때에는 반드시 변수 크기의 배수 주소에서 읽어야만 했다.
무슨 뜻이냐면, 32bit int 형 변수를 읽으려면 32bit는 4byte 이므로 4의 배수 포인터에 있는 변수만 읽을 수 있고, 4의 배수가 아닐 경우 읽은 값이 깨져서 들어오거나 일부 CPU는 unaligned exception error 가 발생한다.
평소에는 컴파일러가 변수 크기에 맞춰 주소 정렬을 해주어 상관 없지만, 통신 등으로 binary 데이터를 분석 할 때에는 정렬이 되어있지 않는 경우를 대비하여 정렬된 주소에 한 바이트 씩 복사한 후 값을 읽어야 한다.
우여곡절 끝에 기본 기능을 완성하고 백업을 위한 ODD(광학 드라이브, CD라이터나 DVD라이터)를 연결할 차례가 되었다.
여기서 한번 뒤통수를 맞게 된다. SATA포트에 장착한 DVD Writer 가 동작하지 않는 것이었다.
확인 결과, DS3516은 분명 SATA를 지원하지만, 프로토콜을 하드디스크를 위한 ATA 만 지원하고, ODD 드라이브를 위한 ATAPI를 지원하지 않는 것이었다.
이미 샘플보드를 만든 상황에서 급하게 비상 회의를 열고, PCI 버스를 확장하여 SATA컨트롤러인 sil3512를 추가하기로 한 것이다.
긴급으로 칩을 수배하여 수정된 보드에 다시 DVD Writer를 작동 시켰다.
이번에는 데이터가 깨지기 시작하는 것이었다.
확인 결과 DS3516는 PCI 의 burst 전송이 512 byte 이상 되면 데이터가 깨지는 현상이 발생하는 문제가 있었던 것이었다.
두 번째 난관은 비교적 평온하게 해결했다. 저가형 CPU다 보니 워낙 난관이 많았다 보니, 하드웨어 수정이 아닌 펌웨어나 소프트웨어 수정 작업은 그리 크게 느껴지지 않은 것이었다.
결국 DVD Write 하는 펌웨어, 소프트웨어도 직접 개발하여 PCI burst 를 512byte까지만 사용하도록 제약을 하였고, 직접 개발하게 되었으니 여기 서도 CPU를 최대한 쓰지 않게 하기 위하여 일반적인 DVD 백업처럼 iso 이미지 파일을 만든 후, 전송하여 굽는 방식이 아닌, 실시간으로 생성하여 iso 이미지를 저장할 공간 확보를 할 필요가 없도록 만들어, 백업 시간을 대폭 줄였다.
느린 CPU로 이것이 가능 한 이유는 DVD-writer들이 buffer under-run 방지 기술이 적용되어서 타이망의 제약을 받지 않아서 이기도 했다.
전화위복이라 하였던가, DVD-write 기능 직접 개발로 인해, 힘은 들었지만, 개발된 제품은 DVD backup이 타 제품보다 빠른 제품으로 인정받게 되었다.
중간에 예상치 못한 문제로 개발 기간도 2개월 가량 추가 되었고, sil3512 관련 부품이 추가되어 원가가 조금 오르긴 했지만, 목표했던 200$보다 저렴한 제품을 만들 수 있게 되었다.
다행히도 제품은 성공적으로 개발되어 보안회사에 무사히 납품할 수 있게 되었다.
댓글 없음:
댓글 쓰기