概要 †
導入 †
- 公式ドキュメント
- Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneははいっていない.SDからのみ.
- 例えばBeagle Bone Originalの場合,OSはここ
参考 †
ピンアサイン †
- BeagleBoneWhite?
- &ref(): File not found: "bbrA5S.pdf" at page "BeagleBone";55ページ参照.
- BeagleBoneBlack?(参考)
リアルタイム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
- /sys/class/leds/beaglebone::usr[数字]/brightness
Beagle Boneのsysfsは遅い †
/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 †
|