반나절 삘삘 노력해서 겨우 16x16을 출력하도록 수정했다. ㅎㅎ

자모 다 넣고 완성형 한글을 넣어서 이제 잘나온다.
>ㅁ<)/~ 잇힝~ 좋구나아~

사용자 삽입 이미지
대단한걸.. @0@)/~

이거 완전 거의 Application을 짤 수 있도록 만들어놨네...

정말 대단.. @0@)/~
가에서 부터 힝까지만 있는 거였군....

계산하는 알고리즘이 0xb0a1을 0으로 하는 base를 사용하더라... ㅠ_ㅠ..

그럼 자음에 대한 폰트는 내가 만들어서 써줘야 하는건가?? ㅡ_ㅡa...

크윽... 뭔가 일이 커지는 듯한... 폰트 생성 툴이라도 만들던지 해야지 원....

앗싸~ 한글/영문 출력~~!!

아직 약간 좀 이상하긴 하지만 되긴 된다...

한 비트 때문에 삽질을 오만상 하긴 했지만.. ㅡ_ㅡa...

뭐 되긴 된다는거 ㅋㅋ


사용자 삽입 이미지

사이트를 돌다가 여기저기 들러서 스펙이랑
메모리 구조랑 보면서 이것 저것 했다...

개발에 대한 준비랄까...
뭐 일단 메모리 구조와 코어는 필수니까 열심히 보고 있는데...

보면 볼 수 록 괜찮다는 생각이 든다...
괜찮은 개발 Library도 있고... ㅜ_ㅜ

왠지 할일이 확~ 줄어든 듯 하기는 하지만...
기분은 참 좋은... ㅎㅎ

당분간 심심하지는 않겠구만 ㅋㅋ
어.. 이상하다. ㅡ_ㅡ;;; 분명 Interrupt Vector는 Address 0x00000000 에서 시작한다. 그리고
이 영역은 현재 Flash가 차지하고 있다. 음... 그렇다면 Kernel에서 Boot Loader가 mapping
한 interrupt vector를 다시 Kernel에 맞게 remapping을 할 일이 분명 있을텐데......
어떻게 하는거지?? 설마 그냥 Flash에 Write를 해버리는건가?? ㅡ_ㅡ;;;
만약 그렇다면 kernel이 이상하게 되서 Vector를 복구하지 못하고 죽어버렸을때는, 문제가 심각
해 질것인데... 으음... 아니면 Remapping용으로 무언가 있는건가??
한번 찾아봐야겠다. @0@/~~
ldmia A, B 명령어는 A 어드레스에서 B에 있는 레지스터의 개수만큼 순차적으로 읽어 B에 저장하는 역할을 하는 명령어입니다. ^^;;;

lr 뒤에 붙은 "!"는 ldmia를 수행하고 난 뒤에 lr 레지스터의 값을 변경하여, 읽은 레지스터의 개수만큼 어드레스를 증가시키라는 뜻입니다.

B의 명령어가 위처럼 { r0 - r12, pc }라면 A 어드레스부터 4byte * 14개를 읽어서 순차적으로 r0->r12, pc에 저장한다음, lr 레지스터의 값은 "lr = lr + 14 * 4" 되는 것이지요.

그리고 lr 뒤에 붙은 "^" 표시는 ldmia의 대상 레지스터로 pc가 지정되어 있는 경우, SPSR 레지스터의 값이 CPSR 레지스터로 복사가 됩니다.

코드를 보면 대충 눈치채셨겠지만... 예전에 만들었던 OS의 태스크 스위칭 코드의 일부입니다. ^^;; 지금음 오래되서 기억도 안나는데... LDMIA로 검색해서 들어오시는 분들이 꽤 되서 내용을 보강합니다. ^^

그럼 좋은 하루 되세요 ;)

ps) http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/BABEFCIB.html 로 가시면 ARM 명령어에 대한 자세한 설명을 보실 수 있습니다. ^^


