BeagleBone Gpio

Başlatan erenbasturk, 26 Ocak 2013, 18:28:59

erenbasturk

Merhabalar,

BeagleBone'un gpio'larını herhangi bir gpio driver olmadan adresler yardımıyla kontrol etmeye çalışıyorum . Aşağıda gpio1_6'yı çıkış olarak ayarlamak üzere bir program yazdım fakat gpio1_6'ya bağladığım led'de herhangi bir degişiklik olmadı. Sizce nerede hata yapıyor olabilirim ?


#include <stdlib.h>
#include <stdio.h>
#include <hw/inout.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <stdint.h>

#define AM335X_GPIO_SIZE	0x00001000
#define AM335X_GPIO1_BASE       0x4804C000
#define GPIO_DATAOUT            0x8C
#define GPIO0                   (1<<6)

/*
 *  GPIO0 = GPIO1_6
 */

uintptr_t *gpio_base;
uint32_t *val;


int main(int argc, char *argv[]) {


	ThreadCtl (_NTO_TCTL_IO,NULL);

	gpio_base =  mmap_device_io(AM335X_GPIO_SIZE,AM335X_GPIO1_BASE);

	while(1)
	{

		val = ~GPIO0;
		out32(gpio_base + GPIO_DATAOUT, val);
		delay(1000);

	}

	return 0;
}


Cevaplarınız için şimdiden teşekkür ederim.

Firzen

Sanırım CCS kullanıyorsunuz benim tavsiyem beaglebone içine Angstrom Cloud9 IDE li sürümünü kurup kullanmanız.Çünkü bunun sayesinde içinde yani Cloud9 içinde tanımlı olan kütüphaneye ulaşabiliyorsunuz. Kod yazım sistemi javascript ile yapılıyor.
Ben bu şekilde deneme yaptım gayet güzel oluyor.
Birde eclipse deneyenler var ama o biraz uzun sürüyor.

son olarak böyle bir paylaşım yaptığınız için teşekkür ederim çünkü nette bu konu hakkında çok az deney yapan sizde bende karşılık deney yapıp paslaşalım sitede paylaşalım.
Kararsız...

erenbasturk

#2
Alıntı yapılan: Firzen - 26 Ocak 2013, 19:59:56
Sanırım CCS kullanıyorsunuz benim tavsiyem beaglebone içine Angstrom Cloud9 IDE li sürümünü kurup kullanmanız.Çünkü bunun sayesinde içinde yani Cloud9 içinde tanımlı olan kütüphaneye ulaşabiliyorsunuz. Kod yazım sistemi javascript ile yapılıyor.
Ben bu şekilde deneme yaptım gayet güzel oluyor.
Birde eclipse deneyenler var ama o biraz uzun sürüyor.

son olarak böyle bir paylaşım yaptığınız için teşekkür ederim çünkü nette bu konu hakkında çok az deney yapan sizde bende karşılık deney yapıp paslaşalım sitede paylaşalım.

Eclipse tabanlı bir IDE kullanıyorum. Üstte belirttiğim örnek program olarak sorunsuz olarak beaglebone üzerinde çalışıyor fakat gpio1_6'ya bağladığım led'de herhangi bir degişiklik olmuyor. Daha önce cloud sistemini kullanıp io'lar ile ilgili çalışma yapmıştım fakat benim belirttiğim uygulama ; herhangi bir derleyicide am3359 işlemcisine ait adresleri kullanarak armv7 için derlediğiniz uygulamayı BeagleBone üzerinde çalıştırmak.

fatihinanc

#3
Eren Selamlar,

bendeki am3359 header dosyasında GPIO_DATAOUT offset adresi 0x13C olarak görünüyor.
am335x.h dosyasını buraya ekleyebilir misin ?

mesaj birleştirme:: 27 Ocak 2013, 04:56:46

Kodu aşağıdaki şekilde derler misin ?
GPIO yu map ettikten sonra çıkış olarak tanımlama kısmını eksik bir de.

