ES1371再・再考

いまどきES137xの変なDMAに頭を痛めているのは私だけじゃないと知ってちょっとびっくりです。
だんだん、ES1371の言うループモードって、DMAチェーンのことじゃないかと思えてきました。つまり、割り込みハンドラはこんな感じじゃないかと。

if ( is_complete( buffer_A ) ){
  set_DMA_Start_Address( buffer_A );
  send_signal_to_bottom_half( buffer_A );
}
else if ( is_complete( buffer_B ){
  set_DMA_Start_Address( buffer_B );
  send_signal_to_bottom_half( buffer_B );
}

典型的なダブルバッファのコードです。バッファAの終了割り込みでバッファAをDMAアドレスとして設定するのは、一見奇異に見えます。しかし、この時点でDMAはバッファBのデータを転送中です。ここでセットするアドレスは、バッファBの転送終了時にロードされると仮定しています。バッファBの終了割り込み処理部のロジックは逆です。
ES1371をいじっているわけではありませんので、これで間違いないなどとは口が裂けても言いません。そもそも、バッファ転送後にDMAのポインタを修飾するあやしからんパラメータがあったりします。
すでに存在しない会社ですが、こういう分かりにくいICの設計者とデータシートの筆者を並べて小一時間ほど問い詰めたい気分です。
なんにせよ、一度ICHのAC97プログラミング・リファレンスを読んでしまうと、もうES1371をいじって見ようなんて気は起きません。インテル万歳だな。AMDユーザーだけど。