如何用C#控制GPIO???

caterpillar54321 2010-12-29 02:33:59
操作系统是64位Win7

我要用C#来控制GPIO,请问该如何操作?

具体的需求是这样的,用C#做的一个截取屏幕的程序,读取指定区域图像的RGB信息,然后传给GPIO口

分别有8个GPI口和8个GPO口,我只需要用到GPO口就可以

SingleName PinNo. GPIO register DATA
*****************************************************
GOP_23 | 79 | LD6_CRD1[3] |0:low 1:high
GOP_22 | 78 | LD6_CRD1[2] |0:low 1:high
GOP_21 | 77 | LD6_CRD1[1] |0:low 1:high
GOP_20 | 76 | LD6_CRD1[0] |0:low 1:high
GOP_27 | 83 | LD6_CRD1[7] |0:low 1:high
GOP_26 | 82 | LD6_CRD1[6] |0:low 1:high
GOP_25 | 81 | LD6_CRD1[5] |0:low 1:high
GOP_24 | 80 | LD6_CRD1[4] |0:low 1:high


这两天一直忙活这个,但还是一点儿头绪也没有,在C#版里发帖也没人回,希望有知道的好心人麻烦给指点一下。

下面是从网上找的一段代码,不知道有什么问题。



[DllImport("kernel32.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern int DeviceIoControl(
IntPtr hDevice,
int dwIoControlCode,
byte[] lpInBuffer,
int nInBufferSize,
byte[] lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);

[DllImport("kernel32.dll")]
private static extern IntPtr CreateFile(
string lpFileName,
// 要打开的串口名称
uint dwDesiredAccess,
// 指定串口的访问方式,一般设置为可读可写方式
int dwShareMode,
// 指定串口的共享模式,串口不能共享,所以设置为0
int lpSecurityAttributes,
// 设置串口的安全属性,WIN9X下不支持,应设为NULL
int dwCreationDisposition,
// 对于串口通信,创建方式只能为OPEN_EXISTING
int dwFlagsAndAttributes,
// 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED( 重叠I/O操作 ),指定串口以异步方式通信
int hTemplateFile
// 对于串口通信必须设置为NULL
);

private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;

public Form1()
{
InitializeComponent();
}

private void GPIO测试_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
IntPtr gpiodriver = CreateFile("GIO20:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
、、就是这一句出错


if (gpiodriver == (IntPtr)(-1))
{
MessageBox.Show("打开GPIO设备失败!");
}
else
{

int bytesReturned = 0;
DeviceIoControl(gpiodriver, 0x01, null, 0, null, 0, ref bytesReturned, IntPtr.Zero);
}
}



还有今天主板的公司发来邮件说“编写M840主板GPIO 需要用Winddk(Vc6+winddk VS2005)来编写.SYS和Dll的库

AP随便用哪个版本写,VC, .NET都可以写”

还想请教一下这个.sys和dll该如何写。

问的问题有点儿多,还望不吝赐教!!!

我再多加点儿分!!!
...全文
2056 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
caterpillar54321 2011-01-07
  • 打赏
  • 举报
回复
谢谢各位,感激不尽
这就结贴给分
曹大夯 2011-01-04
  • 打赏
  • 举报
回复
其实#5楼已经提到了WinIO直接控制。如果系统已经配置完该IO了,用WinIO就不用重写驱动了。

#5楼在这个坛子里面好像还发布过WinIO的VB的例子好像。。。。。具体的俺不太记得了。可以直接问问他。:P
zswolf2000 2011-01-03
  • 打赏
  • 举报
回复
你需要先有个GPIO controller的驱动,然后你通过DeviceIOControl去操作这个控制器。
caterpillar54321 2011-01-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 huntercao 的回复:]
忘记了另外一个很强悍的IO工具:winio (http://www.internals.com/utilities_main.htm)

该项目有驱动源码和工具源码。
[/Quote]

现在主要是写驱动的整个流程我自己还迷糊,没有整体的概念。。。
曹大夯 2010-12-31
  • 打赏
  • 举报
回复
1. 请再仔细看看设备管理器。特别是Ports目录下的设备,看看到底有没有什么设备和这个端口连接。可以用by connect的方式看所有的设备。

2. 很可能,主板自带的驱动已经把对应的端口配置好了。你可以直接访问对应的I/O端口。用DevTree看看,系统里面有没有对应的Port端口。在你的代码里面,把CreateFile的第一个参数设置对了就OK了。

3. 可以考虑向Via或者Fintek要F81865芯片的DataSheet,他们公司里面肯定有人知道如何访问控制GPIO。

4. 或者通过驱动控制Port I/O。可以参考PortIO - How to read & write to I/O ports:
http://msdn.microsoft.com/en-us/library/ff558710(VS.85).aspx。
YTerrenceLau 2010-12-31
  • 打赏
  • 举报
回复
开发驱动的学习曲线毫无疑问是比较长的,如果你要从驱动开始开发,即使是这么简单的一个驱动估计整个项目做下来也得3个月到半年时间,所以你需要尽你最大努力找到驱动程序,当然你如果有时间,想研究研究也可。
caterpillar54321 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 huntercao 的回复:]
你的主板是这个吧 VIA+EPIA-M840:http://www.via.com.tw/en/products/embedded/ProductDetail.jsp?productLine=1&id=1230
里面有一个LPC接口的Super I/O (Fintek, F81865)

