2486|0

603

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

[BB方案]第六辑——编码实现 [复制链接]

本帖最后由 sjtitr 于 2014-6-17 11:29 编辑

总体来说,编码没什么难度的。从方案讲,从设计到编码也只需要抛砖引玉的做典型示例:

所以本辑只列举代码:
设计内容请参考[BB方案]第五辑——方案设计

首先是PHP,作为接收命令的起始点,我使用URL参数来接收要通过红外线发送的数据串:
  1. <html>
  2. <head>
  3. <title>Test Pipe Page</title>
  4. </head>
  5. <body>

  6. <?php

  7.         $str = $_REQUEST['str'];
  8.   $fp = @fopen("////tmp//irfifo", 'w');  
  9.         echo $fp;
  10.         echo nl2br("\n");
  11.         $num  = 0x5a;

  12.   $data = pack("H2", "5a");
  13.   echo @fwrite($fp, $data);
  14.         echo nl2br("\n");

  15.   $data = pack("C1", strlen($str)/2);
  16.   echo @fwrite($fp, $data);//д   
  17.         echo nl2br("\n");

  18.   $data = pack("H*", $str);
  19.   echo @fwrite($fp,$data);//д   
  20.         echo nl2br("\n");
  21.   fclose($fp);   



  22.         echo nl2br("\n");
  23.         print("Hello World!");
  24.         echo nl2br("\n");
  25.         print("sjtitr");
  26.         echo nl2br("\n");
  27. ?>

  28. <br><br>
  29. <a href="test_pipe.php?str=00ff48b7"><-</a><br><br>
  30. <a href="test_pipe.php?str=00ff4ab5">-></a><br><br>
  31. </body>
  32. </html>
复制代码

使用的时候,就像这样咯:test_pipe.php?str=00ff48b7


这样一来,C程序也很简单,目标是处理管道文件,然后启动pru:
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <errno.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <prussdrv.h>
  9. #include <pruss_intc_mapping.h>

  10. #define PRU_NUM 0
  11. #define FIFO "/tmp/irfifo"



  12. void prurun(char *buf)
  13. {
  14.     unsigned int ret;
  15.     tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA;
  16.      
  17.     prussdrv_init ();//Initialize the PRU
  18.     if (prussdrv_open(PRU_EVTOUT_0))//Open PRU Interrupt
  19.     {
  20.         printf("prussdrv_open open failed");
  21.         return;
  22.     }
  23.     prussdrv_pruintc_init(&pruss_intc_initdata);
  24.     {
  25.         prussdrv_pru_write_memory(PRUSS0_PRU0_DATARAM, 0, buf, buf[0]+1);
  26.     }
  27.     prussdrv_exec_program (PRU_NUM, "./prucode.bin");//Execute example on PRU
  28.     prussdrv_pru_wait_event (PRU_EVTOUT_0);//Waiting for this instruction: MOV r31.b0, PRU0_ARM_INTERRUPT+16
  29.     prussdrv_pru_clear_event (PRU0_ARM_INTERRUPT,0);
  30.     prussdrv_pru_disable (PRU_NUM);//Disable PRU and close memory mapping
  31.     prussdrv_exit ();

  32. }

  33. int main(int argc, char** argv)
  34. {
  35.         char buf[64];
  36.         int fd;
  37.         int nread;

  38.         if((mkfifo(FIFO, O_CREAT|O_EXCL)<0) && (errno!=EEXIST))
  39.         {
  40.                 printf("cannot create fifo\n");
  41.         }

  42.         fd = open(FIFO, O_RDONLY);
  43.         if(fd==-1)
  44.         {
  45.                 printf("cannot open fifo\n");
  46.                 exit(1);
  47.         }

  48.         while(1)
  49.         {
  50.                 int i = 0;

  51.                 memset(buf, 0, sizeof(buf));
  52.                 read(fd, buf, 1);
  53.                 if(buf[0]!=0x5A)
  54.                 {
  55.                 //        printf("%X,", buf[0]);
  56.                         continue;
  57.                 }
  58.                 read(fd, buf, 1);
  59.                 if(buf[0] == 0)
  60.                 {
  61.                         break;
  62.                 }
  63.                 read(fd, &buf[1], buf[0]);
  64.                 printf("%d: ", buf[0]);
  65.                 while(i < buf[0])
  66.                 {
  67.                         i++;
  68.                         printf("%X,",buf[i]);
  69.                 }
  70.                 printf("\n");
  71.                 prurun(buf);
  72.         }
  73.         unlink(FIFO);
  74.         exit(0);
  75. }