아래는 원래 블로그에서 옮겨온 원본 글입니다. ^^;;;

===========================================================================================================
이 명령에서 제대로 실행이 안되고 뻣는 이유는... ㅡ_ㅡ;;;
도데체 무엇이란 말인가?? ㅡ_ㅡ;;;;;
분명 IRQ Mode이고 SPSR 레지스터도 잘 설정해 줬건만... 뻗어버리는 이유는.. ㅡ_ㅡ;;;;
으으.. ^를 빼면 그래도 스위칭하는데 별 문제가 없어보이는데....
것참 이상하네......
먼가 다른 이유가 있을것도 같은데, 쿨럭...;;;
어려워 어려워.. @0@/~~
오오~~ @0@/~~ 드뎌 좀 되기 시작했다.
이때까지 ldmia ...^ 해서 뻣던건, 실제로 뻗은게 아니라 OS Timer를 초기화 해주는걸 또
까먹어서 열심히 Interrupt 루틴이 불리고 있던 것이었다. @0@/~~
크아~~ 이런 낭패가.. ㅡ_ㅡ;;; 역시 머리가 나쁘면 손발이 고생하는거 같다.
머 그외에 ARM을 잘 몰라서 내멋대로 작성한 코드가 지멋대로 동작해서(당연한가?? ㅡ_ㅡ;;)
문제가 좀 됬었는데, 참고 문헌을 좀 뒤지고 해서 해결을 봤다.

지금은

내멋대로 작성한 코드가 내가 의도한대로 동작하고 있어서 다행이다. ㅋㅋㅋ
여튼 참... 하나라도 어디 쉽게 넘어가는게 없구만. 쩝쩝...
이제 C 코드로 만든 커널을 컴팔해서 뒤에 붙여넣은 다음 적절한 메모리 위치에 로드해서
사용하는 것만 고민하면 될것 같기도 하다.

음... 그나저나 역시 코드는 지저분하군... ㅡ_ㅡ;;;
잘 모르는 상태에서 마구 코딩한거니 어쩔 수 없는건가... 쿠.. 쿨럭..;;;;
Vector Table을 재구성한 뒤... 재실행한 결과....
Interrupt가 계속 튄다.. @0@/~
머지?? IRQ Interrupt Vector에 Led On/Off를 넣어놓으니 그것만 계속 켜졌다 꺼졌다 한다.
쿨럭..;;;
확실히 먼가 이상하다. 분명 Enable된 Vector는 OS Timer께 맞고 이놈의 Interrupt는 특정조건
을 만족해야 계속 튀게 되어있는데, 특정 조건이란게 순식간에 맞을 정도로 만만한게 아닌
것을....... ㅡ_ㅡ;;;;
혹시 내가 Interrupt Mask를 OS Timer가 아니라 다른걸 Enable한걸까??
당췌 잘 몰것네.. 쩝쩝...
OS Timer Interrupt가 죽어라고 발생하여, 해결방법을 찾던 중... 얼핏 ezboot 소스가 생각났
다. 음... 이놈도 필시 OS Timer를 이용하리라고 생각되어 소스를 뒤지던중...
내가 생각지도 못한 코드를 발견했는데... 그 코드는 이러하였다.

OSSR = OSMR0

이것이 무엇인고 하니, Status Register를 0으로 초기화 하는게 아니라 1로 초기화 하는 것이
었다.

SA-1110 Manual의 표에는 다음과 같이 나와있다.


bit 0, M0, 0 - OS Timer match Register 0 has not matched the OS Timer counter sind the last clear.
1 - OS Timer match Register 0 has matched the OS Timer counter.



이런 문장을 보면 누구라도 딱 일케 생각하지 않나??

"음.. 그래 그람 초기화는 0으로 해야지.. ㅡ_ㅡ;;;"