#include <stdlib.h>
#include <stdio.h>
#include <hw/inout.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <stdint.h>

#define AM335X_GPIO_SIZE	0x00001000
#define AM335X_GPIO1_BASE       0x4804C000
#define GPIO_DATAOUT            0x13C
#define GPIO_OE                 0x134
#define GPIO0                   (1<<6)

/*
 *  GPIO0 = GPIO1_6
 */

uintptr_t *gpio_base;
uint32_t *val;


int main(int argc, char *argv[])
 {
    ThreadCtl (_NTO_TCTL_IO,NULL);

    gpio_base =  mmap_device_io(AM335X_GPIO_SIZE,AM335X_GPIO1_BASE);
    
    val  = in32(gpio_base + GPIO_OE);
    val &= ~(GPIO0);
    out32(gpio_base + GPIO_OE, val);

    while(1)
    {

        val = ~(GPIO0);
        out32(gpio_base + GPIO_DATAOUT, val);
        delay(1000);
    }

    return 0;
}
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

erenbasturk

Merhaba Fatih,

Bendeki am335x.h ve am3359 datasheet'tindeki GPIO_DATAOUT offset adresi 13C. Bir forumda kodları paylaşıtığımda gelen yorumda offset adresini degiştirmem gerektiği söylendiğini için adresi 8C olarak degiştirdim.



Hi,

Based on the BeagleBone docs from here:

http://beagleboard.org/static/beaglebone/latest/Docs/Hardware/BONE_SRM.pdf

It would appear that GPIO1_6 has an offset from the AM335X_GPIO1_BASE of 140 (0x8C),
so I think you need to change GPIO_DATAOUT to 0x8C.



Programı yukarıdaki şekilde ve GPIO_DATAOUT offset adresi 8C olarak derledim. Uygulamalar BeagleBone üzerinde çalışıyor fakat Led'de herhangi bir değişiklik olmadı.

Yorumun için teşekkür ederim.

fatihinanc

Offset adresleri olduğu gibi kalmalı Eren. Base adres ile offset adres ekleme işlemini zaten out32 fonksiyonu yapıyor.

Bu arada kodda 2 tane hata gözüme çarptı. Bunları düzeltip tekrar ekliyorum aşağıya.

1. val değişkenini pointer tanımlamışsın. Normal olması gerekiyor. Fonksiyonlara doğrudan veri göndermen gerekiyor yani.
2. main fonksiyonu içerisinde GPIO yu tersleyen rutin yanlış olmuş. Doğrusunun val ^= GPIO0; olması lazım.

#include <stdlib.h>
#include <stdio.h>
#include <hw/inout.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <stdint.h>

#define AM335X_GPIO_SIZE	0x00001000
#define AM335X_GPIO1_BASE       0x4804C000
#define GPIO_DATAOUT            0x13C
#define GPIO_OE                 0x134
#define GPIO0                   (1<<6)

/*
 *  GPIO0 = GPIO1_6
 */

uintptr_t *gpio_base;
uint32_t   val;


int main(int argc, char *argv[])
 {
    ThreadCtl (_NTO_TCTL_IO,NULL);

    gpio_base =  mmap_device_io(AM335X_GPIO_SIZE,AM335X_GPIO1_BASE);
    
    val  = in32(gpio_base + GPIO_OE);
    val &= ~GPIO0;
    out32(gpio_base + GPIO_OE, val);

    while(1)
    {
        val ^= GPIO0;
        out32(gpio_base + GPIO_DATAOUT, val);
        delay(1000);
    }

    return 0;
}
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

erenbasturk

#6
"val" degişkenindeki pointer'ı foruma eklerken uygulamada unuttuğumu düşünerek eklemiştim. "val ^= GPIO0;"  şeklinde degiştirip üsteki kodları derledim. Uygulama çalıştı fakat led'de bir degişiklik olmadı. Birde beaglebone'un usr led'leri üzerinde programı çalıştırmayı denedim usr led'leride yanmadı. Programda eksik bir yerde göremedim.




