読み込んだデータは反転しているので、データを反転した上でHiの部分を38kHzで変調かけておきます。このため、GPIOCLKは38kHzのclkを作るために倍の76kHzにしました。
データを作成した後でPCMをkickしてデータを出力します。
データの処理ルーチンはこのあとupしておきます。
PCMの出力部分は以下のコードです。
-----
int PCMWrite(unsigned int *buf, int size) { // ret < 0 : error
pcm[PCMCS] = PCMCSSTBY | PCMCSEN;
pcm[PCMMODE] = PCMMODECLKDIS | PCMMODECLKM | (31 << SHIFT_PCMMODEFLEN) | (1 << SHIFT_PCMMODEFSLEN); // PCMCLK stop
pcm[PCMTXC] = PCMTXCCH1WEX | PCMTXCCH1EN | (0 << SHIFT_PCMTXCCH1POS) | (8 << SHIFT_PCMTXCCH1WID);
pcm[PCMMODE] = PCMMODECLKM | (31 << SHIFT_PCMMODEFLEN) | (1 << SHIFT_PCMMODEFSLEN); // PCMCLK start
pcm[PCMCS] = PCMCSSTBY | PCMCSTXERR | (3 << SHIFT_PCMCSTXTHR) | PCMCSTXCLR| PCMCSEN; // TXERR TXFIFO Clear
usleep(120); // 120us (> PCMCLK 26us x 4clk)
pcm[PCMCS] = PCMCSSTBY | (3 << SHIFT_PCMCSTXTHR) | PCMCSEN;
// fifo set
int c = 0;
while(pcm[PCMCS] & PCMCSTXW) {
pcm[PCMFIFO] = 0;
c++;
}
int error = 0;
pcm[PCMCS] = PCMCSSTBY | (3 << SHIFT_PCMCSTXTHR) | PCMCSTXON | PCMCSEN; // TXON
for(int i = 0; i < size; i++) {
while(!(pcm[PCMCS] & PCMCSTXW));
pcm[PCMFIFO] = buf[i];
if(pcm[PCMCS] & PCMCSTXERR) {
error = -1;
break;
}
}
while(!(pcm[PCMCS] & PCMCSTXE));
pcm[PCMCS] = PCMCSSTBY | PCMCSEN; // TXoff
return error;
}
0 件のコメント:
コメントを投稿