5.【linux驅動】GPIO

演示代碼使用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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章