OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6143|回复: 6

web网页控制led,打开杂项设备失败

[复制链接]

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
发表于 2021-4-19 10:16:42 | 显示全部楼层 |阅读模式
1金钱
我在boa服务器上做了个web控制led的测试cgi,结果打开杂项设备失败,帮忙看看可能是哪方面的原因呢,搞了好久,还是不行啊
2.png
在cgi.c文件里面,打开杂项设备失败,返回值是-1
1.png
我编译成app测试了,使用./app来运行就不会报错

最佳答案

查看完整内容[请看2#楼]

首先确认boa是否使用了chroot,导致根本看不到/dev下面的文件, 可以在CGI程序中合适的位置使用system("ls /"); 或system("ls /dev");输出它看到的目录,是不是能看到/bin、/sbin、/etc、/dev等这些文件夹。 然后确认是否是用户权限导致的,用system("whoami");可以输出当前boa CGI程序是以什么身份运行的, 可以全部改成root,或者把/dev/hello_misc权限改成0777
我想好好学习RTOS,不管哪一种,学会一种就行
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-4-19 10:16:43 | 显示全部楼层
首先确认boa是否使用了chroot,导致根本看不到/dev下面的文件,
可以在CGI程序中合适的位置使用system("ls /"); 或system("ls /dev");输出它看到的目录,是不是能看到/bin、/sbin、/etc、/dev等这些文件夹。

然后确认是否是用户权限导致的,用system("whoami");可以输出当前boa CGI程序是以什么身份运行的,
可以全部改成root,或者把/dev/hello_misc权限改成0777
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

4

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3518
金钱
3518
注册时间
2018-5-25
在线时间
812 小时
发表于 2021-4-19 10:55:14 | 显示全部楼层
驱动是你自己写的么?如果是,是不是open函数忘了返回0了
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
 楼主| 发表于 2021-4-19 10:56:55 | 显示全部楼层
zdes33ss 发表于 2021-4-19 10:55
驱动是你自己写的么?如果是,是不是open函数忘了返回0了

确认了一下,open返回0了
我现在怀疑是boa搭建的有问题,所有open一类的函数都不能正常执行
我想好好学习RTOS,不管哪一种,学会一种就行
回复

使用道具 举报

5

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
813
金钱
813
注册时间
2021-2-26
在线时间
117 小时
发表于 2021-4-19 13:07:28 | 显示全部楼层
你两个代码,open的flags参数一样吗?
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
 楼主| 发表于 2021-4-19 14:00:04 | 显示全部楼层
jckimi 发表于 2021-4-19 13:07
你两个代码,open的flags参数一样吗?

哥,我没看懂你说的flags参数是什么,我把源码贴上,帮忙看看,谢谢啦
测试APP源码
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <sys/ioctl.h>
  7. #define CMD_TEST0 _IO('L',0)
  8. #define CMD_TEST1 _IO('A',1)
  9. #define CMD_TEST2 _IOW('L',1,int)
  10. #define CMD_TEST3 _IOW('L',0,int)
  11. //#define CMD_TEST3 _IOR('L',3,int)
  12. int main(int argc,char *argv[])
  13. {
  14.     int fd;
  15.     char buf[64] ={0};
  16.     fd = open("/dev/hello_misc",O_RDWR);
  17.     if(fd < 0)
  18.     {
  19.         perror("open error \n");
  20.         return fd;
  21.     }
  22.    
  23.     while(1)
  24.     {
  25.         ioctl(fd,CMD_TEST2,0);
  26.         sleep(1);
  27.         ioctl(fd,CMD_TEST3,0);
  28.         sleep(1);
  29.     } return 0;
  30. }
复制代码

CGI源码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         char *data;
  6.         int leds[2] = {0, 0};
  7.         long m, n;
  8.         int exit=0,i,fd;
  9.         printf("Content-Type:text/html;charset=gb2312\n\n");
  10.         printf("<html>\n");
  11.         printf("<body>\n");
  12.         printf("<title>i.MX6ULL_Title</title> ");
  13.         printf("<h3>i.MX6ULL</h3> ");
  14.         data = getenv("QUERY_STRING");
  15.         printf("<p>receive data:%s</p>",data);

  16.         while(*data != '\0')
  17.         {
  18.                 if(*data=='=')
  19.                 switch(*(data+1))
  20.                 {
  21.                         case '1':leds[0]=1;break;
  22.                         case '2':leds[1]=1;break;
  23.                         default:exit=1;break;
  24.                 }
  25.                 if(exit == 1)
  26.                         break;
  27.                 data++;
  28.         }

  29.         fd = open("/dev/hello_misc",0);
  30.         if(fd < 0)
  31.         {
  32.                 printf("<p>open fd error=%d\t</p>",fd);
  33.         }
  34.         printf("<p>fd opened %d\t</p>",2);

  35.         for(i=0;i<2;i++)
  36.         {
  37.                 if(leds[i]==1)
  38.                         printf("<p>%d\t</p>",i+1);
  39.                 else
  40.                         printf("<p>leds%d\t</p>",6);
  41.                 if(fd < 0)
  42.                         printf("<p>leds<0%d\t</p>",6);
  43.                 else
  44.                 {
  45.                         printf("<p>leds>0%d\t</p>",6);
  46.                         ioctl(fd,leds[i],i);
  47.                 }
  48.         }
  49.         printf("</body>\n");
  50.         printf("</html>\n");
  51.         return 0;
  52. }
复制代码




我想好好学习RTOS,不管哪一种,学会一种就行
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
 楼主| 发表于 2021-4-19 23:13:48 | 显示全部楼层
xkwy 发表于 2021-4-19 14:51
首先确认boa是否使用了chroot,导致根本看不到/dev下面的文件,
可以在CGI程序中合适的位置使用system("ls ...

谢谢大佬,/dev/hello_misc权限改成0777,就好了
我想好好学习RTOS,不管哪一种,学会一种就行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表