复制代码



最后是PRU程序,使用汇编语言完成,根据给下来的数据,执行红外编码的时序:

  1. //prucode.p
  2. .origin 0
  3. .entrypoint START

  4. //Refer to this mapping in the file - prussdrvincludepruss_intc_mapping.h
  5. #define PRU0_ARM_INTERRUPT      19
  6. #define CONST_PRUCFG            C4

  7. //Refer to AM335X Technical Reference Manual & BBB SRM
  8. #define GPIO1 0x4804c000
  9. #define GPIO_CLEARDATAOUT 0x190
  10. #define GPIO_SETDATAOUT 0x194

  11. START:
  12.     // Enable OCP master port
  13.     LBCO      r0, CONST_PRUCFG, 4, 4
  14.     CLR       r0, r0, 4         // Clear SYSCFG[STANDBY_INIT] to enable OCP master port
  15.     SBCO      r0, CONST_PRUCFG, 4, 4

  16.     MOV r5, 0
  17.     LBBO r4, r5, 0, 1
  18.     AND r4, r4, 255

  19. LEADER:
  20.     MOV r1, 340
  21.     CALL WAV_S
  22.     MOV r0, 450000
  23. LEADER_T:
  24.     SUB r0, r0, 1
  25.     QBNE LEADER_T, r0, 0

  26. NEXT_BYTE:
  27.     ADD r5, r5, 1
  28.     LBBO r6, r5, 0, 1
  29.     MOV r7, 8
  30.    
  31. NEXT_BIT:
  32.     MOV r1, 21
  33.     CALL WAV_S
  34.     AND r0, r6, 1<<7
  35.     QBNE BIT_1, r0, 0
  36.    
  37. BIT_0:
  38.     MOV r0, 56500
  39.     JMP BIT_T
  40.    
  41. BIT_1:
  42.     MOV r0, 169000

  43. BIT_T:
  44.     SUB r0, r0, 1
  45.     QBNE BIT_T, r0, 0
  46.     LSL r6, r6, 1
  47.     SUB r7, r7, 1
  48.     QBNE NEXT_BIT, r7, 0   

  49. BYTE_OK:
  50.     SUB r4, r4, 1
  51.     QBNE NEXT_BYTE, r4, 0   

  52. STOP_S:
  53.     MOV r1, 21
  54.     CALL WAV_S
  55.     MOV r0, 5000000
  56. STOP_T:
  57.     SUB r0, r0, 1
  58.     QBNE STOP_T, r0, 0

  59.     // Send notification to Host for program completion
  60.     MOV       r31.b0, PRU0_ARM_INTERRUPT+16

  61.     // Halt the processor
  62.     HALT

  63. WAV_S:
  64.     MOV r2, 1<<12
  65.     MOV r3, GPIO1 | GPIO_SETDATAOUT
  66.     SBBO r2, r3, 0, 4
  67.    
  68.     MOV r0, 850
  69. WAV_1:
  70.     SUB r0, r0, 1
  71.     QBNE WAV_1, r0, 0

  72.     MOV r2, 1<<12
  73.     MOV r3, GPIO1 | GPIO_CLEARDATAOUT
  74.     SBBO r2, r3, 0, 4

  75.     MOV r0, 1800
  76. WAV_0:
  77.     SUB r0, r0, 1
  78.     QBNE WAV_0, r0, 0
  79.    
  80.     SUB r1, r1, 1
  81.     QBNE WAV_S, r1, 0   
  82.     RET
复制代码

OK。下一辑就是最后一辑了,我们来调试一下并实现一个场景,计划用视频说话~



点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表