Gpio Base Adress ?

Başlatan erenbasturk, 06 Ocak 2013, 15:38:37

erenbasturk

Merhabalar,

Am3359 işlemcisini inceliyorum. Bu işlemcide GPIO0,GPIO1,GPIO2,GPIO3 base adreslerini http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=spruh73g&fileType=pdf url'sinde bulunan am335x datasheet'i yardımıyla hesaplama çalışıyorum fakat işin içinden çıkamadım.

GPIO base adresleri gpio driver'ının içinden aldım.

#define AM335X_GPIO0_BASE           0x44E07000
#define AM335X_GPIO1_BASE           0x4804C000
#define AM335X_GPIO2_BASE           0x481AC000
#define AM335X_GPIO3_BASE           0x481AE000

Bu adreslerin nasıl hesaplanacağı konusunda nasıl bir yol izlemeliyim?

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

CLR

Gpio base adresleri memory map kısmında yazıyor, eğer gpio içindeki registerlerin adreslerini istiyorsan, gpio kısmını aç ve ofset'leri bu base adreslere ekle herbirinin aynı registerine erişirsin.

RegionName           StartAddress(hex)              EndAddress(hex)              Size                 Description                    Page
GPIO0                      0x44E0_7000                       0x44E0_7FFF                 4KB                  GPIORegisters             153
GPIO1                      0x4804_C000                       0x4804_CFFF                 4KB                  GPIO1Registers           154
GPIO2                      0x481A_C000                       0x481A_CFFF                 4KB                  GPIO2Registers           156
GPIO3                      0x481A_E000                       0x481A_EFFF                  4KB                  GPIO3Registers           156
Knowledge and Experience are Power

erenbasturk

Öncelikle cevabın için teşekkür ederim. Herhangi bir GPIO register'ında değişiklik yapmak istiyorsam GPIO için kullanabileceğim offset adresleri altta bulunuyor.

Diyelim ki Ben kullanmak istediğim GPIO'nun base adresine datain offset adresini eklersem base adresini kullandığım tüm gpio pinleri için datain seçili oluyor.

Ben yalnızca GPIO0_6'da bu özelliğin olmasını istiyorum bunu nasıl ayarlabilirim? Aslında benim tam olarak öğrenmek istediğim bir gpio'nun base adreslerini kullarak GPIO0_1, GPIO0_7 gibi pinlere adresler ile erişmek. Bu adreslerin nasıl atandığını datasheet'ten tam anlayamadım.


#define GPIO_REVISION          0x000   // GPIO Revision Register Section 9.3.1
#define GPIO_SYSCONFIG       0x010   // System Configuration Register Section 9.3.2
#define GPIO_EOI             0x020   // End of Interrupt Register Section 9.3.3
#define GPIO_IRQSTATUS_RAW_0    0x024   // Status Raw Register for Interrupt 1 Section 9.3.4
#define GPIO_IRQSTATUS_RAW_1    0x028   // Status Raw Register for Interrupt 2 Section 9.3.4
#define GPIO_IRQSTATUS_0       0x02C   // Status Register for Interrupt 1 Section 9.3.5
#define GPIO_IRQSTATUS_1       0x030   // Status Register for Interrupt 2 Section 9.3.5
#define GPIO_IRQSTATUS_SET_0    0x034   // Enable Set Register for Interrupt 1 Section 9.3.6
#define GPIO_IRQSTATUS_SET_1    0x038   // Enable Set Register for Interrupt 2 Section 9.3.6
#define GPIO_IRQSTATUS_CLR_0    0x03C   // Enable Clear Register for Interrupt 1 Section 9.3.7
#define GPIO_IRQSTATUS_CLR_1    0x040   // Enable Clear Register for Interrupt 2 Section 9.3.7
#define GPIO_SYSSTATUS          0x114   // System Status Register Section 9.3.8
#define GPIO_CTRL             0x130   // Module Control Register Section 9.3.9
#define GPIO_OE             0x134   // Output Enable Register Section 9.3.10
#define GPIO_DATAIN          0x138   // Data Input Register Section 9.3.11
#define GPIO_DATAOUT          0x13C   // Data Output Register Section 9.3.12
#define GPIO_LEVELDETECT0       0x140   // Low-level Detection Enable Register Section 9.3.13
#define GPIO_LEVELDETECT1       0x144   // High-level Detection Enable Register Section 9.3.14
#define GPIO_RISINGDETECT       0x148   // Rising-edge Detection Enable Register Section 9.3.15
#define GPIO_FALLINGDETECT       0x14C   // Falling-edge Detection Enable Register Section 9.3.16
#define GPIO_DEBOUNCENABLE       0x150   // Debounce Enable Register Section 9.3.17
#define GPIO_DEBOUNCINGTIME    0x154   // Debouncing Time Register Section 9.3.18
#define GPIO_CLEARDATAOUT       0x190   // Clear Data Output Register Section 9.3.19
#define GPIO_SETDATAOUT       0x194   // Set Data Output Register Section 9.3.20