쿨럭..;;; 나만 그런가.. ㅡ_ㅡ;;;; 머 그래가지고 0으로 초기화 하니 줄창 Interrupt가 끝도없이
뜨더랬다.
1로 초기화 하는 코드를 보고 다시 SA-1110 Manual을 보니 다음과 같은 문장이 눈에 들어온다.

"and cleared by writing a one to the proper bit position. Writing zeros to this register has no effect."

컥.. ㅡㅁㅡ... 이말인 즉슨 걍 니가 멀하든간에 해당 비트를 무조건 1로 셋팅해라는 말이었던 것인가??
실제로 IRQ Interrupt가 발생했을 때, OSSR를 보면 해당 비트에 1이 설정되어있다. 그리고 다시
내가 1로 한번더 설정해 줘야 정상적인 Interval로 Interrupt가 발생된다.
쿠.. 쿨럭...;;;
나보고 어쩌라고.. ㅡㅁㅡ;;;;;
죽어도 모를뻔 했다. 쩝쩝.... 여튼 황당.... ㅡ_ㅡ;;;;
컥.. 어제 저녁에 삽질을 좀해서 OS Timer를 Enable 할 수가 있었다.
그런데 이상한것은 이놈이 interrupt가 발생하면 FIQ Handler가 불리는 것이었다.
분명 Interrupt Register의 Level Register는 모두 IRQ Interrupt로 설정된 상태였는데.... ㅡ_ㅡ;;
IRQ Handler를 부르게 할려고 혹시나 값을 바꾸면 될까해서 여러가지로 노력해 봤으나...
나온 결론은 두가지...

OS Timer는 IRQ Interrupt로 설정된게 확실하다.
지금 튄 Interrupt는 분명 IRQ Interrupt다. (비록 FIQ Handler가 불리긴 하지만.. ㅡ_ㅡ;;; )

오늘 혹시나 해서 Vector Table에 대한 문서를 보니... 컥.. 아래와 같았다.

0x00000000 Reset Handler
0x00000004 Undefined Instructions Handler
0x00000008 Software Interrupt Handler (SWI)
0x0000000C Prefetch Abort Handler
0x00000010 Data Abort Handler
0x00000018 IRQ Interrupt Handler
0x0000001C FIQ Interrupt Handler

음.. 머가 이상한지 처음엔 몰랐지만 Address를 보면 0x00000014 부분이 사용되지 않고 있었
던것이다. @0@/~~
이런.. 난 걍 문서에 나온 Vector Handler의 순서만보고 그냥 연번호로 할당했으니

0x00000014 IRQ Interrupt Handler
0x00000018 FIQ Interrupt Handler 가 될 수 밖에~~ @0@/~~

머여... 강조 같은걸 써서라도 좀 눈에 띄게 해놓던가.... ㅡ_ㅡ;;;;
삽질만 했네 그려.. 쿨럭..;;;;
쿨럭..;;; 어제 실컷 해보고 알았는데, SWI 명령으로 발생하는 interrupt는 Interrupt핀을
통해 발생하는 Interrupt와는 달랐다.
Vector Table에 위치하는 곳도 다르고, 무엇보다 중요한것은 SVC Mode라는 것이다.
음냥.. Reset을 했을때 Mode가 이미 SVC 이기땜시롱 SWI를 통해 Interrupt를 발생
시키면 그냥 brench 한것과 마찬가지 결과가 된다.

또 IRQ Interrupt와 SWI의 다른점은
SWI Interrupt는 lr에 들어가있는 Address가 SWI 바로 뒤의 명령을 가리키고
IRQ Interrupt는 lr에 들어가있는 Address가 다음에 수행할 명령의 다음 명령(??)

Thumb Mode가 아닌 경우 Next Instruction + 4
Thumb Mode인 경우 Next Instruction + 2
를 가지므로 lr에 4 or 2를 sub해 줘야 정상적으로 동작된다는 결론~~

