平臺:MTK6795 Android5.0
目的:在MTK6795平臺使用代碼對MT6795的GPIO166 GPIO167 GPIO168 GPIO169管腳設置成普通的GPIO功能,輸出
在Android的內核源碼目錄kernel-3.10/include/mach/mt_gpio.h中看到
/******************************************************************************
* GPIO Driver interface
******************************************************************************/
/*direction*/
int mt_set_gpio_dir(unsigned long pin, unsigned long dir);
int mt_get_gpio_dir(unsigned long pin);
/*pull enable*/
int mt_set_gpio_pull_enable(unsigned long pin, unsigned long enable);
int mt_get_gpio_pull_enable(unsigned long pin);
/*schmitt trigger*/
int mt_set_gpio_smt(unsigned long pin, unsigned long enable);
int mt_get_gpio_smt(unsigned long pin);
/*IES*/
int mt_set_gpio_ies(unsigned long pin, unsigned long enable);
int mt_get_gpio_ies(unsigned long pin);
/*pull select*/
int mt_set_gpio_pull_select(unsigned long pin, unsigned long select);
int mt_get_gpio_pull_select(unsigned long pin);
/*data inversion*/
int mt_set_gpio_inversion(unsigned long pin, unsigned long enable);
int mt_get_gpio_inversion(unsigned long pin);
/*input/output*/
int mt_set_gpio_out(unsigned long pin, unsigned long output);
int mt_get_gpio_out(unsigned long pin);
int mt_get_gpio_in(unsigned long pin);
/*mode control*/
int mt_set_gpio_mode(unsigned long pin, unsigned long mode);
int mt_get_gpio_mode(unsigned long pin);
上述的這些接口函數類似於linux的gpio_request/gpio_set_direction等的gpio操作函數
利用上述的幾個函數設置GPIO166 GPIO167 GPIO168 GPIO169的輸出,上拉,GPIO功能的示例gpio_test.c:
//gpio_test.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/spi/spi.h>
#include <linux/workqueue.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/spinlock.h>
#include <linux/sched.h>
#include <linux/wakelock.h>
#include <mach/mt_gpio.h>
static int __init gpio_test_init ( void )
{
printk ("%s:%s[%d] \n", __FILE__, __func__, __LINE__);
mt_set_gpio_mode (GPIO166, 1);
mt_set_gpio_dir (GPIO166, GPIO_DIR_OUT);
mt_set_gpio_pull_enable (GPIO166, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select (GPIO166, GPIO_PULL_UP);
mt_set_gpio_mode (GPIO167, 1);
mt_set_gpio_dir (GPIO167, GPIO_DIR_OUT);
mt_set_gpio_pull_enable (GPIO167, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select (GPIO167, GPIO_PULL_UP);
mt_set_gpio_mode (GPIO168, 1);
mt_set_gpio_dir (GPIO168, GPIO_DIR_OUT);
mt_set_gpio_pull_enable (GPIO168, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select (GPIO168, GPIO_PULL_UP);
mt_set_gpio_mode (GPIO169, 1);
mt_set_gpio_dir (GPIO169, GPIO_DIR_OUT);
mt_set_gpio_pull_enable (GPIO169, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select (GPIO169, GPIO_PULL_UP);
}
static void __exit gpio_test_exit ( void )
{
printk ("%s:%s[%d] \n", __FILE__, __func__, __LINE__);
}
module_init ( gpio_test_init );
module_exit ( gpio_test_exit );
MODULE_LICENSE ( "GPL" );
然後將gpio_test.c編譯到內核,再燒寫鏡像,查看啓動日誌就可以看到gpio_test驅動的啓動支持。