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
Ö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
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;
}
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;
}