으으.. ㅡ_ㅡ;;;
x86은 int 명령하고 IRQ Interrupt가 별차이가 없는데... 야들은 왜 일케 틀린지 모르겠
다.
여튼 SWI로 테스트를 해보겠다는 나의 생각은 무~ 로 돌아가고... ㅡ0ㅜ/~~
그냥 OS Timer를 이용해서 해야겠다.

쉽지 않구만... ㅡ_ㅡ;;;;;;;;
쿨럭..;;; 오늘 Memory Setting을 좀 해볼려고 문서를 딱 펴 들었는데...






다.

@0@/~~

머 연결방법하고 라인수에 따라서 Memory Register에 설정해주는 값이 틀리던데...
아아~~ 어찌 연결된줄 알고 한단 말이냐아아아아아~~ ㅡ0ㅠ...
그래서 걍 한참을 고민하다가...
기존의 부트로더 Memory Setting 코드를 그대로 Dump해서 테스트했다.
역시나 잘되는군.. ㅡ_ㅡ;;;
함 잡아볼려고 맘 먹었는데... 굉장히 복잡하네...
DSP의 MCBSP 설정만큼 황당한거 같다. 쿨럭..;;;
크윽.. ㅡ0ㅠ... 난 너무 허접한거 같은....
아아아아아아~~ 모르겠다아아아아~~~
Interrupt Vector Table에 Reset을 제외한 나머지에 모두 같은 Function으로 brench
하게 설정한다음 SWI 0x01 일케 했다.
음~ LED에 불이 들어오는걸 확인했다. 으음... Software Interrupt를 발생하게하는건
x86이랑 거의 차이가 없네..
명령만 틀린거 같고... 흐음...

아웅.. 잠와...
아침이 왜이리 빡신지.. 모르겠다.
난주 생각해야지.. ㅡ_ㅡzZZ
음... Interrupt를 이용한 Context Switching을 고민하고 있는데...
User Level에서 Switching하는거 보다 약간 더 까다로운 문제가 있군.

첫째, Banked Register에 대한 처리 ( SP, LR )
둘째, Reenterance에 대한 처리

이 두가지가 문제가 되는거 같다.
머 사실 Baked Register는 CPSR을 조작하면 되는 문제인데, Reenterance는 쬐금
생각을 더 해봐야겠다.
지금까지의 생각은 Task끼리 Interrupt없이 Sleep() 같은걸 하기위해 Switching을
할때는 직접적으로 Switching 함수를 불러서 수행할 생각이었는데, 이것이 만약에
직접 Call한 Switching함수에서 Interrupt가 불려서 다시 스위칭이 될 경우...
현재 루틴에서는 문제가 발생할 소지가 있다. @0@/~~

간단히 하려고 생각하고 있는데, 자꾸 문제가 나오면서 점점 더 복잡한 로직으로
가는 듯도 하고.. ㅡ_ㅡ;;;
머 빵빵한 x86 같으면 Task 마다 IRQ, SVC Stack을 각각 할당하고
마구 Stack 전환을 난무(??) 하면서 할텐데... 이것도 사실 오바인거 같고.. Orz

흠.. 걍 Task끼리 Switching 할때도 SWI를 통한 Interrupt로 하도록 해서 단순화를
하는것도 생각해 볼만한거 같다.
일단 그람 그래해 볼까나??
훗.. @0@/~~
으으.. 어제 만든 Context Switching 코드를 테스트 한답시고 요것조것 바꿔가면서 하고있었는데, 아무리 해도 시나리오 대로 진행이 되지 않았다.
쿨럭..;;;

첫번째 문제는 Link를 한 목적파일의 코드가 Start Address 0 으로 정렬되지 않았다는 것이고, 두번째 문제는 DRAM쪽 메모리를 초기화 하지 않아서 DRAM쪽에 메모리를 아무리써 도 읽을때 내가 쓴 값이 아니라는 것이었다.