Erhan YILMAZ

Merhabalar hocam konuyla alakası yok ama bişey sorcaktım. Beaglebone üzerinde c/c++ kod yazmak için neler gerekli? Hangi IDE, işletim sistemi neler yapmak gerekiyor v.s.?

erenbasturk

#8
Alıntı yapılan: Erhan YILMAZ - 31 Ocak 2013, 13:19:40
Merhabalar hocam konuyla alakası yok ama bişey sorcaktım. Beaglebone üzerinde c/c++ kod yazmak için neler gerekli? Hangi IDE, işletim sistemi neler yapmak gerekiyor v.s.?

Merhaba Erhan,

Editörde yazdığın kodları beaglebone'un üzerinde bulunan işlemiye göre derleyebilmek için sistemine çapraz derleyici kurman gerekiyor. Daha sonra derleme sırasında sisteme kurduğun çapraz derleyici kullanıyorsun.

Bir de kendi içinde çapraz derleyicileriyle gelen editörler bulunuyor "codeblocks" gibi herhangi bir çapraz derleyici kurmadan bu editörlede işlemci mimarisini belirterek derleme işlemini yapabiliryorsun.

yamak

Alıntı yapılan: Erhan YILMAZ - 31 Ocak 2013, 13:19:40
Merhabalar hocam konuyla alakası yok ama bişey sorcaktım. Beaglebone üzerinde c/c++ kod yazmak için neler gerekli? Hangi IDE, işletim sistemi neler yapmak gerekiyor v.s.?
Hocam biraz  reklam gibi olacak ama aşağıdaki yazıyı inceleyebilirsin :)
http://www.yusufyamak.com/beaglebone-ve-qt/

Erhan YILMAZ

Teşekkür ederim cevaplarınız için. Yazıyı okudum hocam anladığım kadarıyla cross compiler gerekiyor. Fakat linux konusunda eksiklerim var bahsettiğiniz qt geliştirme ortamımıdır? Codeblock kurulumuda qtmake kadar karışık mı? Linuxta çalıştırılabilir dosya uzantısı nedir? .exe .apk v.s.? Diyelimki derleme işlemini yapıp çalıştırılabilir dosyayı elde ettim. Bunu nasıl beaglebona atıp çalıştırcam? Beaglebonun sd kartına atıp dizini göstererek çalıştırabilirmiyim? Şuanda angstron yüklü başka bir sistem yüklemeye gerek var mı? Angstrom ne kadar iyidir? En uygun ide hangisi başlangıç için?

erenbasturk

Alıntı yapılan: Erhan YILMAZ - 31 Ocak 2013, 21:29:04
Teşekkür ederim cevaplarınız için. Yazıyı okudum hocam anladığım kadarıyla cross compiler gerekiyor. Fakat linux konusunda eksiklerim var bahsettiğiniz qt geliştirme ortamımıdır? Codeblock kurulumuda qtmake kadar karışık mı? Linuxta çalıştırılabilir dosya uzantısı nedir? .exe .apk v.s.? Diyelimki derleme işlemini yapıp çalıştırılabilir dosyayı elde ettim. Bunu nasıl beaglebona atıp çalıştırcam? Beaglebonun sd kartına atıp dizini göstererek çalıştırabilirmiyim? Şuanda angstron yüklü başka bir sistem yüklemeye gerek var mı? Angstrom ne kadar iyidir? En uygun ide hangisi başlangıç için?

Codeblokcs kurulumu oldukça basit ubuntu yazılım merkezinde codeblokcs olarak arama yapıp yükle butonuna basacaksınız. Aslında biraz linux'le çalışınca qmake konusuda karışık gelmeyecektir. Linux'ta derlediğiniz program  sonunda size uzantısı olmayan bir dosya verilir. Bu dosya kullandığınız kabuğa göre "./program" ," program & ", "sh program" şeklinde çalıştırılabilir.

