概要

導入

  • 公式ドキュメント
  • Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneははいっていない.SDからのみ.
    • 例えばBeagle Bone Originalの場合,OSはここ

参考

ピンアサイン

  • BeagleBoneWhite?
    • &ref(): File not found: "bbrA5S.pdf" at page "BeagleBone";55ページ参照.
  • BeagleBoneBlack?参考
    • BBBlackGPIOMap.png

リアルタイムOSの導入について

APIの使い方

°サンプルプログラム

LEDチカチカ(OnBoard?

  • いちいちCloseしないと反映されなかった.
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    int main() {
    	FILE *LEDHandle = NULL;
    	const char *LEDBrightness = "/sys/class/leds/beaglebone::usr3/brightness";
    
    	for (int i = 0; i < 10; i++) {
    		if (( LEDHandle = fopen( LEDBrightness, "r+")) != NULL ) {
    			fwrite("1", sizeof(char), 1, LEDHandle);
    			fclose(LEDHandle);
    		}
    		sleep(1); 
    		if (( LEDHandle = fopen( LEDBrightness, "r+")) != NULL ) {
    			fwrite("0", sizeof(char), 1, LEDHandle);
    			fclose(LEDHandle);
    		}
    		sleep(1); 
    	}
    	return 0;
    }

指令

  • /sys/class/leds/beaglebone::usr{数字}/trigger
    • UserLEDが,どのような信号によってトリガーされるか(割り込みで)
    • catすると,現在何によって割り込みトリガーされるかを表示する.
      cat /sys/class/leds/beaglebone::usr[数字]/trigger
    • 自分で制御したい場合はtriggerにnoneを設定する
      echo none > /sys/class/leds/beaglebone::usr[数字]/trigger
  • /sys/class/leds/beaglebone::usr[数字]/brightness
    • 書き換えると,GPIOの電圧を設定(0でLOW,それ以外でHIGH)
      echo 0 > /sys/class/leds/beaglebone:green:usr0/brightness

Beagle Boneのsysfsは遅い

  • GPIOを1回変えるだけで,0.1msもかかる!

/dev/mem/を書き換える方法

  • 一回の書き換えに,250nsくらい.
  • http://stackoverflow.com/questions/13124271/driving-beaglebone-gpio-through-dev-mem
    • 注意点:GPIO Driverとコンフリクトする可能性.
  • LEDチカチカ(BeagleBoneWhite?で動作確認済み)
    • beaglebone_gpio.h
      #ifndef _BEAGLEBONE_GPIO_H_
      #define _BEAGLEBONE_GPIO_H_
      
      #define GPIO1_START_ADDR 0x4804C000
      #define GPIO1_END_ADDR 0x4804DFFF
      #define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)
      #define GPIO_OE 0x134
      #define GPIO_SETDATAOUT 0x194
      #define GPIO_CLEARDATAOUT 0x190
      
      #define USR0_LED (1<<21)
      #define USR1_LED (1<<22)
      #define USR2_LED (1<<23)
      #define USR3_LED (1<<24)
      
      #endif
    • gpiotest.c(拡張子はcでないとコンパイルできない)
      #include <stdio.h>
      #include <stdlib.h>
      #include <sys/mman.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include "beaglebone_gpio.h"
      
      int main(int argc, char *argv[]) {
              volatile void *gpio_addr = NULL;
              volatile unsigned int *gpio_oe_addr = NULL;
              volatile unsigned int *gpio_setdataout_addr = NULL;
              volatile unsigned int *gpio_cleardataout_addr = NULL;
              unsigned int reg;
              int fd = open("/dev/mem", O_RDWR);
      
              printf("Mapping %X - %X (size: %X)\n", GPIO1_START_ADDR, GPIO1_END_ADDR, GPIO1_SIZE);
      
               gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR);
      
              gpio_oe_addr = gpio_addr + GPIO_OE;
              gpio_setdataout_addr = gpio_addr + GPIO_SETDATAOUT;
              gpio_cleardataout_addr = gpio_addr + GPIO_CLEARDATAOUT;
      
              if(gpio_addr == MAP_FAILED) {
                      printf("Unable to map GPIO\n");
                      exit(1);
              }
              printf("GPIO mapped to %p\n", gpio_addr);
              printf("GPIO OE mapped to %p\n", gpio_oe_addr);
              printf("GPIO SETDATAOUTADDR mapped to %p\n", gpio_setdataout_addr);
              printf("GPIO CLEARDATAOUT mapped to %p\n", gpio_cleardataout_addr);
      
              reg = *gpio_oe_addr;
              printf("GPIO1 configuration: %X\n", reg);
              reg = reg & (0xFFFFFFFF - USR1_LED);
              *gpio_oe_addr = reg;
              printf("GPIO1 configuration: %X\n", reg);
      
              printf("Start blinking LED USR1\n");
              while(1) {
                      printf("ON\n");
                      *gpio_setdataout_addr= USR1_LED;
                      sleep(1);
                      printf("OFF\n");
                      *gpio_cleardataout_addr = USR1_LED;
                      sleep(1);
              }
      
              close(fd);
              return 0;
      }

PRUを使う方法

Tips

  • 可変CPU速度をやめる
    sudo cpufreq-set --min 1GHz

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS