Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页
    1. Home
    2. ddrddr
    D
    • Profile
    • Following 0
    • Followers 0
    • my integral 424
    • Topics 6
    • Posts 7
    • Best 0
    • Groups 0

    ddrddrLV 3

    @ddrddr

    424
    integral
    0
    Reputation
    1
    Profile views
    7
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    ddrddr Unfollow Follow

    Latest posts made by ddrddr

    • Reply: 萌新基于全志V3s自制GBA游戏机

      想买。。。求量产

      posted in 爱搞机专区
      D
      ddrddr
    • 创龙AD+全志T3 TL7606I模块测试

      前 言

      本文主要介绍基于全志科技T3(ARM Cortex-A7)处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。

      备注:

      (1)创龙科技TL7606I模块使用AD芯片为核芯互联CL1606或ADI AD7606,两者均测试通过,且测试步骤无差别。

      (2)创龙科技TL7616P模块使用AD芯片为核芯互联CL1616或ADI AD7616,两者均测试通过,且测试步骤无差别。

      硬件平台:

      创龙科技T3工业评估板
      在这里插入图片描述

      TL7606I多通道AD模块
      在这里插入图片描述

      TL7616P多通道AD模块
      在这里插入图片描述

      TL7616P模块测试

      (1)硬件连接
      请使用VGA线将评估板VGA OUT接口与VGA显示屏连接。
      由于评估底板拓展接口未预留SPI总线引脚,因此需参考如下方法进行飞线,并且应尽可能使用短线连接,硬件连接如下图所示。

      在这里插入图片描述

      将评估底板SPI FLASH(U6)空贴后的引脚1(SPI CS)、2(SPI MISO)、5(SPI MOSI)、6(SPI CLK)和4(GND)通过飞线引出。

      在这里插入图片描述

      请通过飞线将TL7616P模块CON1接口与SPI FLASH(U6)飞线引出的引脚、CAMERA0(J11)接口参照下表对应关系进行连接。

      其中,CAMERA0(J11)接口的pin23~pin24引脚为TL7616P模块提供控制信号。

      在这里插入图片描述

      备注:"/"表示无需连接。

      请通过飞线将评估底板C2电解电容器的正负极引出,并与TL7616P模块CON2接口参照下表对应关系进行连接,为TL7616P模块提供12V直流电源。

      在这里插入图片描述

      案例支持TL7616P模块16通道AD数据同时采集与显示。本次测试以TL7616P模块V1A和V1B通道为例,请将TL7616P模块的V1A和V1B通道分别正确连接至信号发生器A通道和B通道。信号发生器设置A通道输出频率为1KHz、峰峰值为5Vpp(即幅值为2.5V)的正弦波信号,B通道输出频率为1KHz、峰峰值为2Vpp(即幅值为1V)的正弦波信号,如下图所示。待测信号电压请勿超过模块量程,否则可能会导致模块损坏。

      在这里插入图片描述

      (2)案例测试

      请将案例bin目录下的可执行文件ad_capture、驱动文件ad76x6.ko和"driver\boot_package"目录下的boot_package_vga_ad7606.fex镜像文件拷贝至评估板文件系统任意目录下。

      在评估板文件系统boot_package_vga_ad7606.fex镜像文件所在路径下,执行如下命令将其固化至Linux系统启动卡,并重启系统。

      Target# dd if=boot_package_vga_ad7606.fex of=/dev/mmcblk1 seek=32800
      Target# dd if=boot_package_vga_ad7606.fex of=/dev/mmcblk1 seek=24576
      Target# sync
      Target# reboot
      

      在这里插入图片描述

      评估板系统重启后,进入评估板文件系统执行如下命令加载驱动。加载成功后,将会生成设备节点"/dev/ad7606"。

      Target# insmod ad76x6.ko
      Target# ls /dev/ad7606
      

      在这里插入图片描述
      执行如下命令,查询程序运行参数。

      Target# ./ad_capture --help
      

      在这里插入图片描述
      执行如下命令,AD模块将会采集8192个数据,并转换成电压值。

      Target# ./ad_capture -d /dev/ad7606 -n 1024
      

      在这里插入图片描述
      请将生成的data.csv文件拷贝至Windows任意目录下,并使用Excel打开,如下图所示。其中,第C列数据为TL7606I模块V3通道的采集数据,第H列数据为TL7606I模块V8通道的采集数据,默认单位为:V。

      在这里插入图片描述
      请通过Excel的二维折线图,将采集数据显示为更加直观的波形图,如下图所示。

      在这里插入图片描述
      在这里插入图片描述

      posted in 其它全志芯片讨论区
      D
      ddrddr
    • 创龙T3开发板使用体验--基本开发环境搭建

      创龙T3开发板:https://bbs.aw-ol.com/topic/2228/

      1. 建立连接,测试基本功能。

      1.1. 用上位机建立连接

      开箱,熟悉资料,总体感觉做工工整(尤其是电源部分,用料很足),资料详实,有其他linux开发板经验的玩家上手很容易。

      基本连接和测试主要参考用户手册--2.1评估板测试手册, 网络连接,LED/UART/USB测试等等

      首先要做的就是用上位机连接开发板,参考前一篇文章的方法:

      Windows网线直连linux开发板或树莓派-超详细_海里的鱼2022的博客-CSDN博客

      顺利连接,默认用户为root

      poYBAGNnmxOASVlRAAEwr49SqB4215.png

      如此,便是登录成功

      pYYBAGNnmxOABrrmAABL7YmGagA883.png

      查看下文件和存储空间使用情况:

      root@T3/A40i-Tronlong:~# cd ../
      root@T3/A40i-Tronlong:/# ls
      CameraUI         home             proc             tmp
      G2dDemo          init             qt5.9.sh         usr
      Launcher         lib              recordTest       var
      MediaUI          lib32            root             video_serv
      adb.sh           libexec          run              wave
      bin              linuxrc          sbin             xplayerdemo
      core             lost+found       sdktest          xplayerdemoH264
      dbusrun.sh       media            storage.sh
      dev              mnt              sys
      etc              opt              system
      root@T3/A40i-Tronlong:/# df -h
      Filesystem                Size      Used Available Use% Mounted on
      /dev/root                 1.9G    509.2M      1.3G  27% /
      devtmpfs                358.8M         0    358.8M   0% /dev
      tmpfs                   375.0M         0    375.0M   0% /dev/shm
      tmpfs                   375.0M     12.0K    375.0M   0% /tmp
      tmpfs                   375.0M     12.0K    375.0M   0% /run
      /dev/mmcblk0p2            7.0M      4.2M      2.7M  61% /mnt/emmc/mmcblk0p2
      /dev/mmcblk0p7            1.9G    509.1M      1.3G  27% /mnt/emmc/mmcblk0p7
      /dev/mmcblk1p2            7.0M      4.2M      2.7M  61% /mnt/sdcard/mmcblk1p2
      /dev/mmcblk1p7            1.9G    509.2M      1.3G  27% /mnt/sdcard/mmcblk1p7
      cgroup                  375.0M         0    375.0M   0% /sys/fs/cgroup
      root@T3/A40i-Tronlong:/#
      

      上位机和开发板之间传输文件:

      1)ftp方法

      上位机安装filezilla, 然后可以远程连接后直接查看文件目录或进行文件传输

      ​pYYBAGNnmxOAU-3rAAHUXcOTr18163.png

      2)scp方法

      现在目标板上新建hy目录

      root@T3/A40i-Tronlong:/# mkdir hy

      在上位机ubuntu虚拟机下

      拷贝单个文件:

      hy@ubuntu:~/t3dev/samples/python-demos/key_test$ sudo scp *.*  root@192.168.137.48:/hy 
      key_test.py                                             100% 2819  67.6KB/s   00:00
      

      拷贝整个文件夹

      hy@ubuntu:~/t3dev/samples$ sudo scp -r python-demos/  root@192.168.137.48:/hy 
      led_flash.py                                             100% 3005   886.0KB/s   00:00    
      key_test.py                                              100% 2819    72.7KB/s   00:00
      

      1.2测试板载资源,LED, KEY等

      ​
      poYBAGNnmxSAMNpeAA7zbuA9z-o230.png

      BOOT-SET选项打到OFF位置(向板外方向)为EMMC启动,ON位置为SD卡启动,试过都是OK的。

      测试LED,板载的LED0/LED1见上图红框位置

      命令行测试命令:

      root@T3/A40i-Tronlong:/# echo 0 > /sys/class/leds/user-led0/brightness
      root@T3/A40i-Tronlong:/# echo 1 > /sys/class/leds/user-led0/brightness
      root@T3/A40i-Tronlong:/# echo 0 > /sys/class/leds/user-led1/brightness
      root@T3/A40i-Tronlong:/# echo 1 > /sys/class/leds/user-led1/brightness
      

      以上分别测试LED0/LED1的亮(1)/灭(0),板载LED正常受控。

      测试按键,板载共有KEY3/4/5三个用户定义按键,可以用命令查看对应事件

      root@T3/A40i-Tronlong:/# cat /proc/bus/input/devices
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="sunxi-ths"
      P: Phys=sunxiths/input0
      S: Sysfs=/devices/virtual/input/input0
      U: Uniq=
      H: Handlers=event0
      B: PROP=0
      B: EV=9
      B: ABS=100 0
      
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="sunxi-keyboard"
      P: Phys=sunxikbd/input0
      S: Sysfs=/devices/virtual/input/input1
      U: Uniq=
      H: Handlers=kbd event1
      B: PROP=0
      B: EV=3
      B: KEY=10000 c00 0 300800 40040 0 0 10000000
      
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="sunxi-keypad"
      P: Phys=Keypad/input2
      S: Sysfs=/devices/virtual/input/kp0
      U: Uniq=
      H: Handlers=sysrq kbd event2
      B: PROP=0
      B: EV=3
      B: KEY=ffffffff fffffffe
      
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="all_key"
      P: Phys=sunxi_ts/input0
      S: Sysfs=/devices/platform/sunxi-ts/input/input3
      U: Uniq=
      H: Handlers=event3
      B: PROP=0
      B: EV=b
      B: KEY=400 0 0 0 0 0 0 0 0 0 0
      B: ABS=610000 0
      
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="axp22-powerkey"
      P: Phys=m1kbd/input2
      S: Sysfs=/devices/soc.0/1c2ac00.twi/i2c-0/0-0034/axp22-powerkey/input/input4
      U: Uniq=
      H: Handlers=kbd event4
      B: PROP=0
      B: EV=7
      B: KEY=100000 0 0 0
      B: REL=0
      
      I: Bus=0019 Vendor=0001 Product=0001 Version=0100
      N: Name="gpio-keys.21"
      P: Phys=gpio-keys/input0
      S: Sysfs=/devices/gpio-keys.21/input/input5
      U: Uniq=
      H: Handlers=kbd event5
      B: PROP=0
      B: EV=100003
      B: KEY=400 0 0 0 0 0 0
      

      KEY3/4对应event1, KEY5对应event5

      通过命令可以查看事件响应消息:

      root@T3/A40i-Tronlong:/# od -x /dev/input/event1
      0000000 5197 386d 29ed 0004 0001 0094 0001 0000
      0000020 5197 386d 29ed 0004 0000 0000 0000 0000
      0000040 5197 386d 2b5f 0009 0001 0094 0000 0000
      0000060 5197 386d 2b5f 0009 0000 0000 0000 0000
      0000100 5199 386d cae8 000b 0001 0094 0001 0000
      0000120 5199 386d cae8 000b 0000 0000 0000 0000
      0000140 519b 386d 0e99 000e 0001 0094 0000 0000
      0000160 519b 386d 0e99 000e 0000 0000 0000 0000
      0000200 519e 386d ec83 0003 0001 0094 0001 0000
      0000220 519e 386d ec83 0003 0000 0000 0000 0000
      0000240 51a1 386d e8be 000b 0001 0094 0000 0000
      0000260 51a1 386d e8be 000b 0000 0000 0000 0000
      0000300 51a2 386d 9fc6 000c 0001 0094 0001 0000
      0000320 51a2 386d 9fc6 000c 0000 0000 0000 0000
      0000340 51a3 386d 940e 000d 0001 0094 0000 0000
      0000360 51a3 386d 940e 000d 0000 0000 0000 0000
      0000400 51a4 386d a4f3 0009 0001 0094 0001 0000
      0000420 51a4 386d a4f3 0009 0000 0000 0000 0000
      0000440 51a5 386d 3196 000b 0001 0094 0000 0000
      0000460 51a5 386d 3196 000b 0000 0000 0000 0000
      // 以上为KEY3按下
      // 以下为KEY4按下
      0000500 51aa 386d 1cfc 000e 0001 0095 0001 0000
      0000520 51aa 386d 1cfc 000e 0000 0000 0000 0000
      0000540 51ac 386d c2e3 0000 0001 0095 0000 0000
      0000560 51ac 386d c2e3 0000 0000 0000 0000 0000
      0000600 51ad 386d 30e6 0002 0001 0095 0001 0000
      0000620 51ad 386d 30e6 0002 0000 0000 0000 0000
      0000640 51ae 386d e820 0002 0001 0095 0000 0000
      0000660 51ae 386d e820 0002 0000 0000 0000 0000
      0000700 51ae 386d dfbf 000d 0001 0095 0001 0000
      0000720 51ae 386d dfbf 000d 0000 0000 0000 0000
      0000740 51b0 386d 1e41 0001 0001 0095 0000 0000
      0000760 51b0 386d 1e41 0001 0000 0000 0000 0000
      
      
      //测试KEY5按下
      root@T3/A40i-Tronlong:/# od -x /dev/input/event5
      0000000 51e1 386d 3cc7 0004 0001 00ca 0001 0000
      0000020 51e1 386d 3cc7 0004 0000 0000 0000 0000
      0000040 51e1 386d 0853 0008 0001 00ca 0002 0000
      0000060 51e1 386d 0853 0008 0000 0000 0001 0000
      0000100 51e1 386d a48d 0008 0001 00ca 0002 0000
      0000120 51e1 386d a48d 0008 0000 0000 0001 0000
      0000140 51e1 386d b7e0 0008 0001 00ca 0000 0000
      0000160 51e1 386d b7e0 0008 0000 0000 0000 0000
      0000200 51e2 386d 75ab 0008 0001 00ca 0001 0000
      0000220 51e2 386d 75ab 0008 0000 0000 0000 0000
      0000240 51e2 386d 2702 000c 0001 00ca 0002 0000
      0000260 51e2 386d 2702 000c 0000 0000 0001 0000
      0000300 51e2 386d c334 000c 0001 00ca 0002 0000
      0000320 51e2 386d c334 000c 0000 0000 0001 0000
      0000340 51e2 386d 5f74 000d 0001 00ca 0002 0000
      0000360 51e2 386d 5f74 000d 0000 0000 0001 0000
      0000400 51e2 386d fbbc 000d 0001 00ca 0002 0000
      0000420 51e2 386d fbbc 000d 0000 0000 0001 0000
      0000440 51e2 386d 97fc 000e 0001 00ca 0002 0000
      0000460 51e2 386d 97fc 000e 0000 0000 0001 0000
      

      手册2.1还有其他外设的测试方法和例子,就不一一列出了

      2. 建立开发环境, 测试交叉编译和简单的应用开发

      主要参考文档2-2linux应用开发手册,代码包位于软件资料-demo目录下, 开发包提供了python和C的案例。

      2.1 python应用案例

      板载系统预装了python2.7, 3.7是不是支持不太确定,有机会再尝试编译安装。

      例子有两个,以led_flash.py为例来测试

      #!/usr/bin/env python
      # -*- encoding: utf-8 -*-
      '''
      @File    :   tl_led_flash.py
      @Time    :   2020/04/26 09:05:54
      @Desc    :   None
      '''
      
      # here put the import lib
      import signal, time
      import os, sys, getopt
      
      version = "1.0"
      
      class Led(object):
          quit_flag = False
          
          def __init__(self, led_path):
              self.led_path = led_path    # Led path
              self.leds     = []          # Save the led found
      
          """ enumerate all led """
          def enumerate_led(self):
              led_name = "user-led"
      
              """ find led """
              for filename in os.listdir(self.led_path):
                  if led_name in filename:
                      self.leds.append(os.path.join(self.led_path, filename))
      
              if len(self.leds) == 0:
                  return False
      
              """ 
              led sort, e.g.
              /sys/class/leds/user-led0
              /sys/class/leds/user-led1
              /sys/class/leds/user-led2
              """
              self.leds.sort()
      
              print "find leds:"
              for led in self.leds:
                  print led
      
              return True
      
          """ control led flash """
          def flash_led(self):
              led_num = len(self.leds)
      
              while not Led.quit_flag:
                  """ Turn on leds """
                  for i in range(led_num):
                      """ Set the led brightness value to 1 to turn on the led """
                      ret = os.system("echo 1 > %s/brightness" % (self.leds[i]))
                      
                      if ret != 0:
                          print "Error: Failed to turn on %s" % self.leds[i]
      
                  """ Keep the leds on for 500 ms """
                  time.sleep(0.5)
      
                  for i in range(led_num):
                      """ Set the led brightness value to 0 to turn off the LED """
                      os.system("echo 0 > %s/brightness" % (self.leds[i]))
      
                  """ Keep the leds off for 500 ms """
                  time.sleep(0.5)
          
          @classmethod
          def stop(cls):
              cls.quit_flag = True
      
      def sig_handle(signum, frame):
          print "ctrl + c ..."
          Led.stop()
      
      def usage():
          print "Usage: %s [options]\n" \
                  "Options: \n" \
                  "   -v | --version Display version information\n" \
                  "   -h | --help    Display help\n" \
                  % sys.argv[0]
      
      if __name__ == '__main__':
          """ parse parameter """
          try:
              options, remainder = getopt.getopt(sys.argv[1:], 'vh', ['version', 'help'])
              for opt, arg in options:
                  if opt in ('-v', '--version'):
                      print 'version: %s' % version
                      exit(0)
                  elif opt in('-h', '--help'):
                      usage()
                      exit(0)
      
          except getopt.GetoptError as err:
              print 'ERROR: %s' % err
              exit(1)
          
          """ Ctrl+c handler """
          signal.signal(signal.SIGINT, sig_handle)
      
          led = Led("/sys/class/leds/")
      
          """ enumerate all led """
          ret = led.enumerate_led()
          """ can not find led """
          if not ret:
              print "can not find led!"
              exit(3)
          
          """ control flash all led """
          print "\nflash led ..."
          led.flash_led()
      

      基本原理和前面单独测试led差不多,运行后,板载的两个led会闪烁。

      用于写一些的简单的调试脚本应用还是挺好的,但是更有价值的库,像tcp/udp, mqtt及其他可能用到的库官方例子太少,实用性不高。

      2.2嵌入式C的开发环境建立

      嵌入式C开发才是主打模式,首先要建立交叉编译环境。

      手册里只提到要先建立SDK编译环境,但是太重了,其实只要安装了gcc工具链就可以完成基本开发了。

      hy@ubuntu:~/T3$ wget http://releases.linaro.org/components/toolchain/binaries/5.3-2016.02/arm-linux-gnueabihf/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz
      // 解压
      tar -xzf gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/
      
      // 进入代码目录,进行编译
      (py39) hy@ubuntu:~/t3dev/samples/base-demos/led_flash$ cd src
      (py39) hy@ubuntu:~/t3dev/samples/base-demos/led_flash/src$ dir
      led_flash  led_flash.c	makefile
      (py39) hy@ubuntu:~/t3dev/samples/base-demos/led_flash/src$ CC=~/T3/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc make
      make: 'led_flash' is up to date.
      

      编译成功,可以copy到目标开发板, 运行验证下

      上位机运行

      cd ../bin
      sudo scp led_flash  root@192.168.137.48:/hy
      

      目标开发板直接运行,带上-h查看运行帮助

      root@T3/A40i-Tronlong:/hy# ./led_flash -h
      Usage: led_flash [options]
      
      Options:
       -n | --number        Number of LEDs, range of 1 to 4
       -v | --version       Display version information
       -h | --help          Show help content
      

      带参数,让LED1闪起来

      root@T3/A40i-Tronlong:/hy# ./led_flash -n 1
      
      System leds :
      /sys/class/leds/disk
      /sys/class/leds/heartbeat
      /sys/class/leds/user-led0
      /sys/class/leds/user-led1
      
      Flashing leds :
      /sys/class/leds/user-led0
      

      至此,交叉编译环境顺利建立。

      -> 原文链接

      posted in 其它全志芯片讨论区
      D
      ddrddr
    • 在哪吒D1上适配移远EC20,实现4G上网

      a58313b4dfecb11f5981db396e401878.jpg

      1:代码替换

      用Quectel_Linux_USB_Serial_Option_Driver_20210205中linux 5.4.51文件夹下的代码,替换Tina SDK中lichee/linux-5.4/drivers/usb/serial/ 中对应的文件

      Quectel_Linux_USB_Serial_Option_Driver_20210205的下载链接:

      链接:https://pan.baidu.com/s/1HhChSszvXQr2YzMojGdvpQ?pwd=odfb

      提取码:odfb

      2:打开linux中对应的USB driver

      transfer_image1665157769327.png

      3:重新编译系统,并且将新系统烧录到开发板上

      cd /opt/d1/tina_d1_open_v2
      source build/envsetup.sh
      lunch
      make kernel_menuconfig
      make
      pack
      

      4:验证驱动安装是否成功

      驱动安装成功以后,插入设备,应出现如下log:

      transfer_image1665157769367.png

      输入:

      cat /dev/ttyUSB2 &
      echo -e "AT\r\n" > /dev/ttyUSB2
      

      应该出现如下提示:

      transfer_image1665157769323.png

      则表示EC20的驱动已经成功安装。

      5:PPP拨号

      由于目前没有针对C906内核的ppp拨号软件,因此需要从源码重新编译;链接开源的是针对C906内核从PPP源码编译以后的PPP拨号软件,如果觉得好用,烦请点个Star:

      https://github.com/tcexeexe/pppForC906/

      使用方法:

      (1)将pppd 和 chat 上传到 /usr/bin

      (2)将 quectel-ppp,quectel-chat-connect,quectel-chat-disconnect 上传到 /etc/ppp/peers/.默认的拨号脚本是针对联通的

      (3)使用 pppd call quectel-ppp 拨号联网

      拨号成功后,输入ifconfig,出现ppp0相关网络配置,则标识拨号成功,此时就可以顺利上网

      ec8d7c9bfe4831a31f179b250c50e684.png

      由于4G模块基本都是使用3GPP的标准AT指令,所以例如高新兴,SIMCOM等厂家的模组,也可以试用上述流程,区别在于USB的vender ID和Product ID不同,这个需要根据模组的手册修改。

      原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d180fISyFXA&id=4098970633348648960

      posted in D1系列-RISC-V
      D
      ddrddr
    • D1开发板操作gpio端口的简单方法以及ADB的连接方法

      准备操作

      作为一名萌新,在如何操作gpio端口上,历经千辛万苦,查阅各种资料。

      首先是根据同样是发布在平头哥开发社区的博文,链接如下 https://bbs.aw-ol.com/topic/349/ 是文件操作gpio端口,代码易读懂,但是代码量太大了。对有些部分,像是打开文件,进行读写操作的一块进行,可以简化一些,但是要控制多个gpio端口,还要多次复用,实在是不好用。所以在写完小车动起来的程序后,就想着有没有更简单的方式。

      找到了官方提供的gpio开发指南,利用的是设备树和Pinctrl和gpio子系统操作gpio,花了两天时间终于弄了个大概明白,想上手开始做,发现没找到一个完整的案例,不知如何入手。

      于是搜搜查查,最后回归了简单的终端操作,将终端操作用命令和shell脚本来操作方便同时操作多个gpio端口。更简单了,但是没学过脚本语言,准备开始学习基本知识的时候,发现了一篇博文,什么都解决了。

      链接如下:点这个理

      C语言代码里操作gpio

      此文里面有一个板块为C语言代码里操作gpio,代码短短几行,用了system()函数来操作echo等,很类似终端操作,但又更方便了。 于是操作gpio变成了这样

      • 将大部分操作宏定义
      #define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export"
      #define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export"
      #define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export"
      
      #define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport"
      #define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport"
      
      #define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction"
      #define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction"
      #define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction"
      #define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction"
      
      #define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value"
      #define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value"
      #define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value"
      #define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value"
      
      • 一些操作语句,简单明了
      void INIT()
      {
      
      	system(EXPORT_GPIO1);
      	system(EXPORT_GPIO2);
      	system(EXPORT_GPIO3);
      	system(EXPORT_GPIO4);
      	
      	system(EXPORT_HW1);
      	system(EXPORT_HW2);
      	system(EXPORT_HW3);
      	system(EXPORT_HW4);
      	
      	system(GPIO1_OUTPUT);
      	system(GPIO2_OUTPUT);
      	system(GPIO3_OUTPUT);
      	system(GPIO4_OUTPUT);
      	
      	system(HW1_INPUT);
      	system(HW2_INPUT);
      	system(HW3_INPUT);
      	system(HW4_INPUT);
      	
      }
      
      void RUN()
      {
      	system(LOWGPIO1);//0
      	system(HIGHGPIO2);//1
      	system(HIGHGPIO3);//1
      	system(LOWGPIO4);//0
      	
      }
      
      • 但是由于没有办法system(cat...),得到value的值只能用文件方式来读出,但也将代码简化了很多。
      int GETHW(int gpio)
      {
      	char in[3] = {0, 0, 0};
      	char buf[50];
      	int nread, gpiofd;
      	sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);
      	gpiofd = open(buf, O_RDWR);
      	if(gpiofd < 0) {
      		fprintf(stderr, "Failed to open gpio %d value\n", gpio);
      		perror("gpio failed");
      	}
       
      	do {
      		nread = read(gpiofd, in, 1);
      	} while (nread == 0);
      	if(nread == -1){
      		perror("GPIO Read failed");
      		return -1;
      	}
      	close(gpiofd);
      	return atoi(in);
      }
      

      D1开发板的gpio引脚

      我们项目的小车选用的是gpio2020~gpio2027这八个gpio引脚,其中四个引脚用来控制车轮的运动,四个引脚用来接收红外传感器传送过来的信号。这八个引脚分别对应的是pp0~pp7,

      根据这两张图片结合,我们就知道了gpio2020~gpio2027这四个分别在什么位置。

      8d5cfb247925666b938f378e36b84a96.png

      9e792bea735baa3ff8f74798da08b860.png

      查看gpio引脚值,对gpio引脚操作分为简单的几步:

      • 导出gpio值,命令:echo 2020 > export
      • 设置方向,输入为:echo in > direction输出为:echo out > direction
      • 查看value值:cat value ( 注意工作目录 )
      • 设置value值,如果gpio口被定义为输出时,可以设置gpio值为1或者0,1为高电平,0为低电平 echo 1 > value
      • 不用就 echo 2020 > unexport

      49043e4a5934023040e1a9cc1380dec1.png

      580453d43514605e6170d1f1b1a88048.png

      ADB使用和编译程序

      设备连接

      我们在将已经编译好的程序代码传送到哪吒开发板上时,使用的ADB工具。设备连接正常后,桌面上有显示图标:

      b76d2b76d72a50a88e695e7c727fd309.png

      那个对勾表示已经连接上ADB,如果有Allwinner Technology Inc. Tina ADB但是前面没有对勾,就点一下,要是没有这个选项,就重插一下开发板。

      交叉编译

      • ADB安装好以后,先在Ubuntu下新建一个.c文件,然后编译:
        编译是交叉编译,交叉编译就是编译和运行是分开的,即编译在电脑的Ubuntu上,运行在哪吒开发板上进行。

      根据全志社区中的提示:编译工具链在tina/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702中

      编译命令是:/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc -o car1 car1.c

      • 其中编译命令可以根据编译工具链存放的位置进行调整,我们编译工具链存放的位置是:
        tina-D1-H/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702

      所以编译命令略微调整为:

      tina-D1-H/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc -o car car.c

      我们一开始遇到的问题提示为找不到目录。后来发现是因为一开始目录不对。

      • 编译好.c文件后,执行adb push car ./.就将编译好的程序下载到开发板上

      进入开发板:用adb shell命令

      进入开发板以后,在/root目录下找到car程序,赋予文件可执行权限chmod +x car,然后运行 ./car,见下图:

      0e78e81db57965158fa09f4668ebcf0b.png

      9b77c38cf4cc958614489f02ec919391.png

      最后希望哪吒开发板也能拥有专门的操作gpio的函数和接口,方便大家使用。

      本文内容为【玄铁杯第二届RISC-V应用创新大赛】作业
      作者:智航追迹队

      原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d180fqgpDV3&id=4094212597694402560

      posted in D1系列-RISC-V
      D
      ddrddr
    • 开机启动脚本写入 /etc/resolv.conf 脚本执行不完全

      0ED7F112-5181-46ef-BC4C-2C336DF46DF5.png

      请教一下,我在Tina下的/etc/rc.local里面增加了一个开机启动的脚本,目标是上电以后写入DNS SERVER地址到/etc/resolv.conf里面,但是现在好像只执行了红框里面这句话,没有执行绿框里面这句话,开机后/etc/resolv.conf这个文件里面还是空白,这个可能是什么原因呀

      posted in D1系列-RISC-V
      D
      ddrddr
    • Tina下 DNS配置好后 重启消失问题

      请教一下各位大佬,在Tina下配置DNS时,在/etc/resolv.conf写入DNS的nameserver,写好以后是OK的,可以正常Ping通网址。但是重启以后,/etc/resolv.conf的内容就消失了,这个是什么情况

      posted in D1系列-RISC-V
      D
      ddrddr