2012年12月31日月曜日

RaspberryPiでリモコン送信

更にPCMを使ってIRリモコンの送信側の設定です。
読み込んだデータは反転しているので、データを反転した上で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 件のコメント:

コメントを投稿