主板的ChipSet驱动包里面,应该包含有该模块的驱动的。所以,你还是在设备管理器里面看看,到底……
[/Quote]

看了,设备管理器中没有GPIO的设备。。
曹大夯 2010-12-31
  • 打赏
  • 举报
回复
忘记了另外一个很强悍的IO工具:winio (http://www.internals.com/utilities_main.htm)

该项目有驱动源码和工具源码。
caterpillar54321 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yterrencelau 的回复:]
开发驱动的学习曲线毫无疑问是比较长的,如果你要从驱动开始开发,即使是这么简单的一个驱动估计整个项目做下来也得3个月到半年时间,所以你需要尽你最大努力找到驱动程序,当然你如果有时间,想研究研究也可。
[/Quote]

今天在看关于windows驱动方面的东西,看的比较晕。。。

思路完全没有



caterpillar54321 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 airskys 的回复:]
一般硬件操作,主板提供商都会提供c++下的实现方法,你把这些功能做一个dll控件,实现GPIO的所有操作
然后留出接口,在C#里面直接调用就可以了
[/Quote]

这个我已经问过了,这个公司什么实现方法都没有,gpio的驱动要自己来写。

但是还是很奇怪为什么不能用api现有的来直接用。。。
airskys 2010-12-30
  • 打赏
  • 举报
回复
一般硬件操作,主板提供商都会提供c++下的实现方法,你把这些功能做一个dll控件,实现GPIO的所有操作
然后留出接口,在C#里面直接调用就可以了
曹大夯 2010-12-30
  • 打赏
  • 举报
回复
你的主板是这个吧 VIA+EPIA-M840:http://www.via.com.tw/en/products/embedded/ProductDetail.jsp?productLine=1&id=1230
里面有一个LPC接口的Super I/O (Fintek, F81865)

主板的ChipSet驱动包里面,应该包含有该模块的驱动的。所以,你还是在设备管理器里面看看,到底有没有对应的设备。
caterpillar54321 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 veron_04 的回复:]
可以考虑使用WinIO.Dll来直接操作端口。
[/Quote]

如果自己来写dll的话,是不是写成coredll或者kernel那种形式,但是只知道里面有CreateFile和DeviceIoControl函数,具体的实现过程不知道,这个该怎么弄呢
caterpillar54321 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huntercao 的回复:]
哦.

那就是说,M840的主板GPIO自带有驱动程序支持?

你可以试着在设备管理器里面看看有没有对应的设备和驱动程序.
还可以考虑用DevTree工具,看看是不是你的CreateFile的第一个参数写得不对.
DevTree下载: http://www.osronline.com/article.cfm?article=97
[/Quote]

恩,我也觉得是第一个参数可能有问题,但是也不知道该怎么写。

今天给威盛主板的人打电话,居然告诉我说不能用API,只能自己来写dll。。。
贝隆 2010-12-29
  • 打赏
  • 举报
回复
可以考虑使用WinIO.Dll来直接操作端口。
曹大夯 2010-12-29
  • 打赏
  • 举报
回复
哦.

那就是说,M840的主板GPIO自带有驱动程序支持?

你可以试着在设备管理器里面看看有没有对应的设备和驱动程序.
还可以考虑用DevTree工具,看看是不是你的CreateFile的第一个参数写得不对.
DevTree下载: http://www.osronline.com/article.cfm?article=97
caterpillar54321 2010-12-29
  • 打赏
  • 举报
回复
M840主板是威盛公司出的一个主板,详细的介绍我这只有pdf的文档。。。这上面基本上什么也没说

我在上面装的是Win7操作系统。这段代码应该是调用现有的api来对gpio口进行操作吧,反正我的理解是这样的。。。

曹大夯 2010-12-29
  • 打赏
  • 举报
回复
操作GPIO,相当于是操作外设,需要有驱动程序支持。

M840主板是什么?有详细介绍么?

你贴出来的代码像是控制串口设备的代码,你的M840主板是通过串口和你的操作系统打交道么?
caterpillar54321 2010-12-29
  • 打赏
  • 举报
回复
来个人给指点一下吧

21,615

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