ARM2410的GPIO 控制問題

我們生活周遭存在太多太多的 embedded system ,過去 embedded system 有專屬的 OS,現在 linux 也可以應用在嵌入式環境,不過本版將廣泛討論所有嵌入式系統不只 linux 喔,歡迎有這方面經驗或有興趣的朋友一同進來討論。

版主: chester

ARM2410的GPIO 控制問題

文章訪客 » 週四 6月 05, 2008 3:28 pm

我的程式
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<sys/mman.h>
#include<fcntl.h>
#include <asm/page.h>


#define GPIO_CTL_BASE 0x56000000
#define rGPCCON 0x10
#define rGPCDAT 0x14
#define rGPCUP 0x18


int main(int argc, char** argv)
{
int gpio_fd, ip=0, i=0;
unsigned char * gpio_map, * GPCCON, * GPCDAT, * GPCUP;

gpio_map = NULL;
GPCCON = NULL;
GPCDAT = NULL;
GPCUP = NULL;

gpio_fd = open("/dev/mem",O_RDWR);
if (gpio_fd == -1)
{
printf("can't open /dev/mem.\n");
return ;
}

gpio_map = (unsigned char *) mmap(0, getpagesize(),PROT_READ | PROT_WRITE, MAP_SHARED,gpio_fd, GPIO_CTL_BASE);
GPCCON = (unsigned int *) (gpio_map+0x10);
GPCDAT = (unsigned int *) (gpio_map+0x14);
GPCUP = (unsigned int *) (gpio_map+0x18);


for (ip=0;ip<=10;ip++)
{
printf("GPCCON[%x] GPCDAT[%x] GPCUP[%x]\n", *GPCCON, *GPCDAT, *GPCUP);
sleep(5);
}


if (gpio_fd != 0x0)
{
close(gpio_fd);
}

printf("GPIO Control Test end\n");

gpio_fd = 0x0;
gpio_map = NULL;
GPCCON = NULL;
GPCDAT = NULL;
GPCUP = NULL;
}

1. 請問程式裡面
gpio_map = (unsigned char *) mmap(0, getpagesize(),PROT_READ | PROT_WRITE, MAP_SHARED,gpio_fd, GPIO_CTL_BASE);
GPCCON = (unsigned int *) (gpio_map+0x10);
GPCDAT = (unsigned int *) (gpio_map+0x14);
GPCUP = (unsigned int *) (gpio_map+0x18);

的這四段是不是在對 ARM 板說我要使用(註冊) rGPCCON、rGPCDAT、 rGPCUP 我要使用(註冊)這三個gpio
2.如果是那我要怎樣控制gpio的動作,在程式裡面加入什麼樣的指令才可以控制動作,
例如我想讓 rGPCCON 的GPC5、GPC6、GPC7變成輸出,rGPCDAT 的GPC5、GPC6、GPC7都是1,我要加入怎樣的指令才可以完成控制的動作。
訪客
 

文章tomjpsun » 週四 6月 05, 2008 6:57 pm

1. yes, 他們分別對應到3個 registers
2. 建議去查 spec。我查得結果是 rGPCCON[15:10]=b'010101' ,rGPCDAT[7:5]=b'111' , rGPCUP[7:5]=b'111' 供您對照。
tomjpsun
可愛的小學生
可愛的小學生
 
文章: 82
註冊時間: 週一 1月 03, 2005 2:40 pm

文章訪客 » 週四 6月 05, 2008 9:59 pm

ㄜ~~我有點看不懂,你的意思是在這段程式的後面
for (ip=0;ip<=10;ip++)
{
printf("GPCCON[%x] GPCDAT[%x] GPCUP[%x]\n", *GPCCON, *GPCDAT, *GPCUP);
sleep(5);
}

加入

GPCCON = b'010101';
GPCDAT = b'111';

是這個意思嘛??( :-? 我是剛摸ARM2410所以有點不了解,這段程式是網路上找到的,所以想請各位給我一點答覆),我現在只是單純的想讓GPC5、GPC6、GPC7變成輸出,rGPCDAT 的GPC5、GPC6、GPC7都是1,所以能不能給我一個詳答,謝謝
訪客
 