Start Address야 머, 역어셈하면서 왼쪽에 Address 나오는거 보고도 지나쳤고, DRAM쪽은....

초기화 해야하는지 몰랐다. @0@/~

이때까지 코드에 자동적으로 라인을 초기화하는 코드가 숨어있었기 땜시롱... ㅡ0ㅠ...
으으.. 몬산다 몬살아...
자.. 그람 또 MEMORY쪽을 살펴볼까...
크윽..;;; Orz
링크
앗쌀 좋구나 @0@/~~

이것도 한번 써봐야 쓰것다~
오늘 한 2시간 삽질한 결과 허접하게나마 Task Switching을 시험해 볼 수 있었다.
음.. 새로구한 ARM Emulator로 비교적 순조롭게 디버깅을 하면서 진행했는데, 상당
히 괜찮은 프로그램을 구한 것 같다는 생각이 든다.
@0@/~~ 어셈코드 마구 보여주고 메모리도 덤프해주고..
음냥 넘 좋은거 아니라..ㅋㅋㅋ

근데.. 역시 사람이 어떤걸 자주 접하게 되면 거기에 물드는거 같다.
처음에 Context를 저장하는걸 Stack에 안하고 따로 내가 만든 영역에 하려고 생각했
었는데, 워낙 예제 코드들이 자기 Stack에다가 저장하는걸 많이 보여줘서...

결국 내가 짠 코드는...
내가만든 영역에.. Stack Order로 저장하는.. 쿠.. 쿨럭..;;;;
디버깅하다가 한참을 헤맸다. 분명 되야하는데, 이놈이 거꾸로 들어간다 하면서...
당연히 거꾸로 들어갈 수 밖에.. Stack Order 명령을 줬으니.. ㅡ_ㅡ;;;;;
쩝.. 여튼 나중에 알고 깜짝 놀랐다. @0@/~~

이제 쫌만 더하면 안되겠나.. ㅋㅋㅋ
으음... Context Switching을 한번 해볼려고 어셈코드를 잡고 씨름중인데.. ㅡ_ㅡ;;;
어셈을 잘 모르니 참 답답하다. 일단 c 코드를 만든 다음 역어셈해서 나오는 어셈코드
를 중심으로 살펴보고는 있으나, 역쉬... 머리속에 그림이 잘 그려지지 않는다.
우째야 쓰까나...
코드는 대충 짜 놨는데, 잘 돌아가는지 테스트 할려니 넘 야심하네...
기분도 우울한데... 쩝쩝... 낼 해야 쓰겄다. @0@/~~
ARM Assembly
흠... 나름대로 괜찮은거 같은데, 일단 난주 둘러보기로 하자.
자야징... ( ^0^)r~~
여전히 부트코드를 돌아다니며 훓어보고 있는데 아래와 같은 루틴이 보였다.

FlashingWait:
mov r0, #FLASHING_DELAY
FlashingWait1:
subs r0, r0, #1
bne FlashingWait1 <<== 요기.. 주목...

sub 함수 밑에 바로 brench 명령이 딱 붙어있는 것이었다. 그것도 ne를 붙이고..
음.. sub도 s를 따라 붙이긴 했는데 멀까 하면서 ARM 문서를 신나게 뒤진 결과...
s가 붙으면 sub를 한 결과에 따라 cmp 명령처럼 Condition Field에 Update를 하는
것 같다.
음냥.. 그람 조걸 풀어쓰면..

sub r0, r0, #1
cmp r0, #0
bne FlashingWait1

