飞思卡尔 p1010 gpio linux驱动开发

本文档详述了Centec平台下GPIO的开发流程,包括功能选择、模式配置、方向设置及数据读写等关键步骤。通过具体代码示例,介绍了如何通过驱动实现功能切换,配置GPIO为开漏输出模式,并提供了上层应用程序调用GPIO的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gpio 开发文档

简述

对于gpio的操作,一定要如下几部分满足条件才能正常的操作gpio。

  • 引脚功能选择,例如 引脚TSEC1_RX_CLK/DMA_DACK_B0/GPIO14上不只有gpio的功能,需要将其选在为gpio后才能当gpio一样使用。

  • gpio模式 例如 开漏 推挽等等,不同的应用需要配成不同的模式。

  • gpio的方向,是input还是output,从cpu往外发数据去配置器件叫output,器件的数据返回给cpu叫input。

  • 往gpio里写高低电平。

centec gpio功能选择

首先是查手册,在手册P1010RM.pdf的1723页,有如下的做功能选择的寄存器。
在这里插入图片描述

E_0060寄存器的4 5位为1 0,gpio14被选为gpio模式;6 7位被填写1 0引脚被选为GPIO15。

需要通过如下驱动做功能选择:

\cnos\platform\linux\arch\powerpc\platforms\85xx\p1010_ctc_gb.c
p1010_ctc_setup_arch

	//fpga片选引脚功能选择
	alter_fun_addr = ioremap(0xffee0060, 0x1000);
	if(alter_fun_addr == NULL) {
		printk(KERN_EMERG "alter_fun_addr can not map.\r\n");
	}
	guts_pmuxcr1 = in_be32(alter_fun_addr);
	//gpio14 gpio15 功能选择为gpio模式,参考文档P1010RM.pdf 1723页。
	out_be32(alter_fun_addr, guts_pmuxcr1|0x0A000000); 
	guts_pmuxcr1 = in_be32(alter_fun_addr);
	iounmap(alter_fun_addr);

地址0xffee0060是怎么找到的?

代码中看到 gpio_logic_addr = ioremap(0xffe0f000, 0x1000) ; 在和手册上的Memory Map的内存映射图进行比较,得出应该是这个地址。

相关系统函数的分析

ioremap 是将物理地址映射为虚拟地址,物理地址是不能直接访问的。

in_be32(alter_fun_addr)相当于将虚拟地址alter_fun_addr里的内容读出来。

out_be32(alter_fun_addr, guts_pmuxcr1|0x0A000000); 将第二个参数的内容,写到第二个参数的地址中。

上边代码流程

相当于将E0060寄存里的内容先读出来,按手册修改相应bit位后,在写回寄存器中,起到功能选择的作用。

gpio模式配置为开漏方向配置为输出模式

\cnos\system\drvs\drvio\ctc_gpio\ctc_gpio.c
ctc_gpio_init
加入如下代码

		/*fpga cs gpio config*/
		#define FPGA1_EN 14
		#define FPGA0_EN 15
		printk("config fpga chip select gpio mode.dir,%x,od:%x\r\n",gpio_virtual_addr,gpio_virtual_addr + 4);
		/*dir is output*/
		setbits32(gpio_virtual_addr,(0x1 << (31-FPGA0_EN)));
		setbits32(gpio_virtual_addr,(0x1 << (31-FPGA1_EN)));
		/*set them as open drain mode*/
		setbits32(gpio_virtual_addr + 4,(0x1 << (31-FPGA0_EN)));
		setbits32(gpio_virtual_addr + 4,(0x1 << (31-FPGA1_EN)));

代码原理讲解:
#define setbits32(_addr, _v) out_be32((_addr), in_be32(_addr) | (_v))
所调用的函数setbits32 相当于将寄存器里的内容读出来,改变相应的bit后再写回去。
gpio_virtual_addr 寄存器的基地址,第一个寄存器为GPIO_GPDIR,方向寄存器,寄存器里的bit位,每一位代表一个gpio的方向,写1位输出,写0位输入。
基地址+4 为GPIO_GPODR 寄存器,开漏寄存器,是否配成开漏输出模式。

具体参考P1010RM.pdf 第24章。

gpio的数据的读写

对gpio数据读写要操作寄存器GPIO_GPDAT,gpio基地址偏移8,具体操作参考文档P1010RM.pdf 第24章。

gpio操作上层应用程序的调用

gpio_fd = open("/dev/ctc_gpio", O_RDWR);  //open

ioctl(gpio_fd, CTC_GPIO_GPIO_INIT, 0);   //初始化

ioctl(gpio_fd, CTC_GPIO_WRITE, (long) &gpio_value); //读写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值