Beispiel #1
0
W 
writechar (ID port, ID resport, UB *buf, W length)
{
  DDEV_REQ		req;		/* 要求パケット */
  DDEV_RES		res;		/* 返答パケット */
  W			rsize;
  ER			error;
  W			i;
  
  req.header.mbfid = resport;
  req.header.msgtyp = DEV_WRI;
  req.body.wri_req.dd = 0xAA;
  req.body.wri_req.size = length;
  bcopy (buf, req.body.wri_req.dt, length);
  error = snd_mbf (port, sizeof (req), &req);
  if (error != E_OK)
    {
      dbg_printf ("cannot send packet. %d(%s, %d)\n", error, __FILE__, __LINE__);
      return;
    }
  rsize = sizeof (res);
  error = rcv_mbf (&res, (INT *)&rsize, resport);
  if (res.body.wri_res.errcd != E_OK)
    {
      dbg_printf ("%d\n", res.body.wri_res.errcd);
      return (0);
    }      
  return (1);
}
Beispiel #2
0
W 
putc (int ch, ID port)
{
  DDEV_REQ		req;		/* 要求パケット */
  DDEV_RES		res;		/* 返答パケット */
  W			rsize;
  ER			error;
  W			i;
  
  
  req.header.mbfid = dev_recv;
  req.header.msgtyp = DEV_WRI;
  req.body.wri_req.dd = 0xAA;
  req.body.wri_req.size = 1;
  req.body.wri_req.dt[0] = (char)(ch & 0xff);
  error = snd_mbf (port, sizeof (req), &req);
  if (error != E_OK)
    {
      dbg_printf ("cannot send packet. %d\n", error);
      return;
    }
  rsize = sizeof (res);
  error = rcv_mbf (&res, (INT *)&rsize, dev_recv);
  if (res.body.wri_res.errcd != E_OK)
    {
      dbg_printf ("%d\n", res.body.wri_res.errcd);
      return (0);
    }      
  return (1);
}
Beispiel #3
0
W
readchar (ID port, ID resport)
{
  DDEV_REQ		req;		/* 要求パケット */
  DDEV_RES		res;		/* 返答パケット */
  W			rsize;
  ER			error;
  W			i;
  
  req.header.mbfid = resport;
  req.header.msgtyp = DEV_REA;
  req.body.rea_req.dd = 0xAA;
  req.body.rea_req.size = 1;
  error = snd_mbf (port, sizeof (req), &req);
  if (error != E_OK)
    {
      printf ("cannot send packet. %d\n", error);
      return;
    }
  rsize = sizeof (res);
  rcv_mbf (&res, (INT *)&rsize, resport);
  if (res.body.rea_res.dt[0] != 0)
    {
      return (res.body.rea_res.dt[0]);
    }
  return (0);
}
void
task1(intptr_t exinf)
{
	ER_UINT	ercd;

	test_start(__FILE__);

	check_point(1);
	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = act_tsk(TASK4);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(4);
	ercd = snd_mbf(MBF1, string2, 25);
	check_ercd(ercd, E_OK);

	check_point(6);
	check_assert(strncmp(buf1, string2, 25) == 0);

	ercd = act_tsk(TASK3);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(13);
	ercd = snd_mbf(MBF1, string2, 10);
	check_ercd(ercd, E_OK);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string2, 10) == 0);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(24);
	ercd = chg_pri(TASK3, LOW_PRIORITY);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(34);
	ercd = chg_pri(TASK2, HIGH_PRIORITY);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #5
0
W
getchar (void)
{
  struct key_entry	ch;
  INT			size;
  
  rcv_mbf ((VP)&ch, &size, ITRON_KEYBOARD_MBF);
  return (ch.ch);
}
Beispiel #6
0
/* sfs_write_device - デバイスにデータを送る(そしてストレージに書き込む)
 *
 */