으음.. 것참 신기하구만.. @0@/~~
약 30분 정도를 삽질한 끝에 시리얼로 데이터를 송신할 수 있게 되었다. 시리얼 설정하
는 레지스터가 PC의 메인보드에 달려있는 시리얼 설정하는 레지스터랑 거의 비슷해서
별 무리없이 된거 같다.
혹시 똑같은건가?? ㅡ_ㅡ;;; 워낙 오래되서 PC꺼는 생각이 잘 안나는데.. 쩝쩝...
메뉴얼을 보고 요것 조것 넣어가면서 어설프게 9600으로 송신하는걸 만들었으니,
이제 쫌더 손봐서 송수신 하도록 하고 Baud Rate도 쫌더 높여야겠다.
쩝... 이제야 먼가 되가는거 같군.
컥.. 이런.. 다른 PC에서 Cygwin을 깔고 툴을 컴파일하니까..




가 난다. ㅡ_ㅡ;;; 몬산다 몬살아... 이상하네 분명히 같은 버전인데 왜 여기서는
안될까나??
으으.. 머리에 스팀이 꽉차서 죽겠다. ㅡㅠㅡ;;;;
음냥.. 프로젝트 전체에 넘치는 Global 들로인해 드뎌 어디서 머가 되고, 어떤 파일에
이 Global 들이 있는지 파악하기 어려운 단계에 이르렀다.
쿨럭..;; 여튼 정리를 하긴 해야 할 것 같은데...
Class를 만들어서 처리를 할려고 하니 쓰는 곳이 한두군데가 아니어서 상당히 빡시게
구르고 있다.
완전 노가다다.. ㅡ_ㅡ;;;
우쒸... 이러다가 관절염 걸리겠네 그려...
아아.. 참 길고도 험한 여정이었다. ㅡ_ㅠ
Cache 땜시롱 한번 헤매고, EDMA 땜시롱 한번 헤매고, AD535 ADC 땜시롱 또 헤매
고... 음메, 왜 일케 빡신겨...
사실 Sampling 처리에 문제가 조금 있었는데, 내가 녹음한 MP3 파일은 44khz Stero
형식인데, C6711의 AD535는 Mono에 8khz다.
따라서 변환이 필요한데, 머 마땅히 어디서 손쉽게(??) 긁어올 수 있는 곳은 안보이고,
고민하던중 또 나의 얍삽이가 고개를 들었다. (어찌나 고마운지.. ㅋㅋ)

"음... 8khz는 44khz의 약 1/5 쯤이니까 버퍼를 5개씩 뛰어가면서 0xFFFE로 AND한
다음 그걸 담아서 EDMA로 전송하게 하면... +ㅁ+/~~"

지금 생각해보니, 정말 하드코어(??) 얍삽인데.. ㅡ_ㅡ;;; 여튼 급하니까 일단 구현을
했었다.
MP3 Codec이 한번 디코딩을 하면 4068(?? 확실치 않음)byte 정도의 데이터가 나왔
는데, 이걸 내가 만든 얍삽이로 play를 하게되면 아래와 같이 된다.


정상적인 44khz Stero를 쓸때 :
4068 / ( 44 * 1024 * 2 ) = 0.0451초

하드코어 얍삽이 + 8khz Mono를 쓸때 :
4068 / ( 2 * 5 ) / ( 8 * 1024 ) = 0.0497초


따라서 소리가 약간 늘어지고 거칠게 들리긴 하는데, 나름대로



고 생각한다. ㅡ_ㅡ;;;; (절대 타협하는건 아니고, 진짜 들을만 하다 +ㅁ+/~)
근데 허무한건, 난 아무것도 아직 한게 없다는 것이다.
기껏해야 EDMA랑 MCBSP랑을 연결해서 출력을 하게 했는데 걍 소리 나오고.. ㅡ_ㅡ;
C5510 할때는 실수 연산하는 함수까지 내가 만들어서 Clock을 줄일려고 난리쳤는데...
FPU의 힘을 강하게 느끼는 계기가 되었다.

