This commit is contained in:
MikuQ.com 2016-06-04 21:53:56 +08:00
parent 82d41c19a0
commit d2548dc950
8 changed files with 79 additions and 76 deletions

View File

@ -65,8 +65,8 @@ const int bPinTowPin[41] =
-1, 29, //39, 40
} ;
unsigned int SUNXI_PIO_BASE = 0;
unsigned int SUNXI_PIO_LM_BASE = 0;
unsigned int SUNXI_PIO_BASE = 0;
unsigned int SUNXI_PIO_LM_BASE = 0;
static volatile long int *gpio_map = NULL;
void delay(unsigned int howLong)
@ -174,17 +174,17 @@ void sayhello()
}
}
void mikuPiSetup (void)
void mikuPiSetup (void)
{
int fd;
unsigned int addr_start, addr_offset;
unsigned int PageSize, PageMask;
if (geteuid () != 0)
piBoardRevOops("MikuPiSetup: Must be root. (Did you forget sudo?)");
int model, mem;
piBoardId (&model, &mem);
int fd;
unsigned int addr_start, addr_offset;
unsigned int PageSize, PageMask;
if (geteuid () != 0)
piBoardRevOops("MikuPiSetup: Must be root. (Did you forget sudo?)");
int model, mem;
piBoardId (&model, &mem);
if (model == PI_MODEL_UNKNOWN)
{
printf ("Your Pi has an unknown model type. Please report this to\n") ;
@ -194,56 +194,56 @@ void mikuPiSetup (void)
if (model == PI_MODEL_M2p)
{
wPinToGpio=wPinToGpioM2p;
}
}
if (model == PI_MODEL_M3)
{
wPinToGpio=wPinToGpioM3;
}
fd = open("/dev/mem", O_RDWR);
PageSize = sysconf(_SC_PAGESIZE);
PageMask = (~(PageSize-1));
addr_start = SW_PORTC_IO_BASE & PageMask;
addr_offset = SW_PORTC_IO_BASE & ~PageMask;
gpio_map = (void *)mmap(0, PageSize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr_start);
SUNXI_PIO_BASE = (unsigned int)gpio_map;
SUNXI_PIO_BASE += addr_offset;
addr_start = SW_PORTL_IO_BASE & PageMask;
addr_offset = SW_PORTL_IO_BASE & ~PageMask;
gpio_map = (void *)mmap(0, PageSize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr_start);
SUNXI_PIO_LM_BASE = (unsigned int)gpio_map;
SUNXI_PIO_LM_BASE += addr_offset;
}
fd = open("/dev/mem", O_RDWR);
PageSize = sysconf(_SC_PAGESIZE);
PageMask = (~(PageSize-1));
addr_start = SW_PORTC_IO_BASE & PageMask;
addr_offset = SW_PORTC_IO_BASE & ~PageMask;
gpio_map = (volatile long int*)mmap(0, PageSize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr_start);
SUNXI_PIO_BASE = (unsigned int)gpio_map;
SUNXI_PIO_BASE += addr_offset;
addr_start = SW_PORTL_IO_BASE & PageMask;
addr_offset = SW_PORTL_IO_BASE & ~PageMask;
gpio_map = (volatile long int*)mmap(0, PageSize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr_start);
SUNXI_PIO_LM_BASE = (unsigned int)gpio_map;
SUNXI_PIO_LM_BASE += addr_offset;
close(fd);
}
void pinMode(int pin, int mode)
{
pin=wPinToGpio[pin];
unsigned int val = mode;
unsigned int cfg;
unsigned int bank = GPIO_BANK(pin);
unsigned int index = GPIO_CFG_INDEX(pin);
unsigned int offset = GPIO_CFG_OFFSET(pin);
if(SUNXI_PIO_BASE == 0)
return;
struct sunxi_gpio *pio;
if(bank>10)
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_LM_BASE)->gpio_bank[bank-11];
else
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
cfg = *(&pio->cfg[0] + index);
cfg &= ~(0xf << offset);
cfg |= val << offset;
{
pin=wPinToGpio[pin];
unsigned int val = mode;
unsigned int cfg;
unsigned int bank = GPIO_BANK(pin);
unsigned int index = GPIO_CFG_INDEX(pin);
unsigned int offset = GPIO_CFG_OFFSET(pin);
if(SUNXI_PIO_BASE == 0)
return;
struct sunxi_gpio *pio;
if(bank>10)
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_LM_BASE)->gpio_bank[bank-11];
else
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
cfg = *(&pio->cfg[0] + index);
cfg &= ~(0xf << offset);
cfg |= val << offset;
*(&pio->cfg[0] + index) = cfg;
}
@ -251,20 +251,21 @@ void digitalWrite(int pin, int value)
{
pin=wPinToGpio[pin];
unsigned int val = value;
unsigned int bank = GPIO_BANK(pin);
unsigned int num = GPIO_NUM(pin);
if(SUNXI_PIO_BASE == 0)
return;
struct sunxi_gpio *pio;
if(bank>10)
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_LM_BASE)->gpio_bank[bank-11];
else
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
if(val)
*(&pio->dat) |= 1 << num;
else
unsigned int bank = GPIO_BANK(pin);
unsigned int num = GPIO_NUM(pin);
if(SUNXI_PIO_BASE == 0)
return;
struct sunxi_gpio *pio;
if(bank>10)
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_LM_BASE)->gpio_bank[bank-11];
else
pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
if(val)
*(&pio->dat) |= 1 << num;
else
*(&pio->dat) &= ~(1 << num);
}

View File

@ -4,9 +4,11 @@
cd MikuPi
sudo make
because Arduino based C++, update MikuDuino to C++, 2016-6-4
<pre><code>
cd examples
gcc -Wall -o blink blink.c -lMikuDuino
gcc -Wall -o blink blink.cpp -lMikuDuino
sudo ./blink
</code></pre>

Binary file not shown.

Binary file not shown.

View File

@ -1,9 +1,9 @@
/*
* blink.c:
* blink-qubot.cpp:
*
* Welcome to MikuQ.com! MikuDuino for BananaPi
*
* by MikuQ(i@mikuq.com) 2016-6-2
* by MikuQ(i@mikuq.com) 2016-6-3
*
* https://github.com/bpiq/MikuPi
*

View File

@ -1,5 +1,5 @@
/*
* blink.c:
* blink.cpp:
*
* Welcome to MikuQ.com! MikuDuino for BananaPi
*

View File

@ -1,5 +1,5 @@
libMikuDuino.so : MikuPi.c MikuDuino.c
@gcc MikuPi.c MikuDuino.c -fPIC -shared -o libMikuDuino.so
libMikuDuino.so : MikuPi.cpp MikuDuino.cpp
@gcc MikuPi.cpp MikuDuino.cpp -fPIC -shared -o libMikuDuino.so
@install libMikuDuino.so /usr/lib/
@install *.h /usr/include/
@rm -f *.so