W
sfs_write_device (ID device, B *buf, W start, W length, W *rlength)
{
  DDEV_REQ	req;		/* 要求パケット */
  DDEV_RES	res;		/* 返答パケット */
  ID		res_port;
  W		errno;
  ID		send_port;
  UW		dd;

  errno = get_device_info (device, &send_port, &dd);
  if (errno)
    {
      return (errno);
    }

  res_port = get_port (sizeof (res), sizeof (res));
  if (res_port <= 0)
    {
      return (EP_NOMEM);
    }

  if (length > MAX_BODY_SIZE)	/* Kludge!! */
    {
      return (EP_INVAL);
    }

  req.header.mbfid = res_port;
  req.header.msgtyp = DEV_WRI;
  req.body.wri_req.dd = dd;
  req.body.wri_req.start = start;
  req.body.wri_req.size = length;
  bcopy (buf, req.body.wri_req.dt, length);
  errno = snd_mbf (send_port, sizeof (req), &req);
  if (errno != E_OK)
    {
      dbg_printf ("cannot send packet. %d\n", errno); 	/* */
      del_mbf (res_port);
      return (EP_NODEV);
    }
  
  *rlength = sizeof (res);
  errno = rcv_mbf ((UB *)&res, (INT *)rlength, res_port);
  if (errno != E_OK)
    {
      dbg_printf ("cannot send packet. %d\n", errno); 	/* */
      del_mbf (res_port);
      return (EP_NODEV);
    }
  
  *rlength = res.body.wri_res.a_size;
  del_mbf (res_port);
  return (res.body.wri_res.errinfo);
}
Beispiel #7
0
static W
read_device2 (ID device, W offset, UW dd, W size, void *buf)
{
  DDEV_REQ	req;		/* 要求パケット */
  DDEV_RES	res;		/* 返答パケット */
  ER		error;	
  W		rsize;
#ifdef notdef
  W		i;
#endif

/*  printf ("*** READ *** %d, offset = %d, size = %d\n", device, offset, size); */
  req.header.mbfid = dev_recv;
  req.header.msgtyp = DEV_REA;
  req.body.rea_req.dd = dd;
  req.body.rea_req.start = offset;
  req.body.rea_req.size = size;
  error = snd_mbf (device, sizeof (req), &req);
  if (error != E_OK)
    {
/*      printf ("cannot send packet. %d\n", error); */
      return (error);
    }
/*  printf ("kernel: snd_mbf\n");	/* */
  rsize = sizeof (res);
  rcv_mbf ((UB *)&res, (INT *)&rsize, dev_recv);
/*  printf ("read_device2: rcv_mbf\n");	/* */
/*  printf ("res.dd      = %d\n", res.body.rea_res.dd); */
/*  printf ("res.error   = %d\n", res.body.rea_res.errcd); */
/*  printf ("res.errinfo = %d\n", res.body.rea_res.errinfo); */
  if (res.body.rea_res.a_size > 0)
    {
/*      printf ("res.a_size  = 0x%x\n",  res.body.rea_res.a_size); */
      bcopy ((B*)res.body.rea_res.dt, buf, size);
    }
#ifdef notdef
  for (i = 0; i < 8; i++)
    {
      printf ("0x%x, ", res.body.rea_res.dt[i]);
    }
#endif
  return (E_OK);
}
Beispiel #8
0
static void
main_loop ()
{
  DDEV_REQ	req;	/* 受信する要求パケット */
  ER		errno;
  INT		rsize;

  /*
   * 要求受信 - 処理のループ
   */
  rsize = sizeof (req);
  for (;;) {

    /* 要求の受信 */
#ifdef undef
    errno = trcv_mbf (&req, &rsize, recvport, 51);
#else
    errno = rcv_mbf (&req, &rsize, recvport);
#endif
    switch (errno) {
    case E_OK:
      /* 正常ケース */
      doit (&req);
      break;

    case E_TMOUT:
    case E_RLWAI:
      break;
      
    default:
      /* Unknown error */
      dbg_printf ("KEYBOARD: get_req() Unknown error(error = %d)\n", errno);
      break;
    }

    if (send_switch) {
      send_switch = 0;
      send_switch_msg();
    }
  }

  /* ここの行には、来ない */
}
Beispiel #9
0
W send_switch_msg()
{
  DDEV_REQ	req;
  DDEV_RES	res;
  W		rsize;
  W		error;

  if (wconsole == 0) {
    if (find_port (WCONSOLE_DRIVER, &wconsole) != E_PORT_OK)
      return(E_DEV);
  }
  if (local_recv == 0) {
    local_recv = get_port (sizeof (DDEV_RES), sizeof (DDEV_RES));
    if (local_recv <= 0) return(E_NOMEM);
  }

  req.header.mbfid = local_recv;
  req.header.msgtyp = DEV_CTL;
  req.body.ctl_req.cmd = WC_CHGFCS;
  req.body.ctl_req.len = 0;
#ifdef notdef
  dbg_printf("KEYBOARD: send to wconsole\n");
#endif
  error = snd_mbf (wconsole, sizeof (req), &req);
  if (error != E_OK) {
    dbg_printf("KEYBOARD: can't send to wconsole %d\n", error);
    return (error);
  }
  rsize = sizeof (res);
#ifdef notdef
  dbg_printf("KEYBOARD: wait from wconsole\n");
#endif
  error = rcv_mbf (&res, (INT *)&rsize, local_recv);
#ifdef notdef
  dbg_printf("KEYBOARD: recv from wconsole\n");
#endif
  if (res.body.ctl_res.errcd != E_OK) {
    return (res.body.ctl_res.errcd);
  }
}
Beispiel #10
0
void
task3(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(7);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(12);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(14);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(18);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(20);
	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = chg_pri(TASK2, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(21);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #11
0
void
task4(intptr_t exinf)
{
	ER_UINT	ercd;
	T_RMBF	rmbf;

	check_point(3);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(5);
	ercd = ref_mbf(MBF1, &rmbf);
	check_ercd(ercd, E_OK);

	check_assert(rmbf.stskid == TASK1);

	check_assert(rmbf.rtskid == TSK_NONE);

	check_assert(rmbf.smbfcnt == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 25);

	check_point(8);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_point(15);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_point(19);
	ercd = chg_pri(TASK2, LOW_PRIORITY);
	check_ercd(ercd, E_OK);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_point(23);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(27);
	ercd = chg_pri(TASK3, LOW_PRIORITY);
	check_ercd(ercd, E_OK);

	check_point(30);
	ercd = chg_pri(TASK2, HIGH_PRIORITY);
	check_ercd(ercd, E_OK);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_point(33);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(37);
	ercd = chg_pri(TASK2, HIGH_PRIORITY);
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #12
0
void
task2(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(2);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(9);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	check_point(10);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(11);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(16);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(17);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(22);
	ercd = snd_mbf(MBF1, string2, 10);
	check_ercd(ercd, E_OK);

	check_point(25);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string2, 10) == 0);

	ercd = chg_pri(TASK3, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(26);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(28);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = chg_pri(TASK3, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(29);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(31);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = chg_pri(TSK_SELF, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(32);
	ercd = snd_mbf(MBF1, string2, 10);
	check_ercd(ercd, E_OK);

	check_point(35);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string2, 10) == 0);

	ercd = chg_pri(TSK_SELF, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(36);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(38);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string1, 26) == 0);

	check_finish(39);
	check_point(0);
}
void
task1(intptr_t exinf)
{
	ER_UINT	ercd;

	test_start(__FILE__);

	set_bit_func(bit_kernel);

	check_point(1);
	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = act_tsk(TASK3);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(4);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(5);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(8);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(13);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(15);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(18);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(20);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(23);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(29);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(31);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(34);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(36);
	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(38);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(41);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(48);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(51);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = wup_tsk(TASK3);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(63);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(65);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #14
0
/*
 * ポートマネージャにメッセージバッファ情報を登録する。
 * この関数の中で一時的に受信用のメッセージポートを作成する。
 *
 */
PORT_MANAGER_ERROR
regist_port (PORT_NAME *name, ID port)
{
  struct recv_port_message_t	recv_msg;
  struct port_manager_msg_t  	send_msg;
  ID			     	recv_port;
  W			     	rsize;


  /*
   * ポートマネージャからの返答受けつけ用のメッセージバッファ作成。
   */
  recv_port = get_port (sizeof (recv_msg), sizeof (recv_msg));
  if (recv_port == 0)
    {
#ifdef DEBUG
      dbg_printf ("regist_port: cannot get port.\n");
#endif /* DEBUG */
      return (E_PORT_SYSTEM);
    }

  /*
   * ポートマネージャへ送る要求メッセージを作成。
   */
  send_msg.hdr.type  = REGIST_PORT;
  send_msg.hdr.size  = sizeof (send_msg);
  send_msg.hdr.rport = recv_port;
  strcpy (&(send_msg.body.regist.name), name);
  send_msg.body.regist.port = port;

#ifdef DEBUG
  dbg_printf ("regist_port: name = <%s>\n", &(send_msg.body.regist.name));
#endif /* DEBUG */

  /*
   * ポートマネージャに対して登録要求メッセージを送信する。
   */
  if (snd_mbf (PORT_MANAGER_PORT, sizeof (send_msg), &send_msg) != E_OK)
    {
      del_mbf (recv_port);
      return (E_PORT_SYSTEM);
    }

#ifdef DEBUG
  dbg_printf ("port_manager:snd_msg: ok.\n");
#endif /* DEBUG */

  /*
   * ポートマネージャからの返答メッセージの受けつけ
   */
  if (rcv_mbf (&recv_msg, &rsize, recv_port) != E_OK)
    {
      del_mbf (recv_port);
      return (E_PORT_SYSTEM);
    }

#ifdef DEBUG
  dbg_printf ("port_manager:rcv_msg: ok.\n");
#endif /* DEBUG */


  /*
   * 使いおわった返答受信用のメッセージバッファを削除する。
   */
  del_mbf (recv_port);

#ifdef DEBUG
  dbg_printf ("port_manager: errno = %d\n", recv_msg.error);
#endif /* DEBUG */
  return (recv_msg.error);
}
void
task2(intptr_t exinf)
{
	ER_UINT	ercd;

	switch (++task2_count) {
	case 1:
		check_point(2);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 2:
		check_point(6);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 3:
		check_point(11);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 4:
		check_point(16);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(19);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(21);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(24);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(27);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(32);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(37);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(39);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(43);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(46);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(52);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(54);
		ercd = tslp_tsk(1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(55);
		ercd = rcv_mbf(MBF1, buf1);
		check_ercd(ercd, 26);

		check_assert(strncmp(buf1, string2, 26) == 0);

		check_point(56);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(58);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(61);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_finish(66);
		check_point(0);

	default:
		check_point(0);
	}
	check_point(0);
}
Beispiel #16
0
W
ether (W ac, B **av)
{
  DDEV_REQ		req;		/* 要求パケット */
  DDEV_RES		res;		/* 返答パケット */
  W			rsize;
  ER			error;
  ID			recv;
  ID			console;


  if (ac < 1)
    {
      printf ("usage: ether command\n");
      printf ("             reset\n");
      printf ("             probe\n");
      printf ("             init\n");
      printf ("             macaddr\n");
      printf ("             arp\n");
      printf ("             \n");

      return (0);
    }

  recv = get_port (sizeof (DDEV_RES), sizeof (DDEV_RES));
  if (recv <= 0)
    {
      return (E_SYS);
    }

  if (find_port (NE2000_DRIVER, &console) != E_PORT_OK)
    {
      return (E_SYS);
    }

  if (strcmp (av[1], "reset") == 0)
    {
      /* Ether adaptor reset */

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_RESET;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}      
    }
  else if (strcmp (av[1], "probe") == 0)
    {
      /* Ether adaptor probe */

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_PROBE;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}      
    }
  else if (strcmp (av[1], "init") == 0)
    {
      /* Ether adaptor initialize */
    }
  else if (strcmp (av[1], "macaddr") == 0)
    {
      W		i;

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_GETMAC;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  del_mbf (recv);
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}

      printf ("mac address: ");
      for (i = 0; i < MACADDRLEN; i++)
	{
	  printf ("%x ", res.body.ctl_res.res[i]);
	  my_macaddr[i] = res.body.ctl_res.res[i];
	}
      printf ("\n");
    }
  else if (strcmp (av[1], "arp") == 0)
    {
#define MYADDR	0xC0A80003
#define htons(s)	(UH)(((UH)s << 8) | ((UH)s >> 8))

      struct arp_buf
      {
	UB	dest_ether[6];
	UB	src_ether[6];
	UH	ether_type;

	UH	hardware;
	UH	protocol;
	UB	hardware_length;
	UB	protocol_length;
	UH	opcode;
	UB	sender_macaddr[6];
	UB	sender_ip[4];
	UB	target_macaddr[6];
	UB	target_ip[4];
      } arp;
      W		i;

      for (i = 0; i < 6; i++)
	{
	  arp.src_ether[i] = my_macaddr[i];
	  arp.dest_ether[i] = 0xff;

	  arp.sender_macaddr[i] = my_macaddr[i];
	  arp.target_macaddr[i] = 0xff;
	}
      arp.ether_type = 0x0608;

      arp.sender_ip[0] = 192;
      arp.sender_ip[1] = 168;
      arp.sender_ip[2] = 0;
      arp.sender_ip[3] = 3;
      for (i = 0; i < 4; i++)
	{
	  arp.target_ip[i] = 0xff;
	}
      arp.hardware = htons (1);
      arp.protocol = htons (0x0800);
      arp.hardware_length = 0x06;
      arp.protocol_length = 0x04;
      arp.opcode = htons (1);

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_WRI;
      req.body.wri_req.dd = 0;
      req.body.wri_req.start = &arp;
      req.body.wri_req.size = sizeof (arp);
      get_tid (&req.header.tskid);

      printf ("send ether\n");
      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  del_mbf (recv);
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}
    }
  else
    {
      printf ("Unknown command: %s\n", av[1]);
      del_mbf (recv);
      return (1);
    }

  del_mbf (recv);
  return (0);
}
void
task3(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(3);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(7);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(9);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(10);
	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(12);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(14);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(17);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(22);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(25);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(26);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(28);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(30);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	check_point(33);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(40);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(44);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(45);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(47);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(49);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(53);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(57);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(59);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(60);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(62);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(64);
	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #18
0
/* sfs_read_device - デバイスからデータを読み込む
 *
 */
W
sfs_read_device (ID device, B *buf, W start, W length, W *rlength)
{
  DDEV_REQ	req;		/* 要求パケット */
  DDEV_RES	res;		/* 返答パケット */
  ID		res_port;
  W		errno;
  W		rest_length;
  W		rsize;
  ID		send_port;
  UW		dd;

  errno = get_device_info (device, &send_port, &dd);
  if (errno)
    {
      return (errno);
    }

  res_port = get_port (sizeof (res), sizeof (res));
  if (res_port <= 0)
    {
      return (EP_NOMEM);
    }

#ifdef notdef
  printk ("sfs_read_device: start = %d, size = %d\n", start, length);
#endif /* FMDEBUG */

  *rlength = 0;
  for (rest_length = length; rest_length > 0; rest_length -=  BLOCK_SIZE)
    {
      req.header.mbfid = res_port;
      req.header.msgtyp = DEV_REA;
      req.body.rea_req.dd = dd;
      req.body.rea_req.start = start + (length - rest_length);
      req.body.rea_req.size
	= (BLOCK_SIZE > rest_length) ? rest_length : BLOCK_SIZE;
      errno = snd_mbf (send_port, sizeof (req), &req);
      if (errno != E_OK)
	{
	  dbg_printf ("cannot send packet. %d\n", errno); 	/* */
	  del_mbf (res_port);
	  return (errno);
	}
  
      rsize = sizeof (res);
      errno = rcv_mbf ((UB *)&res, (VP)&rsize, res_port);
      if (errno != E_OK)
	{
	  dbg_printf ("cannot send packet. %d\n", errno); 	/* */
	  del_mbf (res_port);
	  return (errno);
	}
      else if (res.body.rea_res.errinfo != E_OK) {
	  del_mbf (res_port);
	  return (res.body.rea_res.errinfo);
      }

      bcopy (res.body.rea_res.dt, &buf[length - rest_length],
	     res.body.rea_res.a_size);
      *rlength += res.body.rea_res.a_size;
    }

  del_mbf (res_port);
  return (E_OK);
}