device.c
来自「嵌入式系统开发 TOPPERS and JSP Kernel Release 」· C语言 代码 · 共 244 行
C
244 行
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: device.c,v 1.3 2002/04/10 11:20:09 takayuki Exp $ */#include "device.h"#include "messages.h"#include "hal_msg.h"#include "cpu_defs.h" //年眶猛の离咐 (ロ〖カルスコ〖プ)#define BLOCK 1#define NONBLOCK 0 //络拌恃眶の离咐struct tagDeviceGlobalVariables DeviceVars; //络拌恃眶の离咐 (ロ〖カルスコ〖プ)static unsigned char MessageBuffer[MAX_MSGSIZE];static DWORD MessageSize;Inline Lock(void){ dis_int(0); //EnterCriticalSection(&DeviceVars.cs); }Inline Unlock(void){ ena_int(0); LeaveCriticalSection(&DeviceVars.cs); } static BOOL Send(void * data, unsigned long size, int mode){ DWORD count; if(WriteFile(DeviceVars.ManagerSlot, data, size, &count,NULL) == 0) return FALSE; if(mode == BLOCK) if(WaitForSingleObject(DeviceVars.Blocker, DEVICE_TIMEOUT) != WAIT_OBJECT_0) return FALSE; return TRUE;}static DWORD WINAPI ListenerThread(LPVOID param){ while(1==1) { if(ReadFile(DeviceVars.ReplySlot,MessageBuffer,MAX_MSGSIZE,&MessageSize,NULL) == 0) break; switch(MessageBuffer[0]) { case MSG_ACK: case MSG_NAK: SetEvent(DeviceVars.Blocker); WaitForSingleObject(DeviceVars.ThreadBlocker,INFINITE); break; case MSG_KERREP_INTERRUPT: { char msg = MSG_ACK; HALInterruptRequest(*(int *)&MessageBuffer[1]); Send(&msg,1,NONBLOCK); break; } default: if( (MessageBuffer[0] & 0x80) != 0) { //手批妥滇にNAKで炳える char msg; msg = MSG_NAK; Send(&msg,1,NONBLOCK); } } } return 0;}void InitializeDeviceSupportModule(void){ unsigned char work = 0xff; char buffer[128]; int i; InitializeCriticalSection(&DeviceVars.cs); //メ〖ルスロット叹の疯年 i = wsprintf(buffer+1,"\\\\.\\mailslot\\toppers\\kernel%08x\\deviceport",GetCurrentProcessId())+1; work &= (DeviceVars.ReplySlot = CreateMailslot(buffer+1,MAX_MSGSIZE,MAILSLOT_WAIT_FOREVER,NULL)) != INVALID_HANDLE_VALUE; work &= (DeviceVars.Blocker = CreateEvent(NULL,FALSE,FALSE,NULL)) != INVALID_HANDLE_VALUE; work &= (DeviceVars.ThreadBlocker = CreateEvent(NULL,FALSE,FALSE,NULL)) != INVALID_HANDLE_VALUE; work &= (DeviceVars.ManagerSlot = CreateFile("\\\\.\\mailslot\\toppers\\device\\devicemanager",GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) != INVALID_HANDLE_VALUE; if(work) work &= (DeviceVars.ListenerThread = CreateThread(NULL,0,ListenerThread,NULL,NULL,&DeviceVars.ListenerThreadID)) != NULL; if(!work) { CloseHandle(DeviceVars.ManagerSlot); CloseHandle(DeviceVars.Blocker); CloseHandle(DeviceVars.ThreadBlocker); return; } *(unsigned char *)&buffer[0] = MSG_KERREQ_KERNELSTART; Send(&buffer,i,BLOCK); SetEvent(DeviceVars.ThreadBlocker);}void FinalizeDeviceSupportModule(void){ unsigned char msg; Lock(); if(DeviceVars.ListenerThread != NULL) { msg = MSG_KERREQ_KERNELEXIT; Send(&msg,1,BLOCK); TerminateThread(DeviceVars.ListenerThread,0); WaitForSingleObject(DeviceVars.ListenerThread,INFINITE); CloseHandle(DeviceVars.ListenerThread); DeviceVars.ListenerThread = NULL; CloseHandle(DeviceVars.Blocker); CloseHandle(DeviceVars.ThreadBlocker); CloseHandle(DeviceVars.ManagerSlot); CloseHandle(DeviceVars.ReplySlot); } Unlock(); DeleteCriticalSection(&DeviceVars.cs);}int DeviceRead(unsigned long address, unsigned long size, void * storage){ unsigned char buffer[16]; int result; if(size > MAX_MSGSIZE-9) return -1; Lock(); if(DeviceVars.ListenerThread == NULL) { Unlock(); return -1; } buffer[0] = MSG_KERREQ_READ; *(unsigned long *)&buffer[1] = address; *(unsigned long *)&buffer[5] = size; Send(buffer,9,BLOCK); if( MessageBuffer[0] == 0 ) { result = MessageSize - 1; if((unsigned)result > size) result = size; MoveMemory(storage, &MessageBuffer[1], result); }else result = -1; SetEvent(DeviceVars.ThreadBlocker); Unlock(); return result;}int DeviceWrite(unsigned long address, unsigned long size, void * storage){ unsigned char buffer[MAX_MSGSIZE]; int result; if(size > MAX_MSGSIZE-9) return -1; Lock(); if(DeviceVars.ListenerThread == NULL) { Unlock(); return -1; } buffer[0] = MSG_KERREQ_WRITE; *(unsigned long *)&buffer[1] = address; *(unsigned long *)&buffer[5] = size; MoveMemory( &buffer[9], storage, size); Send(buffer, 9+size, BLOCK); result = MessageBuffer[0] == 0 ? size : -1; SetEvent(DeviceVars.ThreadBlocker); Unlock(); return result;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?