Derlediğin yazılımı BeagleBone'un sd kartına atıp çalıştırabilirsin fakat bu yöntemden ziyade beaglebone'un ethernet bağlantısı yapıp derleme işlemlerini ethernet üzerinden beaglebone üzerinde eş zamanlı olarak görebilirsin.


erenbasturk

Sorunu hallettim ilgilenen herkese teşekkür ederim.

#include <stdlib.h>
#include <stdio.h>
#include <hw/inout.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <stdint.h>

#define AM335X_GPIO_SIZE                0x00001000
#define AM335X_GPIO1_BASE               0x4804C000
#define GPIO_DATAOUT                    0x13C
#define GPIO_OE                         0x134

#define LED0                (1<<21)
#define LED1                (1<<22)
#define LED2                (1<<23)
#define LED3                (1<<24)
#define LEDS(n)             ((n&0xf)<<21)

int main(int argc, char *argv[])
{
        int i = 0;
        uintptr_t        gpio_base;
        uint32_t        val;
        ThreadCtl (_NTO_TCTL_IO,NULL);

    
    gpio_base = mmap_device_io(AM335X_GPIO_SIZE, AM335X_GPIO1_BASE);
    if(gpio_base == MAP_DEVICE_FAILED)
    {
        perror("Can't map device I/O");
        return 0;
    }

  
    val  = in32(gpio_base + GPIO_OE);
    val &= ~(LED0|LED1|LED2|LED3);
    out32(gpio_base + GPIO_OE, val);

        while(i<16)
        {
                printf("i = %i\n", i);
               
                val  = in32(gpio_base + GPIO_DATAOUT);
                val &= ~(LED0|LED1|LED2|LED3);
                val |= (LEDS(i++));
                out32(gpio_base + GPIO_DATAOUT, val);
                sleep(5);
        }

    munmap_device_io(gpio_base, AM335X_GPIO_SIZE);

    return 1;
}

Erhan YILMAZ

Alıntı yapılan: erenbasturk - 31 Ocak 2013, 22:55:14
Codeblokcs kurulumu oldukça basit ubuntu yazılım merkezinde codeblokcs olarak arama yapıp yükle butonuna basacaksınız. Aslında biraz linux'le çalışınca qmake konusuda karışık gelmeyecektir. Linux'ta derlediğiniz program  sonunda size uzantısı olmayan bir dosya verilir. Bu dosya kullandığınız kabuğa göre "./program" ," program & ", "sh program" şeklinde çalıştırılabilir.

Derlediğin yazılımı BeagleBone'un sd kartına atıp çalıştırabilirsin fakat bu yöntemden ziyade beaglebone'un ethernet bağlantısı yapıp derleme işlemlerini ethernet üzerinden beaglebone üzerinde eş zamanlı olarak görebilirsin.
Hocam teşekkür ederim dahada şekillendi olaylar kafamda. Az önce codeblocks'u marketten kurdum. Mesela bu yazdığınız kodları Codeblock üzerinde beaglebone için derleyip atabilir miyim? Bunun için proje açıp derleme işlemini yapmak yeterli mi? Kabuktan kastınız linux dağıtımı mı? Beagle üzerinde angstrom kurulu örneğin angstrom için hangi komut gerekli? Angstromda kalmaya devam etmeli miyim yoksa ubuntu, android yada başka sistemlere geçmekte fayda var mı? Ethernet üzerinden  bağlanmak için cross kablo gerekiyor sanırım? Elimde olmadığı için sd karta kopyalamayı düşündüm hocam. Kusura bakmayın biraz fazla soruyorum linux üzerinde yeni olduğum için anlamaya çalışıyorum. İlginiz için teşekkürler. :)

Firzen

@Erhan Yılmaz Aynı soruları be soracaktım siz yerime söylediniz herşeyi :)
Kararsız...