【米尔MYC-JX8MPQ评测】三、gpio应用编程
<div class='showpostmsg'><p>gpio操作可以通过sys文件系统接口,文件系统 gpio 操作 在文件系统操作 GPIO 时,必须先检查想要操作的 GPIO 是否被其他驱动占用,如果 被占用,后续操作会报 busy 的警告。</p><p>以操作拓展脚的一个接口为例,使用万用表测 量电压。(ECSPI2_MOSI_3V3, GPIO5_IO11,139)</p>
<p>导出 GPIO</p>
<p>root@myd-jx8mp:~# echo 139 > /sys/class/gpio/export</p>
<p>导出成功后会在/sys/class/gpio/目录下生成 gpio139 这个目录。</p>
<p>设置/查看 GPIO 方向 设置输出,输入以下命令:</p>
<p>root@myd-jx8mp:~# echo out > /sys/class/gpio/gpio139/direction</p>
<p>或者设置输入:</p>
<p>root@myd-jx8mp:~# echo in > /sys/class/gpio/gpio139/direction</p>
<p>查看 gpio 方向:</p>
<p>root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/direction out</p>
<p>返回 in 表示输入,返回 out 表示输出。</p>
<p>设置/查看 GPIO 的值 设置输出低:</p>
<p>root@myd-jx8mp:~# echo "0" > /sys/class/gpio/gpio139/value</p>
<p>或者设置输出高:</p>
<p>root@myd-jx8mp:~# echo "1" > /sys/class/gpio/gpio139/value</p>
<p>查看 gpio 的值:</p>
<p>root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/value 1</p>
<p>可以看到 GPIO5_IO11 输出高电平,然后可以用万用表测量 J25 扩展 IO 的 ECSPI2_MOSI_3V3 引脚,可以看到电压为 3.3V 左右</p>
<p> </p>
<center><strong>GPIO68各属性文件的用途</strong></center>
<table>
<thead>
<tr>
<th>文件名</th>
<th>路径</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>active_low</td>
<td>/sys/class/gpio/gpio139/active_low</td>
<td>具有读写属性。用于决定value中的值是否翻转——0不翻转,1翻转。</td>
</tr>
<tr>
<td>edge</td>
<td>/sys/class/gpio/gpio139/edge</td>
<td>具有读写属性。设置GPIO中断,或检测中断是否发生。</td>
</tr>
<tr>
<td>subsystem</td>
<td>/sys/class/gpio/gpio139/subsystem</td>
<td>符号链接,指向父目录。</td>
</tr>
<tr>
<td>value</td>
<td>/sys/class/gpio/gpio139/value</td>
<td>具有读写属性。GPIO的电平状态设置或读取。</td>
</tr>
<tr>
<td>direction</td>
<td>/sys/class/gpio/gpio139/direction</td>
<td>具有读写属性。用于查看或设置GPIO输入输出</td>
</tr>
<tr>
<td>power</td>
<td>/sys/class/gpio/gpio139/power</td>
<td>设备供电方面的相关信息</td>
</tr>
<tr>
<td>uevent</td>
<td>/sys/class/gpio/gpio139/uevent</td>
<td>内核与udev(自动设备发现程序)之间的通信接口</td>
</tr>
<tr>
<td>device</td>
<td>/sys/class/gpio/gpio139/device</td>
<td>符号链接,指向父目录。</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<p>实际应用中,通过c语言读写linux系统文件的方式对gpio进行操作,示例代码如下:</p>
<p> </p>
<pre>
<code class="language-cpp">#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
#define DEV_PATH "/sys/class/gpio/gpio139/value" // 输入输出电平值设备
#define EXPORT_PATH "/sys/class/gpio/export" // GPIO设备导出设备
#define DIRECT_PATH "/sys/class/gpio/gpio139/direction" // GPIO输入输出控制设备
#define OUT "out"
#define IN "in"
#define GPIO "139" //gpio号
#define HIGH_LEVEL "1"
#define LOW_LEVEL "0"
int main(int argc, char ** argv)
{
static int fd_dev, fd_export, fd_dir, ret;
char buf, direction;
fd_export = open(EXPORT_PATH, O_WRONLY); // 打开GPIO设备导出设备
if(fd_export < 0) {
perror("open export:");
return -1;
}
write(fd_export, GPIO, strlen(GPIO));
fd_dev = open(DEV_PATH, O_RDWR); // 打开输入输出电平值设备
if(fd_dev < 0) {
perror("open gpio:");
return -1;
}
fd_dir = open(DIRECT_PATH, O_RDWR); // 打开GPIO输入输出控制设备
if(fd_dir < 0) {
perror("open direction:");
return -1;
}
ret = read(fd_dir, direction, sizeof(direction)); // 读取GPIO输入输出方向
if(ret < 0) {
perror("read direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
printf("default direction:%s", direction);
strcpy(buf, IN);
ret = write(fd_dir, buf, strlen(IN));
if(ret < 0) {
perror("write direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
ret = read(fd_dir, direction, sizeof(direction));
if(ret < 0) {
perror("read direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
ret = read(fd_dev, buf, sizeof(buf)); // 读取GPIO输入电平值
if(ret < 0) {
perror("read gpio:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
printf("current direction:%sinput level:%s", direction, buf);
close(fd_export);
close(fd_dir);
close(fd_dev);
return 0;
}</code></pre>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>这个用万用表测 量电压例程实用</p>
页:
[1]