我用的是三星2440芯片,有人说用VirtualAlloc()与VirtualCopy()函数实现,我查了很多资料不知道怎么写好,比如我的IO口是GB5,GB6,GB7,GB8下面是他们的相关地址:
PORT B CONTROL REGISTERS (GPBCON, GPBDAT, GPBUP)
GPBCON 0x56000010
GPBDAT 0x56000014
GPBUP 0x56000018
其中GB5,GB6,GB7,GB8所在位为:
GPB8 [17:16]
GPB7 [15:14]
GPB6 [13:12]
GPB5 [11:10]
如用VirtualAlloc()与VirtualCopy()函数实现?
是的,在 WinCE 5.0 中,地址映射后,可以直接读写 IO ;
不过不知道能不能在 C# 中使用。
一般都放到驱动中读写硬件。
你想在汇编里面去写呢?还是在驱动里面去写?是在stepldr/eboot里写还是在driver里面写?
EBOOT里面:
volatile S3C2443_IOPORT_REG *s2443IOP = (S3C2443_IOPORT_REG *)(S3C2443_BASE_REG_PA_IOPORT);
s2443IOP->GPFDAT=(s2443IOP->GPFDAT&~(0x1f<<3))|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7); //D4~0
driver里面:
v_pIOPregs = (volatile S3C2450_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2450_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2450_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2450_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{。、。}
v_pIOPregs->GPCDAT &= ~(0x1 << 7);
不知道看明白了没有?
C#中应该不行。
可以用C++写成DLL,再用C#调用
c#应该可以的 通过虚拟地址衍射.我就是不知道怎么实现..
feishanm的想法也是可以 就是有点麻烦 我evc没怎么用过..
先用PLATFORM BULIDER或EVC 写一个IO流驱动程序,竖最好做成系统自动加载的.然后在VS2005 C#程序调用如下函数就可访问到IO了:
[DllImport("coredll.dll")]
private static extern IntPtr CreateFile(
String lpFileName, //file name
UInt32 dwDesiredAccess, //access mode
UInt32 dwShareMode, //share mode
IntPtr lpSecurityAttributes, //Security Attributes
UInt32 dwCreationDisposition, //how to create
UInt32 dwFlagsAndAttributes, //file attributes
IntPtr hTemplateFile //handle to template file
);
[DllImport("coredll.dll")]
public static extern bool ReadFile(
System.IntPtr h_comm,
int[] text,
int length,
ref int length2,
IntPtr overlap
);
[DllImport("coredll.dll")]
public static extern bool WriteFile(
System.IntPtr h_comm,
ref Byte WTtext,//Byte[] text,
int length,
ref int length2,
IntPtr overlap
);
如楼主还不清楚可留下邮箱,我发一个给你.
TO:andyhere
IO流驱动程序程序能发给我看下吗?,还有系统自动加载是怎么实现的,兄弟我的邮箱是pengxiyin@hotmail.com