ircut.c
2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "ircut.h"
unsigned int fd;
PIO_Map *PIO = NULL;
unsigned int *gpio_map;
unsigned int addr_start, addr_offset;
unsigned int PageSize, PageMask;
extern char textbuf[256];
void GPIO_Init(void)
{
if ((fd = open("/dev/mem", O_RDWR)) == -1)
{
printf("open error");
return;
}
PageSize = sysconf(_SC_PAGESIZE); //ʹ��sysconf��ѯϵͳҳ���С
PageMask = (~(PageSize - 1)); //ҳ����
printf("PageSize:%d,PageMask:0x%.8X", PageSize, PageMask);
addr_start = PIO_BASE_ADDRESS & PageMask; //0x01C20800 & 0xfffff000 = 0x1C20000
addr_offset = PIO_BASE_ADDRESS & ~PageMask; //0x01C20800 & 0x00000fff = 0x00000800
printf("addr_start:%.8X,addr_offset:0x%.8X", addr_start, addr_offset);
//mmap(ϵͳ�Զ������ڴ��ַ��ӳ�������ȡ��ڴ�ҳ������������ѡ��ɶ���д��MAP_SHARED=����������ӳ�䵽�������Ľ��̹����ռ䣬�ļ��������ӳ�����ݵ����)
//offest ӳ�������ڴ�Ļ�������ҳ����!!! ���������ʼ��ַӦ����0x1000������������ô����0x01C20800��Ҫ��ȥ0x800������������
if ((gpio_map = mmap(NULL, PageSize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start)) == NULL)
{
printf("mmap error");
close(fd);
return;
}
printf("gpio_map:%.8X", gpio_map);
//�����Ѿ���0x1c20000�ĵ�ַӳ�䵽���ڴ��У�����������Ҫ�ĵ�ַ��0x01C20800������Ҫ�ټ��ϵ�ַƫ������
PIO = (PIO_Map *)((unsigned int)gpio_map + addr_offset);
printf("PIO:0x%.8X", 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);
printf("struct PIO_Struct size : %d",sizeof(PIO->Pn[port]));
}
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);
}
int GPIO_Free(void)
{
if ((munmap(gpio_map, PageSize * 2)) == 0)//ȡ��ӳ��
{
printf("unmap success!");
}
else
{
printf("unmap failed!");
}
return 0;
}
void init_amplifier(void)//������ʼ��
{
GPIO_Init();
GPIO_ConfigPin(PB,4,OUT);
}
void set_amplifier(int amplifier_mode){//���ſ���
if(amplifier_mode==0){//�رչ���
GPIO_SetPin(PB,4,0);
}
else if(amplifier_mode==1){//����
GPIO_SetPin(PB,4,1);
}
}