演示代碼使用GPIO_B_31引腳輸出模式
寄存器版本
查看芯片手冊GPIO描述
輸出模式需要設置引腳功能,nexell的cpu GPIO腳一共有四種可選功能,每個腳的選項不一樣。這裏說要用作IO得設置爲00,其實是錯誤的,不得不說nexell的設計很奇葩因爲GPIO功能並不一定都是00,這次的GPIO_B_31就得設置爲01,如下圖描述。
另外使能使出和設置電平就可以了。看下寄存器描述
輸入使能和高低電平很簡單,對位設置就好。功能設置部分每兩位配置一個引腳。定義寄存器結構體,吧用到的定義一下就好
#pragma pack(4)
static struct GPIO_B{
unsigned int out_put;
unsigned int out_enb;
unsigned int detect_md_1;
unsigned int detect_md_2;
unsigned int int_enb;
unsigned int event_detect;
unsigned int pad_state;
unsigned int resv;
unsigned int func0;
unsigned int func1;
}* gpio_b;
#pragma pack()
整體代碼
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>
MODULE_LICENSE("GPL");
#pragma pack(4)
static struct GPIO_B{
unsigned int out_put;
unsigned int out_enb;
unsigned int detect_md_1;
unsigned int detect_md_2;
unsigned int int_enb;
unsigned int event_detect;
unsigned int pad_state;
unsigned int resv;
unsigned int func0;
unsigned int func1;
}* gpio_b;
#pragma pack()
static int __init hello_init(void){
gpio_b = (struct GPIO_B *)ioremap(0xc001b000,sizeof(struct GPIO_B));//映射地址
gpio_b->func1 |= (1 << 30); //設置功能爲1
gpio_b->out_enb |= (1 << 31); //使能輸出
gpio_b->out_put |= (1 << 31); //高電平
printk("hello init\n");
return 0;
}
static void __exit hello_exit(void){
gpio_b->out_put &= ~(1 << 31);
printk("hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
api版本
api版本沒什麼好說的,讀一下庫函數,直接寫就行,下面是整體代碼
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <mach/soc.h>
#include <mach/platform.h>
MODULE_LICENSE("GPL");
static int __init hello_init(void){
nxp_soc_gpio_set_io_func(PAD_GPIO_B + 31, 1); // 設置gpio功能
nxp_soc_gpio_set_io_dir(PAD_GPIO_B + 31, 1); // 輸出
nxp_soc_gpio_set_out_value(PAD_GPIO_B + 31, 1); // 高電平
printk("hello init\n");
return 0;
}
static void __exit hello_exit(void){
nxp_soc_gpio_set_out_value(PAD_GPIO_B + 31, 0); // 低電平
printk("hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);