📄 9315-dio.c
字号:
/********************************
*Testing Digital I/O on a GESBC-9315
*
*******************************/
#include<unistd.h>
#include<sys/types.h>
#include<sys/mman.h>
#include<stdio.h>
#include<fcntl.h>
#include<assert.h>
#include<time.h>
/*Register addresses */
#define DIGITAL_IO_PAGE 0x80840000UL
#define SYSTEM_CTRL_PAGE 0x80930000UL
/*Offsets*/
#define DEVICE_CONFIG 0x80 /* Device Config Register */
#define DIGITAL_IO_DATA 0x08 /* Port C Data Register */
#define DIGITAL_IO_DDR 0x18 /* Port C Data Direction Register */
#define TRUE 0
#define FALSE !TRUE
static inline unsigned short READP16(unsigned long addr) {
unsigned short ret;
asm volatile (
"ldrh %0, [ %1 ]\n"
: "=r" (ret)
: "r" (addr)
: "memory"
);
return ret;
}
static inline void WRITEP16(unsigned long addr, unsigned short dat) {
asm volatile (
"strh %1, [ %0 ]\n"
:
: "r" (addr), "r" (dat)
: "memory"
);
}
static inline unsigned long READP32(unsigned long addr) {
unsigned long ret;
asm volatile (
"ldr %0, [ %1 ]\n"
: "=r" (ret)
: "r" (addr)
: "memory"
);
return ret;
}
static inline void WRITEP32(unsigned long addr, unsigned long dat) {
asm volatile (
"str %1, [ %0 ]\n"
:
: "r" (addr), "r" (dat)
: "memory"
);
}
static inline unsigned char READP8(unsigned long addr) {
unsigned char ret;
asm volatile (
"ldrb %0, [ %1 ]\n"
: "=r" (ret)
: "r" (addr)
: "memory"
);
return ret;
}
static inline void WRITEP8(unsigned long addr, unsigned char dat) {
asm volatile (
"strb %1, [ %0 ]\n"
:
: "r" (addr), "r" (dat)
: "memory"
);
}
int main(int argc, char **argv)
{
volatile unsigned char *digital_io_page, *sysctrl_page;
volatile unsigned char portCDDR, portCDR;
volatile unsigned long deviceCFG;
int fd = open("/dev/mem", O_RDWR);
assert(fd != -1);
/* this program has 2 seconds to complete or it will be killed */
alarm(2);
/* Intialize our pointers */
digital_io_page = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, DIGITAL_IO_PAGE);
assert(digital_io_page != MAP_FAILED);
sysctrl_page = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, SYSTEM_CTRL_PAGE);
assert(sysctrl_page != MAP_FAILED);
//make sure Port C is configured as GPIO (EP9315 user gudie page 157,804)
deviceCFG=READP32( (unsigned long)(sysctrl_page + DEVICE_CONFIG) );
WRITEP32( (unsigned long)(sysctrl_page + DEVICE_CONFIG), 0x08000000UL | deviceCFG);
//enable the row 4 line (set it as output, on reset, all ports are default to input)
portCDDR=READP8( (unsigned long)(digital_io_page + DIGITAL_IO_DDR) );
WRITEP32( (unsigned long)(digital_io_page + DIGITAL_IO_DDR), 0x10 | portCDDR);
//set the output low
portCDR=READP8( (unsigned long)(digital_io_page + DIGITAL_IO_DATA) );
WRITEP32( (unsigned long)(digital_io_page + DIGITAL_IO_DATA), 0xEF & portCDR );
usleep(10000);
//bring signal up
portCDR=READP8( (unsigned long)(digital_io_page + DIGITAL_IO_DATA) );
WRITEP32( (unsigned long)(digital_io_page + DIGITAL_IO_DATA), 0x10 | portCDR );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -