*概要 [#c06cecdc]

*導入 [#t4376ca5]
-[[公式ドキュメント>http://beagleboard.org/getting-started]]
-Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneははいっていない.SDからのみ.
--例えばBeagle Bone Originalの場合,OSは[[ここ>http://www.elinux.org/Beagleboard:BeagleBone]]

*参考 [#w6460a37]
-[[ものすごく低位から頑張っているブログ>http://beagle1.blog.so-net.ne.jp/2011-06-05]]
-[[C言語@BBBのサンプルコード>http://d.hatena.ne.jp/rti7743/20131219/1387447643]]
-[[BeagleBoneの基本的なサンプルコード>http://www.cs.gunma-u.ac.jp/~nagai/wiki/index.php?BeagleBone%20%A4%CE%BB%C8%A4%A4%CA%FD]]

*ピンアサイン [#jc78a356]
-BeagleBoneWhite
--[[データシート>https://github.com/CircuitCo/BeagleBone-RevA5/blob/master/BeagleBone_revA5_SRM.pdf?raw=true]](55ページらへん)
-BeagleBoneBlack([[参考>http://mitaka1954.cocolog-nifty.com/blog/2014/03/beaglebone-blac.html]])
--&ref(./BBBlackGPIOMap.png,30%);

*GPIO [#ieee4879]
-GPIO0-GPIO3までのモジュールがある.
--どのモジュールの何ビット目がGPIOかは,&ref(./bbrA5S.pdf);55ページのMode7で見てとれる.(gpio3[17]なら,GPIO3の17bit目.)
--モジュールのそれぞれに先頭アドレスがある.
 #define GPIO0_BASE 0x44E07000
 #define GPIO1_BASE 0x4804C000
 #define GPIO2_BASE 0x481AC000
 #define GPIO3_BASE 0x481AE000
 
 #define GPIO_SIZE  0x00000FFF
--先頭アドレスに以下のbitを足したアドレスから,重要な3つのアドレス空間がある
 #define GPIO_OE 0x134 // PINのInputかOutputかを設定
 #define GPIO_SETDATAOUT 0x194 // このアドレスのbitに1を代入することで,PinをHIGHにする.
 #define GPIO_CLEARDATAOUT 0x190 // このアドレスのbitに1を代入することで,PinをLOWにする.
--OEの設定
---n bit目のピンは,*gpio_oe_addr & (1<<n)が,0なら出力で1なら入力
--STARTDATAOUTとCLEARDATAOUTの設定
---*gpio_setdataout_addr &= (1 << n);
---*gpio_cleardataout_addr &= (1 << n);



*リアルタイムOSの導入について [#j8bee116]
-[[yonekenさんのページ>http://blog.livedoor.jp/k_yon/archives/52499027.html]]

*APIの使い方 [#j0b5e89b]
-[[PIOとAIO両方>http://d.hatena.ne.jp/rti7743/20120603/1338686912]]
-[[Arduino風プログラムhttps://github.com/justjoheinz/beagleboneIO/]]

°サンプルプログラム
**LEDチカチカ(OnBoard) [#de9567a8]
-いちいち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;
 }

*指令 [#o6934800]
-/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は遅い [#cf3495e5]
-GPIOを1回変えるだけで,0.1msもかかる!
**/dev/mem/を書き換える方法 [#k53b696a]
-一回の書き換えに,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を使う方法 [#u513cde4]
-http://mitaka1954.cocolog-nifty.com/blog/2014/03/beaglebone-blac.html
*Tips [#yf233bd4]
-可変CPU速度をやめる
 sudo cpufreq-set --min 1GHz

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