GPIO端口设置input/output有关问题

GPIO端口设置input/output问题
请问如果我要设置一个GPIO引脚为input或output, 是应该通过设置GPxCON寄存器呢还是直接调用linux的gpio_direction_input()呢? 后者的话Linux又是怎样通过根据不同硬件进行配置的呢?

初学嵌入式,对这些基础不太理解,请各位大虾赐教。。。

------解决方案--------------------
你要进行input或output设置肯定是要对那个寄存器进行操作的,而具体怎么操作就要看啦,你可以直接配置这个寄存器,而调用函数的话,一般这个函数都会带个地址参数的
------解决方案--------------------
可不可以调用gpio_direction_input(),就要看你用的Linux系统了,这系统是针对你的开发板移植过来的Linux,移植的时候是否对gpio_direction_input()做了支持,这需要确定一下。
而直接配置寄存器,肯定是不成问题的。不过需要注意一下,在Linux下,是通过虚拟内存来访问任何资源的,所以这时不能直接用寄存器的物理地址来访问寄存器,而需要得到它的虚拟地址。而得到虚拟地址的方法很多。比如使用ioremap对以某地址为首地址的指定大小空间进行虚拟映射,得到虚拟首地址,之后即可访问了
------解决方案--------------------
给你个例子,在目录linux/arch/arm/mach-at91/gpio.c中

int gpio_direction_input(unsigned pin)
{
void __iomem *pio = pin_to_controller(pin);
unsigned mask = pin_to_mask(pin);

if (!pio || !(__raw_readl(pio + PIO_PSR) & mask))
return -EINVAL;
__raw_writel(mask, pio + PIO_ODR);
return 0;
}