全志t3linux驱动_全志linux C应用程序mmap方式驱动GPIO

本文介绍了一个使用C语言在全志T3 Linux平台上进行GPIO驱动和配置的示例。通过mmap方式访问硬件寄存器,实现GPIO口的初始化、配置模式和设置电平。主要涉及的函数包括GPIO_Init、GPIO_ConfigPin和GPIO_SetPin,可用于控制GPIO端口的输入输出状态。
摘要由CSDN通过智能技术生成

#include

#include

#include

#include

#include

#include

#define PIO_BASE_ADDRESS 0x01C20800

typedef struct

{

unsigned int CFG[4];

unsigned int DAT ;

unsigned int DRV0;

unsigned int DRV1;

unsigned int PUL0;

unsigned int PUL1;

}PIO_Struct;

typedef struct

{

PIO_Struct Pn[7];

}PIO_Map;

typedef enum

{

PA = 0,

PB = 1,

PC = 2,

PD = 3,

PE = 4,

PF = 5,

PG = 6,

}PORT;

typedef enum

{

IN = 0x00,

OUT = 0x01,

AUX = 0x02,

INT = 0x06,

DISABLE = 0x07,

}PIN_MODE;

PIO_Map *PIO = NULL;

unsigned int *gpio_map;

void GPIO_Init(void)

{

unsigned int fd;

unsigned int addr_start, addr_offset;

unsigned int PageSize, PageMask;

if((fd = open("/dev/mem",O_RDWR)) == -1)

{

printf("open error\r\n");

return;

}

PageSize = sysconf(_SC_PAGESIZE); //页大小

PageMask = (~(PageSize-1)); //页掩码

// printf("PageSize:%d,PageMask:%.8X\r\n",PageSize,PageMask);

addr_start = PIO_BASE_ADDRESS & PageMask;

addr_offset = PIO_BASE_ADDRESS & ~PageMask;

// printf("addr_start:%.8X,addr_offset:%.8X\r\n",addr_start,addr_offset);

if((gpio_map = mmap(NULL,PageSize*2,PROT_READ|PROT_WRITE, MAP_SHARED,fd,addr_start)) == NULL)

{

// printf("mmap error\r\n");

close(fd);

return;

}

// printf("gpio_map:%.8X\r\n",gpio_map);

PIO = (PIO_Map *)((unsigned int)gpio_map + addr_offset);

// printf("PIO:%.8X\r\n",PIO);

close(fd);

}

void GPIO_ConfigPin(PORT port,unsigned int pin,PIN_MODE mode)

{

if (gpio_map == NULL)

return;

PIO->Pn[port].CFG[pin / 8] &= ~((unsigned int)0x07 << pin % 8 * 4);

PIO->Pn[port].CFG[pin / 8] |= ((unsigned int)mode << pin % 8 * 4);

}

void GPIO_SetPin(PORT port,unsigned int pin,unsigned int level)

{

if (gpio_map == NULL)

return;

if(level) PIO->Pn[port].DAT |= (1 << pin);

else PIO->Pn[port].DAT &= ~(1 << pin);

}

void main()

{

char i;

// printf("this is main!\n\n");

GPIO_Init();

GPIO_ConfigPin(PE,5,OUT);

// for(i=0;i<150;i++)

{

GPIO_SetPin(PE,5,1);

// sleep(0.1);

// GPIO_SetPin(PE,5,0);

// sleep(0.1);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值