文章tomjpsun » 週四 6月 05, 2008 11:32 pm

let b'010101' in bit 15:10, and keep other bits unchanged,
register should be read, modify , then write back

so , in C we code like this:
*GPCCON = *GPCCON & 0xFFFF03FF | 0x5400 ;

0xFFFF03FF : 跟這個做 C 語言的 & 動作,會 clear bit [15:10]
0x5400 : b'010101' 位於 bit [15:10] 的 Hex 表示式
等號右邊的 *GPCCON 為讀出 register 值
等號左邊的 *GPCCON 為寫入 register 值

其他的動作都類似於此。

還有,這問題應屬於 C 語言的問題,建議您去翻翻 C 語言的書吧! 這樣收穫更大!
tomjpsun
可愛的小學生
可愛的小學生
 
文章: 82
註冊時間: 週一 1月 03, 2005 2:40 pm

文章ernestkidd » 週三 10月 15, 2008 11:56 am

在 s3c2410 的規格書中有提到


Register Address R/W Description Reset Value
=========================================
GPCCON 0x56000020 R/W Configure the pins of port C 0x0
GPCDAT 0x56000024 R/W The data register for port C ndefined
GPCUP 0x56000028 R/W Pull-up disable register for port C 0x0


GPCCON Bit Description
=======================================
GPC15 [31:30] 00 = Input 01 = Output
10 = VD[7] 11 = Reserved
-------------------------------------------------------------
GPC14 [29:28] 00 = Input 01 = Output
10 = VD[6] 11 = Reserved
-------------------------------------------------------------
GPC13 [27:26] 00 = Input 01 = Output
10 = VD[5] 11 = Reserved
-------------------------------------------------------------
GPC12 [25:24] 00 = Input 01 = Output
10 = VD[4] 11 = Reserved
-------------------------------------------------------------
GPC11 [23:22] 00 = Input 01 = Output
10 = VD[3] 11 = Reserved
-------------------------------------------------------------
GPC10 [21:20] 00 = Input 01 = Output
10 = VD[2] 11 = Reserved
-------------------------------------------------------------
GPC9 [19:18] 00 = Input 01 = Output
10 = VD[1] 11 = Reserved
-------------------------------------------------------------
GPC8 [17:16] 00 = Input 01 = Output
10 = VD[0] 11 = Reserved
-------------------------------------------------------------
GPC7 [15:14] 00 = Input 01 = Output
10 = LCDVF2 11 = Reserved
-------------------------------------------------------------
GPC6 [13:12] 00 = Input 01 = Output
10 = LCDVF1 11 = Reserved
-------------------------------------------------------------
GPC5 [11:10] 00 = Input 01 = Output
10 = LCDVF0 11 = Reserved
-------------------------------------------------------------
GPC4 [9:8] 00 = Input 01 = Output
10 = VM 11 = Reserved
-------------------------------------------------------------
GPC3 [7:6] 00 = Input 01 = Output
10 = VFRAME 11 = Reserved
-------------------------------------------------------------
GPC2 [5:4] 00 = Input 01 = Output
10 = VLINE 11 = Reserved
-------------------------------------------------------------
GPC1 [3:2] 00 = Input 01 = Output
10 = VCLK 11 = Reserved
-------------------------------------------------------------
GPC0 [1:0] 00 = Input 01 = Output
10 = LEND 11 = Reserved


所以要把 gpc 5 6 7 改成 output 就要把
GPC5 [11:10] = 01;
GPC6 [13:12] = 01;
GPC7 [15:14] = 01;

開啟 GPC (不 pull up 時 GPCDAT 可以動作了 )
GPCUP = GPCUP & 0xff1f; // 1111_1111_0001_1111

而 GPCDAT 是 16 bit ( [15:0] )
所以要 5 6 7 為 1
GPCDAT = 0x00e0; // 0000_0000_1110_0000
ernestkidd
可愛的小學生
可愛的小學生
 
文章: 11
註冊時間: 週一 12月 24, 2007 10:31 am


回到 embedded system

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客