없는놈이 있는 놈을 이기려면, 같은 조건가지고는 영 어렵겠군.
여튼 1차 완료~ @0@/~
음... 오늘 ARM 문서를 보면서 여러개의 레지스터의 값을 메모리로 저장하고, 메모리
에서 읽어오고 하는 문서를 봤는데... 역시 책으로만 보니 별로 잘 모르겠다. ㅡ_ㅡ;;
일단 명령을 실행하고 메모리를 보면 금방 알꺼 같은데.. 그러기 위해서는 눈으로
멀 표시하게 하는게 최고 우선인거 같다.
당장 붙어있는 놈이라고는 LED하고 시리얼 정돈데... LED로 보는건 좀 어의없는거
같고 그렇다면 역시 시리얼쪽을....... +ㅁ+
흠... 일단 UART쪽 프로그래밍을 쬐금 해서 write만 구현해 놓고 PC에서 확인하는
쪽으로 진행을 해야겠다.
LCD가 없으니 쫌 답답하군... ㅡ_ㅡ;;;
음냐.. ㅡ_ㅡ;;; MP3 디코딩된 버퍼를 EDMA를 통해 MCBSP로 AD535에 쏘고 있는데,
(얼래.. 말이 좀 희한하게 됬네. 단어의 나열같은...) 이놈이 잘 가다가 갑자기 MCBSP
에서 XRDY가 뜨지 않는다.
으음... 사인 버퍼를 넣으면 잘 출력되는데, MP3 디코딩된 버퍼를 넣으면 갑자기 어느
순간에 멈춘다.
AD535랑은 따로 제어 MCBSP를 쓰는건 아니고, 하나의 MCBSP로 음성 송수신,
AD535제어를 다 하고 있기 때문에...
아무래도 제어 문자가 있는거 같다. 음냥.. 어쩌징.. ㅡ_ㅡ;;;
낼 일단 AD535문서를 한번 뒤져볼 필요가 있겠다.
쿨럭..;; 머가 이래 빡신지.. 쩝쩝..
쿨럭.. ㅡ_ㅡ;;;; 오늘 AD535에 대한 문서를 줄줄이 뽑아서 읽어보던중... DSP -> AD535로 가는 Voice Data 중 0bit가 특별한 의미를 갖는다는걸 알았다.

0bit가 1로 설정되면 다음 16bit data는 Codec Register 설정에 대한 데이터를 의미하는 것이었었더랬었던 것이다.(?? ㅡ_ㅡ;;; 상당히 문법이 의심스러운... 갑자기 회사 사람이 이야기 해준 Hello,World 누가 길게 찍나가 생각나네.. ㅋㅋ)

쿨럭..;;
그렇다면 AD535는 0xFFFE로 AND 연산을 해준다음 데이터를 쏴야~ 제대로 소리가나온다는.. 쿨럭..;;;

여튼 그래서 AND를 해주고 데이터를 송신하니 별 이상없이 소리가 나긴 나는거 같다.
거참 어렵구만.. ㅡ_ㅡ;;;
쿨럭.. ㅡ_ㅡ;;;; 오늘 AD535에 대한 문서를 줄줄이 뽑아서 읽어보던중... DSP -> AD535로 가는 Voice Data 중 0bit가 특별한 의미를 갖는다는걸 알았다.

0bit가 1로 설정되면 다음 16bit data는 Codec Register 설정에 대한 데이터를 의미하는 것이었었더랬었던 것이다.(?? ㅡ_ㅡ;;; 상당히 문법이 의심스러운... 갑자기 회사 사람이 이야기 해준 Hello,World 누가 길게 찍나가 생각나네.. ㅋㅋ)

쿨럭..;;
그렇다면 AD535는 0xFFFE로 AND 연산을 해준다음 데이터를 쏴야~ 제대로 소리가나온다는.. 쿨럭..;;;

여튼 그래서 AND를 해주고 데이터를 송신하니 별 이상없이 소리가 나긴 나는거 같다.
거참 어렵구만.. ㅡ_ㅡ;;;

+ Recent posts