Alıntı yapılan: uicroarm - 06 Ocak 2013, 18:37:52
Gpio base adresleri memory map kısmında yazıyor, eğer gpio içindeki registerlerin adreslerini istiyorsan, gpio kısmını aç ve ofset'leri bu base adreslere ekle herbirinin aynı registerine erişirsin.

RegionName           StartAddress(hex)              EndAddress(hex)              Size                 Description                    Page
GPIO0                      0x44E0_7000                       0x44E0_7FFF                 4KB                  GPIORegisters             153
GPIO1                      0x4804_C000                       0x4804_CFFF                 4KB                  GPIO1Registers           154
GPIO2                      0x481A_C000                       0x481A_CFFF                 4KB                  GPIO2Registers           156
GPIO3                      0x481A_E000                       0x481A_EFFF                  4KB                  GPIO3Registers           156

CLR

GPIO0_6 ve GPIO0_7 gibi port pinlerine erişmek istiyorsan C içinde istediğin registerler bit yapılarına göre struct olurturmalısın(aşağıdaki gibi) benim bildiğim cortex A8'derde bitbanding yok bu nedenle doğrudan bit adresleri yok

typedef struct {
  uint p0 : 1;
  uint p1 : 1;
  .......
  uint p31 : 1;
} GpioTypedef;

#define Gpio0 (*((volatile GpioTypedef *)0x20002000))


void MyFonc(void)
{
  Gpio0.p0 = 1;
  Gpio0.p30 = 0;
  Gpio0.p25 = 1;
}
Knowledge and Experience are Power

erenbasturk

#4
Verdiğin bilgiler için teşekkür ederim. Pinlere adreslerle nasıl erişildiğini anladığım gibi.

GPIO driver'ının içinden için şu bilgileri elde ettim. Pinler mux'lı olduğu için AM335X_CTRL_BASE üzerine adresler eklenerek 251 mod için birer adres atanmış. Yani bu adresler ile pinlere doğrudan erişme imkanı tanınıyor.

Mod0 için GPIO1_0'In AM335X_CTRL_BASE adresi üzerine eklenmiş adresi 0x800 GPIO1_1'in AM335X_CTRL_BASE üzerine eklenmiş adreside 0x0804 yani aynı modlar için gpio numarasıx4 lük bir artış var. Mod0'ıların tamamını inceledim ve bu artış hepsinde devam ediyor.

GPIO1_0  gpmc_ad0 (AM335X_CTRL_BASE+0x0800)
GPIO1_1  gpmc_ad1 (AM335X_CTRL_BASE+0x0804)
GPIO1_2 gpmc_ad2  (AM335X_CTRL_BASE+0x0808)
GPIO1_3 gpmc_ad3  (AM335X_CTRL_BASE+0x080C)

#define AM335X_CTRL_BASE  0x44E10000

Bu adresler driver'In içinden elde ettiğim  adresler. Benim merak ettiğim nokta bu modlardan bir tanesi için bu adresin datasheet yardımıyla nasıl elde edildiğini anlamak. Diyelimki uart0_rxd'pininin adresini elde etmek istiyorum. Bu adresi bulabilmek için hangi yolları izlemeyelim?






Alıntı yapılan: uicroarm - 06 Ocak 2013, 20:56:57
GPIO0_6 ve GPIO0_7 gibi port pinlerine erişmek istiyorsan C içinde istediğin registerler bit yapılarına göre struct olurturmalısın(aşağıdaki gibi) benim bildiğim cortex A8'derde bitbanding yok bu nedenle doğrudan bit adresleri yok

typedef struct {
  uint p0 : 1;
  uint p1 : 1;
  .......
  uint p31 : 1;
} GpioTypedef;

#define Gpio0 (*((volatile GpioTypedef *)0x20002000))


void MyFonc(void)
{
  Gpio0.p0 = 1;
  Gpio0.p30 = 0;
  Gpio0.p25 = 1;
}