ドライバ開発とネットワークプログラミングT-Engineプログラミング入門(4)(4/6 ページ)

» 2006年09月08日 00時00分 公開
[中村 大真 パーソナルメディア株式会社,@IT MONOist]

リスト1 7セグメントLEDドライバ(T-Kernelベース)led.c


/*
  7セグメントLEDドライバ
  デバイス名: "led"
  データ番号 -100: 7セグメントLEDに値(1バイト:0〜99)を表示 (ライトのみ)
*/
#include <tk/tkernel.h>
#include <device/sdrvif.h> /* 単純デバイスドライバインタフェース */
/* リード関数: 読込処理 */
INT read_fn( ID devid, INT start, INT size, VP buf, SDI sdi )
{
  return E_PAR; /* リードは不可(パラメータエラー) */
}
/* ライト関数: 書込処理 */
INT write_fn( ID devid, INT start, INT size, VP buf, SDI sdi )
{
  if (start == -100 && size == 1) { /* 7セグメントLEDに値(0〜99)を表示 */
    int p[] = {0x24, 0x3f, 0x62, 0x2a, 0x39, 0xa8, 0xa0, 0x3e, 0x20, 0x28 };
    int x = *(B*)buf;
    if (x < 0 || x > 99) return E_PAR; /* 範囲外の値はパラメータエラー */
    out_h( 0x16100002, p[x / 10] ); /* 10の位の表示 */
    out_h( 0x16100000, p[x % 10] ); /*  1の位の表示 */
    return 1;
  } else return E_PAR; /* それ以外のデータ番号はパラメータエラー */
}
/* メイン関数: ドライバ登録処理 */
ER main( INT ac, UB *av[] )
{
  static SDI sdi;
  static SDefDev ddev = { NULL, "led", 0, 0, 0, 1,
    NULL, NULL, read_fn, write_fn, NULL };
  
  if ( ac >= 0 ) { /* ロード時 */
    return SDefDevice( &ddev, NULL, &sdi ); /* デバイス登録 */
  } else { /* アンロード時 */
    return E_NOSPT; /* サポートしない */
  }
}
リスト1 7セグメントLEDドライバ(T-Kernelベース)led.c

Copyright © ITmedia, Inc. All Rights Reserved.