// Copyright © 2019 Matt Parsons. All rights reserved.
//
-//Write Byte to Gayle Space 0xda9000 (0x0000c3)
-//Read Byte From Gayle Space 0xda9000
-//Read Byte From Gayle Space 0xdaa000
-
+// Write Byte to Gayle Space 0xda9000 (0x0000c3)
+// Read Byte From Gayle Space 0xda9000
+// Read Byte From Gayle Space 0xdaa000
+#include "Gayle.h"
+#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <fcntl.h>
#include <unistd.h>
-#include "Gayle.h"
#include "ide.h"
#define CLOCKBASE 0xDC0000
-//#define GSTATUS 0xda201c
+//#define GSTATUS 0xda201c
//#define GCLOW 0xda2010
//#define GDH 0xda2018
-
-
-
-//Gayle Addresses
-
-//Gayle IDE Reads
-#define GERROR 0xda2004 //Error
-#define GSTATUS 0xda201c //Status
-//Gayle IDE Writes
-#define GFEAT 0xda2004 //Write : Feature
-#define GCMD 0xda201c //Write : Command
-//Gayle IDE RW
-#define GDATA 0xda2000 //Data
-#define GSECTCNT 0xda2008 //SectorCount
-#define GSECTNUM 0xda200c //SectorNumber
-#define GCYLLOW 0xda2010 //CylinderLow
-#define GCYLHIGH 0xda2014 //CylinderHigh
-#define GDEVHEAD 0xda2018 //Device/Head
-#define GCTRL 0xda3018 //Control
+// Gayle Addresses
+
+// Gayle IDE Reads
+#define GERROR 0xda2004 // Error
+#define GSTATUS 0xda201c // Status
+// Gayle IDE Writes
+#define GFEAT 0xda2004 // Write : Feature
+#define GCMD 0xda201c // Write : Command
+// Gayle IDE RW
+#define GDATA 0xda2000 // Data
+#define GSECTCNT 0xda2008 // SectorCount
+#define GSECTNUM 0xda200c // SectorNumber
+#define GCYLLOW 0xda2010 // CylinderLow
+#define GCYLHIGH 0xda2014 // CylinderHigh
+#define GDEVHEAD 0xda2018 // Device/Head
+#define GCTRL 0xda3018 // Control
// Gayle Ident
#define GIDENT 0xDE1000
// Gayle IRQ/CC
-#define GCS 0xDA8000 //Card Control
-#define GIRQ 0xDA9000 // IRQ
-#define GINT 0xDAA000 //Int enable
-#define GCONF 0xDAB00 //Gayle Config
+#define GCS 0xDA8000 // Card Control
+#define GIRQ 0xDA9000 // IRQ
+#define GINT 0xDAA000 // Int enable
+#define GCONF 0xDAB00 // Gayle Config
/* DA8000 */
-#define GAYLE_CS_IDE 0x80 /* IDE int status */
-#define GAYLE_CS_CCDET 0x40 /* credit card detect */
-#define GAYLE_CS_BVD1 0x20 /* battery voltage detect 1 */
-#define GAYLE_CS_SC 0x20 /* credit card status change */
-#define GAYLE_CS_BVD2 0x10 /* battery voltage detect 2 */
-#define GAYLE_CS_DA 0x10 /* digital audio */
-#define GAYLE_CS_WR 0x08 /* write enable (1 == enabled) */
-#define GAYLE_CS_BSY 0x04 /* credit card busy */
-#define GAYLE_CS_IRQ 0x04 /* interrupt request */
-#define GAYLE_CS_DAEN 0x02 /* enable digital audio */
-#define GAYLE_CS_DIS 0x01 /* disable PCMCIA slot */
+#define GAYLE_CS_IDE 0x80 /* IDE int status */
+#define GAYLE_CS_CCDET 0x40 /* credit card detect */
+#define GAYLE_CS_BVD1 0x20 /* battery voltage detect 1 */
+#define GAYLE_CS_SC 0x20 /* credit card status change */
+#define GAYLE_CS_BVD2 0x10 /* battery voltage detect 2 */
+#define GAYLE_CS_DA 0x10 /* digital audio */
+#define GAYLE_CS_WR 0x08 /* write enable (1 == enabled) */
+#define GAYLE_CS_BSY 0x04 /* credit card busy */
+#define GAYLE_CS_IRQ 0x04 /* interrupt request */
+#define GAYLE_CS_DAEN 0x02 /* enable digital audio */
+#define GAYLE_CS_DIS 0x01 /* disable PCMCIA slot */
/* DA9000 */
-#define GAYLE_IRQ_IDE 0x80
-#define GAYLE_IRQ_CCDET 0x40 /* credit card detect */
-#define GAYLE_IRQ_BVD1 0x20 /* battery voltage detect 1 */
-#define GAYLE_IRQ_SC 0x20 /* credit card status change */
-#define GAYLE_IRQ_BVD2 0x10 /* battery voltage detect 2 */
-#define GAYLE_IRQ_DA 0x10 /* digital audio */
-#define GAYLE_IRQ_WR 0x08 /* write enable (1 == enabled) */
-#define GAYLE_IRQ_BSY 0x04 /* credit card busy */
-#define GAYLE_IRQ_IRQ 0x04 /* interrupt request */
-#define GAYLE_IRQ_RESET 0x02 /* reset machine after CCDET change */
-#define GAYLE_IRQ_BERR 0x01 /* generate bus error after CCDET change */
+#define GAYLE_IRQ_IDE 0x80
+#define GAYLE_IRQ_CCDET 0x40 /* credit card detect */
+#define GAYLE_IRQ_BVD1 0x20 /* battery voltage detect 1 */
+#define GAYLE_IRQ_SC 0x20 /* credit card status change */
+#define GAYLE_IRQ_BVD2 0x10 /* battery voltage detect 2 */
+#define GAYLE_IRQ_DA 0x10 /* digital audio */
+#define GAYLE_IRQ_WR 0x08 /* write enable (1 == enabled) */
+#define GAYLE_IRQ_BSY 0x04 /* credit card busy */
+#define GAYLE_IRQ_IRQ 0x04 /* interrupt request */
+#define GAYLE_IRQ_RESET 0x02 /* reset machine after CCDET change */
+#define GAYLE_IRQ_BERR 0x01 /* generate bus error after CCDET change */
/* DAA000 */
-#define GAYLE_INT_IDE 0x80 /* IDE interrupt enable */
-#define GAYLE_INT_CCDET 0x40 /* credit card detect change enable */
-#define GAYLE_INT_BVD1 0x20 /* battery voltage detect 1 change enable */
-#define GAYLE_INT_SC 0x20 /* credit card status change enable */
-#define GAYLE_INT_BVD2 0x10 /* battery voltage detect 2 change enable */
-#define GAYLE_INT_DA 0x10 /* digital audio change enable */
-#define GAYLE_INT_WR 0x08 /* write enable change enabled */
-#define GAYLE_INT_BSY 0x04 /* credit card busy */
-#define GAYLE_INT_IRQ 0x04 /* credit card interrupt request */
-#define GAYLE_INT_BVD_LEV 0x02 /* BVD int level, 0=lev2,1=lev6 */
-#define GAYLE_INT_BSY_LEV 0x01 /* BSY int level, 0=lev2,1=lev6 */
+#define GAYLE_INT_IDE 0x80 /* IDE interrupt enable */
+#define GAYLE_INT_CCDET 0x40 /* credit card detect change enable */
+#define GAYLE_INT_BVD1 0x20 /* battery voltage detect 1 change enable */
+#define GAYLE_INT_SC 0x20 /* credit card status change enable */
+#define GAYLE_INT_BVD2 0x10 /* battery voltage detect 2 change enable */
+#define GAYLE_INT_DA 0x10 /* digital audio change enable */
+#define GAYLE_INT_WR 0x08 /* write enable change enabled */
+#define GAYLE_INT_BSY 0x04 /* credit card busy */
+#define GAYLE_INT_IRQ 0x04 /* credit card interrupt request */
+#define GAYLE_INT_BVD_LEV 0x02 /* BVD int level, 0=lev2,1=lev6 */
+#define GAYLE_INT_BSY_LEV 0x01 /* BSY int level, 0=lev2,1=lev6 */
int counter;
static uint8_t gayle_irq, gayle_int, gayle_cs, gayle_cs_mask, gayle_cfg;
static struct ide_controller *ide0;
int fd;
-void InitGayle(void){
- ide0 = ide_allocate("cf");
- fd = open("hd0.img", O_RDWR);
- if (fd == -1){
- printf("HDD Image hd0.image failed open\n");
- }else{
- ide_attach(ide0, 0, fd);
- ide_reset_begin(ide0);
- printf("HDD Image hd0.image attached\n");
- }
+void InitGayle(void) {
+ ide0 = ide_allocate("cf");
+ fd = open("hd0.img", O_RDWR);
+ if (fd == -1) {
+ printf("HDD Image hd0.image failed open\n");
+ } else {
+ ide_attach(ide0, 0, fd);
+ ide_reset_begin(ide0);
+ printf("HDD Image hd0.image attached\n");
+ }
}
-uint8_t CheckIrq(void){
-uint8_t irq;
+uint8_t CheckIrq(void) {
+ uint8_t irq;
-
- if (gayle_int & (1<<7)){
- irq = ide0->drive->intrq;
-// if (irq==0)
-// printf("IDE IRQ: %x\n",irq);
- return irq;
- };
+ if (gayle_int & (1 << 7)) {
+ irq = ide0->drive->intrq;
+ // if (irq==0)
+ // printf("IDE IRQ: %x\n",irq);
+ return irq;
+ };
return 0;
}
-void writeGayleB(unsigned int address, unsigned int value){
-
-
- if (address == GFEAT) {
- ide_write8(ide0, ide_feature_w, value);
- return;
- }
- if (address == GCMD) {
- ide_write8(ide0, ide_command_w, value);
- return;
- }
- if (address == GSECTCNT) {
- ide_write8(ide0, ide_sec_count, value);
- return;
- }
- if (address == GSECTNUM) {
- ide_write8(ide0, ide_sec_num, value);
- return;
- }
- if (address == GCYLLOW) {
- ide_write8(ide0, ide_cyl_low, value);
- return;
- }
- if (address == GCYLHIGH) {
- ide_write8(ide0, ide_cyl_hi, value);
- return;
- }
- if (address == GDEVHEAD) {
- ide_write8(ide0, ide_dev_head, value);
- return;
- }
- if (address == GCTRL) {
- ide_write8(ide0, ide_devctrl_w, value);
- return;
- }
-
- if (address == GIDENT){
- counter = 0;
- // printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
- return;
- }
-
-
- if (address == GIRQ){
-// printf("Write Byte to Gayle GIRQ 0x%06x (0x%06x)\n",address,value);
- gayle_irq = (gayle_irq & value) | (value & (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR));
-
- return;
- }
-
- if (address == GCS){
- printf("Write Byte to Gayle GCS 0x%06x (0x%06x)\n",address,value);
- gayle_cs_mask = value & ~3;
- gayle_cs &= ~3;
- gayle_cs |= value & 3;
- return;
- }
-
- if (address == GINT){
- printf("Write Byte to Gayle GINT 0x%06x (0x%06x)\n",address,value);
- gayle_int = value;
- return;
- }
-
- if (address == GCONF){
- printf("Write Byte to Gayle GCONF 0x%06x (0x%06x)\n",address,value);
- gayle_cfg = value;
- return;
- }
-
-
-
-
-
- printf("Write Byte to Gayle Space 0x%06x (0x%06x)\n",address,value);
+void writeGayleB(unsigned int address, unsigned int value) {
+ if (address == GFEAT) {
+ ide_write8(ide0, ide_feature_w, value);
+ return;
+ }
+ if (address == GCMD) {
+ ide_write8(ide0, ide_command_w, value);
+ return;
+ }
+ if (address == GSECTCNT) {
+ ide_write8(ide0, ide_sec_count, value);
+ return;
+ }
+ if (address == GSECTNUM) {
+ ide_write8(ide0, ide_sec_num, value);
+ return;
+ }
+ if (address == GCYLLOW) {
+ ide_write8(ide0, ide_cyl_low, value);
+ return;
+ }
+ if (address == GCYLHIGH) {
+ ide_write8(ide0, ide_cyl_hi, value);
+ return;
+ }
+ if (address == GDEVHEAD) {
+ ide_write8(ide0, ide_dev_head, value);
+ return;
+ }
+ if (address == GCTRL) {
+ ide_write8(ide0, ide_devctrl_w, value);
+ return;
+ }
+
+ if (address == GIDENT) {
+ counter = 0;
+ // printf("Write Byte to Gayle Ident 0x%06x (0x%06x)\n",address,value);
+ return;
+ }
+
+ if (address == GIRQ) {
+ // printf("Write Byte to Gayle GIRQ 0x%06x (0x%06x)\n",address,value);
+ gayle_irq =
+ (gayle_irq & value) | (value & (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR));
+
+ return;
+ }
+
+ if (address == GCS) {
+ printf("Write Byte to Gayle GCS 0x%06x (0x%06x)\n", address, value);
+ gayle_cs_mask = value & ~3;
+ gayle_cs &= ~3;
+ gayle_cs |= value & 3;
+ return;
+ }
+
+ if (address == GINT) {
+ printf("Write Byte to Gayle GINT 0x%06x (0x%06x)\n", address, value);
+ gayle_int = value;
+ return;
+ }
+
+ if (address == GCONF) {
+ printf("Write Byte to Gayle GCONF 0x%06x (0x%06x)\n", address, value);
+ gayle_cfg = value;
+ return;
+ }
+
+ printf("Write Byte to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
-void writeGayle(unsigned int address, unsigned int value){
- if (address == GDATA) {
- ide_write16(ide0, ide_data, value);
- return;
- }
+void writeGayle(unsigned int address, unsigned int value) {
+ if (address == GDATA) {
+ ide_write16(ide0, ide_data, value);
+ return;
+ }
- printf("Write Word to Gayle Space 0x%06x (0x%06x)\n",address,value);
+ printf("Write Word to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
-void writeGayleL(unsigned int address, unsigned int value){
- printf("Write Long to Gayle Space 0x%06x (0x%06x)\n",address,value);
+void writeGayleL(unsigned int address, unsigned int value) {
+ printf("Write Long to Gayle Space 0x%06x (0x%06x)\n", address, value);
}
-uint8_t readGayleB(unsigned int address){
-
- if (address == GERROR) {
- return ide_read8(ide0, ide_error_r);
- }
- if (address == GSTATUS) {
- return ide_read8(ide0, ide_status_r);
- }
-
- if (address == GSECTCNT) {
- return ide_read8(ide0, ide_sec_count);
- }
-
- if (address == GSECTNUM) {
- return ide_read8(ide0, ide_sec_num);
- }
-
- if (address == GCYLLOW) {
- return ide_read8(ide0, ide_cyl_low);
- }
-
- if (address == GCYLHIGH) {
- return ide_read8(ide0, ide_cyl_hi);
- }
-
- if (address == GDEVHEAD) {
- return ide_read8(ide0, ide_dev_head);
- }
-
- if (address == GCTRL) {
- return ide_read8(ide0, ide_altst_r);
- }
-
- if (address == GIDENT){
- uint8_t val;
- //printf("Read Byte from Gayle Ident 0x%06x (0x%06x)\n",address,counter);
- if (counter == 0 || counter == 1 || counter == 3){
- val= 0x80;//80; to enable gayle
- }else{
- val= 0x00;
- }
- counter++;
- return val;
- }
-
- if (address == GIRQ){
-// printf("Read Byte From GIRQ Space 0x%06x\n",gayle_irq);
-
- uint8_t irq;
- irq = ide0->drive->intrq;
-
- if (irq == 1){
- //printf("IDE IRQ: %x\n",irq);
- return 0x80;//gayle_irq;
- }
-
- return 0;
- }
-
- if (address == GCS){
- printf("Read Byte From GCS Space 0x%06x\n",0x1234);
- uint8_t v;
- v = gayle_cs_mask | gayle_cs;
- return v;
- }
-
- if (address == GINT){
-// printf("Read Byte From GINT Space 0x%06x\n",gayle_int);
- return gayle_int;
- }
-
- if (address == GCONF){
- printf("Read Byte From GCONF Space 0x%06x\n",gayle_cfg & 0x0f);
- return gayle_cfg & 0x0f;
- }
-
-
- printf("Read Byte From Gayle Space 0x%06x\n",address);
- return 0xFF;
+uint8_t readGayleB(unsigned int address) {
+ if (address == GERROR) {
+ return ide_read8(ide0, ide_error_r);
+ }
+ if (address == GSTATUS) {
+ return ide_read8(ide0, ide_status_r);
+ }
+
+ if (address == GSECTCNT) {
+ return ide_read8(ide0, ide_sec_count);
+ }
+
+ if (address == GSECTNUM) {
+ return ide_read8(ide0, ide_sec_num);
+ }
+
+ if (address == GCYLLOW) {
+ return ide_read8(ide0, ide_cyl_low);
+ }
+
+ if (address == GCYLHIGH) {
+ return ide_read8(ide0, ide_cyl_hi);
+ }
+
+ if (address == GDEVHEAD) {
+ return ide_read8(ide0, ide_dev_head);
+ }
+
+ if (address == GCTRL) {
+ return ide_read8(ide0, ide_altst_r);
+ }
+
+ if (address == GIDENT) {
+ uint8_t val;
+ // printf("Read Byte from Gayle Ident 0x%06x (0x%06x)\n",address,counter);
+ if (counter == 0 || counter == 1 || counter == 3) {
+ val = 0x80; // 80; to enable gayle
+ } else {
+ val = 0x00;
+ }
+ counter++;
+ return val;
+ }
+
+ if (address == GIRQ) {
+ // printf("Read Byte From GIRQ Space 0x%06x\n",gayle_irq);
+
+ uint8_t irq;
+ irq = ide0->drive->intrq;
+
+ if (irq == 1) {
+ // printf("IDE IRQ: %x\n",irq);
+ return 0x80; // gayle_irq;
+ }
+
+ return 0;
+ }
+
+ if (address == GCS) {
+ printf("Read Byte From GCS Space 0x%06x\n", 0x1234);
+ uint8_t v;
+ v = gayle_cs_mask | gayle_cs;
+ return v;
+ }
+
+ if (address == GINT) {
+ // printf("Read Byte From GINT Space 0x%06x\n",gayle_int);
+ return gayle_int;
+ }
+
+ if (address == GCONF) {
+ printf("Read Byte From GCONF Space 0x%06x\n", gayle_cfg & 0x0f);
+ return gayle_cfg & 0x0f;
+ }
+
+ printf("Read Byte From Gayle Space 0x%06x\n", address);
+ return 0xFF;
}
-uint16_t readGayle(unsigned int address){
- if (address == GDATA){
- uint16_t value;
- value = ide_read16 (ide0, ide_data);
-// value = (value << 8) | (value >> 8);
- return value;
- }
-
+uint16_t readGayle(unsigned int address) {
+ if (address == GDATA) {
+ uint16_t value;
+ value = ide_read16(ide0, ide_data);
+ // value = (value << 8) | (value >> 8);
+ return value;
+ }
- printf("Read Word From Gayle Space 0x%06x\n",address);
- return 0x8000;
+ printf("Read Word From Gayle Space 0x%06x\n", address);
+ return 0x8000;
}
-uint32_t readGayleL(unsigned int address){
- printf("Read Long From Gayle Space 0x%06x\n",address);
- return 0x8000;
+uint32_t readGayleL(unsigned int address) {
+ printf("Read Long From Gayle Space 0x%06x\n", address);
+ return 0x8000;
}
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <signal.h>
+#include <assert.h>
#include <dirent.h>
+#include <endian.h>
#include <fcntl.h>
-#include <assert.h>
+#include <pthread.h>
+#include <sched.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <sys/mman.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include <stdint.h>
-#include <sched.h>
-#include "m68k.h"
-#include "main.h"
-#include<pthread.h>
#include "Gayle.h"
#include "ide.h"
-
+#include "m68k.h"
+#include "main.h"
+
//#define BCM2708_PERI_BASE 0x20000000 //pi0-1
//#define BCM2708_PERI_BASE 0xFE000000 //pi4
-#define BCM2708_PERI_BASE 0x3F000000 //pi3
-#define BCM2708_PERI_SIZE 0x01000000
-#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
-#define GPCLK_BASE (BCM2708_PERI_BASE + 0x101000)
-#define GPIO_ADDR 0x200000 /* GPIO controller */
-#define GPCLK_ADDR 0x101000
-#define CLK_PASSWD 0x5a000000
-#define CLK_GP0_CTL 0x070
-#define CLK_GP0_DIV 0x074
+#define BCM2708_PERI_BASE 0x3F000000 // pi3
+#define BCM2708_PERI_SIZE 0x01000000
+#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
+#define GPCLK_BASE (BCM2708_PERI_BASE + 0x101000)
+#define GPIO_ADDR 0x200000 /* GPIO controller */
+#define GPCLK_ADDR 0x101000
+#define CLK_PASSWD 0x5a000000
+#define CLK_GP0_CTL 0x070
+#define CLK_GP0_DIV 0x074
#define SA0 5
#define SA1 3
#define SA2 2
-#define STATUSREGADDR GPIO_CLR = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_SET = 1<<SA2;
-#define W16 GPIO_CLR = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define R16 GPIO_SET = 1<<SA0;GPIO_CLR = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define W8 GPIO_CLR = 1<<SA0;GPIO_SET = 1<<SA1;GPIO_CLR = 1<<SA2;
-#define R8 GPIO_SET = 1<<SA0;GPIO_SET = 1<<SA1;GPIO_CLR = 1<<SA2;
-
-#define PAGE_SIZE (4*1024)
-#define BLOCK_SIZE (4*1024)
-
-#define GPIOSET(no, ishigh) \
-do { \
- if (ishigh) \
- set |= (1 << (no)); \
- else \
- reset |= (1 << (no)); \
-} while (0)
-
+#define STATUSREGADDR \
+ GPIO_CLR = 1 << SA0; \
+ GPIO_CLR = 1 << SA1; \
+ GPIO_SET = 1 << SA2;
+#define W16 \
+ GPIO_CLR = 1 << SA0; \
+ GPIO_CLR = 1 << SA1; \
+ GPIO_CLR = 1 << SA2;
+#define R16 \
+ GPIO_SET = 1 << SA0; \
+ GPIO_CLR = 1 << SA1; \
+ GPIO_CLR = 1 << SA2;
+#define W8 \
+ GPIO_CLR = 1 << SA0; \
+ GPIO_SET = 1 << SA1; \
+ GPIO_CLR = 1 << SA2;
+#define R8 \
+ GPIO_SET = 1 << SA0; \
+ GPIO_SET = 1 << SA1; \
+ GPIO_CLR = 1 << SA2;
+
+#define PAGE_SIZE (4 * 1024)
+#define BLOCK_SIZE (4 * 1024)
+
+#define GPIOSET(no, ishigh) \
+ do { \
+ if (ishigh) \
+ set |= (1 << (no)); \
+ else \
+ reset |= (1 << (no)); \
+ } while (0)
#define FASTBASE 0x07FFFFFF
#define FASTSIZE 0xFFFFFFF
-#define GAYLEBASE 0xD80000 //D7FFFF
+#define GAYLEBASE 0xD80000 // D7FFFF
#define GAYLESIZE 0x6FFFF
#define KICKBASE 0xF80000
#define KICKSIZE 0x7FFFF
-int mem_fd;
-int mem_fd_gpclk;
+int mem_fd;
+int mem_fd_gpclk;
void *gpio_map;
void *gpclk_map;
volatile unsigned int gpfsel1_o;
volatile unsigned int gpfsel2_o;
-// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
-#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
-#define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
-#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
+// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or
+// SET_GPIO_ALT(x,y)
+#define INP_GPIO(g) *(gpio + ((g) / 10)) &= ~(7 << (((g) % 10) * 3))
+#define OUT_GPIO(g) *(gpio + ((g) / 10)) |= (1 << (((g) % 10) * 3))
+#define SET_GPIO_ALT(g, a) \
+ *(gpio + (((g) / 10))) |= \
+ (((a) <= 3 ? (a) + 4 : (a) == 4 ? 3 : 2) << (((g) % 10) * 3))
-#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0
-#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
+#define GPIO_SET \
+ *(gpio + 7) // sets bits which are 1 ignores bits which are 0
+#define GPIO_CLR \
+ *(gpio + 10) // clears bits which are 1 ignores bits which are 0
-#define GET_GPIO(g) (*(gpio+13)&(1<<g)) // 0 if LOW, (1<<g) if HIGH
-
-#define GPIO_PULL *(gpio+37) // Pull up/pull down
-#define GPIO_PULLCLK0 *(gpio+38) // Pull up/pull down clock
+#define GET_GPIO(g) (*(gpio + 13) & (1 << g)) // 0 if LOW, (1<<g) if HIGH
+#define GPIO_PULL *(gpio + 37) // Pull up/pull down
+#define GPIO_PULLCLK0 *(gpio + 38) // Pull up/pull down clock
void setup_io();
volatile uint32_t srdata2;
volatile uint32_t srdata2_old;
-
unsigned char g_kick[524288];
-unsigned char g_ram[FASTSIZE+1]; /* RAM */
+unsigned char g_ram[FASTSIZE + 1]; /* RAM */
unsigned char toggle;
static volatile unsigned char ovl;
static volatile unsigned char maprom;
-
-/* Signal Handler for SIGINT */
-void sigint_handler(int sig_num)
-{
- /* Reset handler to catch SIGINT next time.
- Refer http://en.cppreference.com/w/c/program/signal */
- printf("\n User provided signal handler for Ctrl+C \n");
-
- /* Do a graceful cleanup of the program like: free memory/resources/etc and exit */
- exit(0);
+void sigint_handler(int sig_num) {
+ printf("\n Exit Ctrl+C %d\n", sig_num);
+ exit(0);
}
+void *iplThread(void *args) {
+ printf("thread!/n");
-void* iplThread(void *args){
-
-printf("thread!/n");
-//srdata2_old = read_reg();
-//toggle = 0;
-
-while(42){
-//printf("thread!/n");
- if (GET_GPIO(1) == 0){
- srdata = read_reg();
- if (srdata != srdata2_old){
- srdata2 = ((srdata >> 13)&0xff);
- //printf("STATUS: %d\n", srdata2);
- srdata2_old = srdata;
- m68k_set_irq(srdata2);
- toggle = 1;
- }
- } else {
- if (toggle != 0){
- /*
- srdata = read_reg();
- srdata2 = ((srdata >> 13)&0xff);
- srdata2_old = srdata;
- m68k_set_irq(srdata2);
- */
- m68k_set_irq(0);
- //printf("STATUS: 0\n");
- toggle = 0;
- }
- }
-
- usleep(1);
- }
+ while (42) {
+ usleep(1);
+ }
}
-
int main() {
+ int g;
+ const struct sched_param priority = {99};
-
-int g;
-const struct sched_param priority = {99};
-
- sched_setscheduler(0, SCHED_RR , &priority);
- mlockall(MCL_CURRENT); // lock in memory to keep us from paging out
-
+ sched_setscheduler(0, SCHED_FIFO, &priority);
+ mlockall(MCL_CURRENT); // lock in memory to keep us from paging out
InitGayle();
signal(SIGINT, sigint_handler);
setup_io();
- //Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending on pi model
- printf("Enable GPCLK0 on GPIO4\n");
-
- *(gpclk+ (CLK_GP0_CTL/4)) = CLK_PASSWD | (1 << 5);
- usleep(10);
- while ( (*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7));
- usleep(100);
- *(gpclk+(CLK_GP0_DIV/4)) = CLK_PASSWD | (6 << 12); //divider , 6=200MHz on pi3
- usleep(10);
- *(gpclk+(CLK_GP0_CTL/4)) = CLK_PASSWD | 5 | (1 << 4); //pll? 6=plld, 5=pllc
- usleep(10);
- while (((*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7))== 0);
- usleep(100);
-
- SET_GPIO_ALT(4,0); //gpclk0
-
- //set SA to output
- INP_GPIO(2);
- OUT_GPIO(2);
- INP_GPIO(3);
- OUT_GPIO(3);
- INP_GPIO(5);
- OUT_GPIO(5);
-
- //set gpio0 (aux0) and gpio1 (aux1) to input
+ // Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending
+ // on pi model
+ printf("Enable 200MHz GPCLK0 on GPIO4\n");
+
+ *(gpclk + (CLK_GP0_CTL / 4)) = CLK_PASSWD | (1 << 5);
+ usleep(10);
+ while ((*(gpclk + (CLK_GP0_CTL / 4))) & (1 << 7))
+ ;
+ usleep(100);
+ *(gpclk + (CLK_GP0_DIV / 4)) =
+ CLK_PASSWD | (6 << 12); // divider , 6=200MHz on pi3
+ usleep(10);
+ *(gpclk + (CLK_GP0_CTL / 4)) =
+ CLK_PASSWD | 5 | (1 << 4); // pll? 6=plld, 5=pllc
+ usleep(10);
+ while (((*(gpclk + (CLK_GP0_CTL / 4))) & (1 << 7)) == 0)
+ ;
+ usleep(100);
+
+ SET_GPIO_ALT(4, 0); // gpclk0
+
+ // set SA to output
+ INP_GPIO(2);
+ OUT_GPIO(2);
+ INP_GPIO(3);
+ OUT_GPIO(3);
+ INP_GPIO(5);
+ OUT_GPIO(5);
+
+ // set gpio0 (aux0) and gpio1 (aux1) to input
INP_GPIO(0);
INP_GPIO(1);
// Set GPIO pins 6,7 and 8-23 to output
- for (g=6; g<=23; g++)
- {
+ for (g = 6; g <= 23; g++) {
INP_GPIO(g);
OUT_GPIO(g);
}
- printf ("Precalculate GPIO8-23 aus Output\n");
- gpfsel0_o =*(gpio); //store gpio ddr
- printf ("gpfsel0: %#x\n", gpfsel0_o);
- gpfsel1_o =*(gpio+1); //store gpio ddr
- printf ("gpfsel1: %#x\n", gpfsel1_o);
- gpfsel2_o =*(gpio+2); //store gpio ddr
- printf ("gpfsel2: %#x\n", gpfsel2_o);
+ printf("Precalculate GPIO8-23 as Output\n");
+ gpfsel0_o = *(gpio); // store gpio ddr
+ printf("gpfsel0: %#x\n", gpfsel0_o);
+ gpfsel1_o = *(gpio + 1); // store gpio ddr
+ printf("gpfsel1: %#x\n", gpfsel1_o);
+ gpfsel2_o = *(gpio + 2); // store gpio ddr
+ printf("gpfsel2: %#x\n", gpfsel2_o);
// Set GPIO pins 8-23 to input
- for (g=8; g<=23; g++)
- {
+ for (g = 8; g <= 23; g++) {
INP_GPIO(g);
}
- printf ("Precalculate GPIO8-23 as Input\n");
- gpfsel0 =*(gpio); //store gpio ddr
- printf ("gpfsel0: %#x\n", gpfsel0);
- gpfsel1 =*(gpio+1); //store gpio ddr
- printf ("gpfsel1: %#x\n", gpfsel1);
- gpfsel2 =*(gpio+2); //store gpio ddr
- printf ("gpfsel2: %#x\n", gpfsel2);
-
- GPIO_CLR = 1<<2;
- GPIO_CLR = 1<<3;
- GPIO_SET = 1<<5;
-
- GPIO_SET = 1<<6;
- GPIO_SET = 1<<7;
-
- //reset cpld statemachine first
-
- write_reg(0x01);
- usleep(100);
- usleep(1500);
- write_reg(0x00);
- usleep(100);
-
-/*
- maprom = 0;
- FILE * fp;
- fp = fopen("kick.rom", "rb");
- if (!fp)
- {
- printf("kick.rom cannot be opened\n");
- } else {
- printf("kick.rom found, using that instead of motherboard rom\n");
- while (1)
- {
- unsigned int reads = fread(&g_kick, sizeof(g_kick), 1, fp);
- if (reads == 0){
- printf("failed loading kick.rom\n");
- }else{
- printf("loaded kick.rom\n");
- maprom = 1;
- }
- break;
+ printf("Precalculate GPIO8-23 as Input\n");
+ gpfsel0 = *(gpio); // store gpio ddr
+ printf("gpfsel0: %#x\n", gpfsel0);
+ gpfsel1 = *(gpio + 1); // store gpio ddr
+ printf("gpfsel1: %#x\n", gpfsel1);
+ gpfsel2 = *(gpio + 2); // store gpio ddr
+ printf("gpfsel2: %#x\n", gpfsel2);
+
+ GPIO_CLR = 1 << 2;
+ GPIO_CLR = 1 << 3;
+ GPIO_SET = 1 << 5;
+
+ GPIO_SET = 1 << 6;
+ GPIO_SET = 1 << 7;
+
+ // reset cpld statemachine first
+
+ write_reg(0x01);
+ usleep(100);
+ usleep(1500);
+ write_reg(0x00);
+ usleep(100);
+
+ // load kick.rom if present
+ maprom = 1;
+ int fd = 0;
+ fd = open("kick.rom", O_RDONLY);
+ if (fd < 1) {
+ printf("Failed loading kick.rom, using motherboard kickstart\n");
+ maprom = 0;
+ } else {
+ int size = (int)lseek(fd, 0, SEEK_END);
+ if (size == 0x40000) {
+ lseek(fd, 0, SEEK_SET);
+ read(fd, &g_kick, size);
+ lseek(fd, 0, SEEK_SET);
+ read(fd, &g_kick[0x40000], size);
+ } else {
+ lseek(fd, 0, SEEK_SET);
+ read(fd, &g_kick, size);
+ }
+ printf("Loaded kick.rom with size %d kib\n", size / 1024);
}
- }
- */
- maprom = 1;
- int fd=0;
- fd = open("kick.rom",O_RDONLY);
- if(fd<1){
- printf("failed loading kick.rom, using motherboard kickstart\n");
- maprom = 0;
- }else{
- int size = (int)lseek(fd, 0, SEEK_END);
- if(size==0x40000){
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick, size);
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick[0x40000], size);
- }else{
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick, size);
- }
- printf("loaded kick.rom with size %d kib\n",size/1024);
- }
-
-
-cpu_pulse_reset();
-
- ovl=1;
- m68k_write_memory_8(0xbfe201,0x0001); //AMIGA OVL
- m68k_write_memory_8(0xbfe001,0x0001); //AMIGA OVL high (ROM@0x0)
- //cpu_pulse_reset();
-
- usleep(1500);
-
- m68k_init();
- m68k_set_cpu_type(M68K_CPU_TYPE_68030);
- m68k_pulse_reset();
-
- if (maprom == 1){
- m68k_set_reg(M68K_REG_PC, 0xF80002);
- }else{
- m68k_set_reg(M68K_REG_PC, 0x0);
- }
-
-/*
- pthread_t id;
- int err;
- //err = pthread_create(&id, NULL, &iplThread, NULL);
- if (err != 0)
- printf("\ncan't create IPL thread :[%s]", strerror(err));
- else
- printf("\n IPL Thread created successfully\n");
-*/
-
- m68k_pulse_reset();
- while(42) {
-
- m68k_execute(3000);
- if (GET_GPIO(1) == 0){
- srdata = read_reg();
- m68k_set_irq((srdata >> 13)&0xff);
- } else {
- m68k_set_irq(0);
- };
- }
-
- return 0;
-}
+ // reset amiga and statemachine
+ cpu_pulse_reset();
+ ovl = 1;
+ m68k_write_memory_8(0xbfe201, 0x0001); // AMIGA OVL
+ m68k_write_memory_8(0xbfe001, 0x0001); // AMIGA OVL high (ROM@0x0)
+ usleep(1500);
-void cpu_pulse_reset(void){
-
- write_reg(0x00);
- printf("Status Reg%x\n",read_reg());
- usleep(100000);
- write_reg(0x02);
- printf("Status Reg%x\n",read_reg());
-}
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68030);
+ m68k_pulse_reset();
+ if (maprom == 1) {
+ m68k_set_reg(M68K_REG_PC, 0xF80002);
+ } else {
+ m68k_set_reg(M68K_REG_PC, 0x0);
+ }
+ /*
+ pthread_t id;
+ int err;
+ //err = pthread_create(&id, NULL, &iplThread, NULL);
+ if (err != 0)
+ printf("\ncan't create IPL thread :[%s]", strerror(err));
+ else
+ printf("\n IPL Thread created successfully\n");
+ */
+
+ m68k_pulse_reset();
+ while (42) {
+ m68k_execute(3000);
+ if (GET_GPIO(1) == 0) {
+ srdata = read_reg();
+ m68k_set_irq((srdata >> 13) & 0xff);
+ } else {
+ m68k_set_irq(0);
+ };
+ }
+ return 0;
+}
-int cpu_irq_ack(int level)
-{
- printf("cpu irq ack\n");
- return level;
+void cpu_pulse_reset(void) {
+ write_reg(0x00);
+ // printf("Status Reg%x\n",read_reg());
+ usleep(100000);
+ write_reg(0x02);
+ // printf("Status Reg%x\n",read_reg());
}
+int cpu_irq_ack(int level) {
+ printf("cpu irq ack\n");
+ return level;
+}
+unsigned int m68k_read_memory_8(unsigned int address) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ return g_ram[address - FASTBASE];
+ }
-unsigned int m68k_read_memory_8(unsigned int address){
+ if (maprom == 1) {
+ if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+ return g_kick[address - KICKBASE];
+ }
+ }
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ return readGayleB(address);
+ }
- if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-// if(address>FASTBASE){
- return g_ram[address- FASTBASE];
- }
+ if (address < 0xffffff) {
+ return read8((uint32_t)address);
+ }
- if (maprom == 1){
- if(address>KICKBASE && address<KICKBASE + KICKSIZE){
- return g_kick[address-KICKBASE];
- }
- }
+ return 0;
+}
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- return readGayleB(address);
- }
+unsigned int m68k_read_memory_16(unsigned int address) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ return be16toh(*(uint16_t *)&g_ram[address - FASTBASE]);
+ }
- if (address < 0xffffff){
- return read8((uint32_t)address);
- }
+ if (maprom == 1) {
+ if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+ return be16toh(*(uint16_t *)&g_kick[address - KICKBASE]);
+ }
+ }
- return 0;
-}
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ return readGayle(address);
+ }
-unsigned int m68k_read_memory_16(unsigned int address){
+ if (address < 0xffffff) {
+ return (unsigned int)read16((uint32_t)address);
+ }
- if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-// if(address>FASTBASE){
- uint16_t value = *(uint16_t*)&g_ram[address- FASTBASE];
- value = (value << 8) | (value >> 8);
- return value;
- }
+ return 0;
+}
- if (maprom == 1){
- if(address>KICKBASE && address<KICKBASE + KICKSIZE){
- uint16_t value = *(uint16_t*)&g_kick[address-KICKBASE];
- value = (value << 8) | (value >> 8);
- return value;
- }
- }
+unsigned int m68k_read_memory_32(unsigned int address) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ return be32toh(*(uint32_t *)&g_ram[address - FASTBASE]);
+ }
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- return readGayle(address);
- }
+ if (maprom == 1) {
+ if (address > KICKBASE && address < KICKBASE + KICKSIZE) {
+ return be32toh(*(uint32_t *)&g_kick[address - KICKBASE]);
+ }
+ }
- if (address < 0xffffff){
- return (unsigned int)read16((uint32_t)address);
- }
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ return readGayleL(address);
+ }
- return 0;
-}
+ if (address < 0xffffff) {
+ uint16_t a = read16(address);
+ uint16_t b = read16(address + 2);
+ return (a << 16) | b;
+ }
-unsigned int m68k_read_memory_32(unsigned int address){
-
- if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-// if(address>FASTBASE){
- uint32_t value = *(uint32_t*)&g_ram[address- FASTBASE];
- value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
- return value << 16 | value >> 16;
- }
-
- if (maprom == 1){
- if(address>KICKBASE && address<KICKBASE + KICKSIZE){
- uint32_t value = *(uint32_t*)&g_kick[address-KICKBASE];
- value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
- return value << 16 | value >> 16;
- }
- }
-
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- return readGayleL(address);
- }
-
- if (address < 0xffffff){
- uint16_t a = read16(address);
- uint16_t b = read16(address+2);
- return (a << 16) | b;
- }
-
- return 0;
+ return 0;
}
-void m68k_write_memory_8(unsigned int address, unsigned int value){
+void m68k_write_memory_8(unsigned int address, unsigned int value) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ g_ram[address - FASTBASE] = value;
+ return;
+ }
- if(address>FASTBASE && address<FASTBASE + FASTSIZE){
-// if(address>FASTBASE){
- g_ram[address- FASTBASE] = value;
- return;
- }
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ writeGayleB(address, value);
+ return;
+ }
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- writeGayleB(address, value);
- return;
- }
+ if (address == 0xbfe001) {
+ ovl = (value & (1 << 0));
+ printf("OVL:%x\n", ovl);
+ }
- if (address == 0xbfe001){
- ovl = (value & (1<<0));
- printf("OVL:%x\n", ovl );
- }
+ if (address < 0xffffff) {
+ write8((uint32_t)address, value);
+ return;
+ }
+ return;
+}
- if (address < 0xffffff){
- write8((uint32_t)address,value);
- return;
- }
+void m68k_write_memory_16(unsigned int address, unsigned int value) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ *(uint16_t *)&g_ram[address - FASTBASE] = htobe16(value);
+ return;
+ }
- return;
-}
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ writeGayle(address, value);
+ return;
+ }
-void m68k_write_memory_16(unsigned int address, unsigned int value){
-// if (address==0xdff030) printf("%c", value);
-
- if(address>FASTBASE && address<FASTBASE + FASTSIZE ){
-// if(address>FASTBASE){
- uint16_t* dest = (uint16_t*)&g_ram[address- FASTBASE];
- value = (value << 8) | (value >> 8);
- *dest = value;
- return;
- }
-
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- writeGayle(address,value);
- return;
- }
-
- if (address < 0xffffff){
- write16((uint32_t)address,value);
- return;
- }
- return;
+ if (address < 0xffffff) {
+ write16((uint32_t)address, value);
+ return;
+ }
+ return;
}
-void m68k_write_memory_32(unsigned int address, unsigned int value){
-
- if(address>FASTBASE && address<FASTBASE + FASTSIZE ){
-// if(address>FASTBASE){
- uint32_t* dest = (uint32_t*)&g_ram[address- FASTBASE];
- value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
- value = value << 16 | value >> 16;
- *dest = value;
- return;
- }
+void m68k_write_memory_32(unsigned int address, unsigned int value) {
+ if (address > FASTBASE && address < FASTBASE + FASTSIZE) {
+ *(uint32_t *)&g_ram[address - FASTBASE] = htobe32(value);
+ return;
+ }
- if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
- writeGayleL(address, value);
- }
+ if (address > GAYLEBASE && address < GAYLEBASE + GAYLESIZE) {
+ writeGayleL(address, value);
+ }
- if (address < 0xffffff){
- write16(address , value >> 16);
- write16(address+2 , value );
- return;
- }
+ if (address < 0xffffff) {
+ write16(address, value >> 16);
+ write16(address + 2, value);
+ return;
+ }
- return;
+ return;
}
-void write16(uint32_t address, uint32_t data)
-{
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
- uint32_t data_s = (data & 0x0000ffff) << 8;
- uint32_t data_r = (~data & 0x0000ffff) << 8;
-
- // asm volatile ("dmb" ::: "memory");
- W16
- *(gpio) = gpfsel0_o;
- *(gpio + 1) = gpfsel1_o;
- *(gpio + 2) = gpfsel2_o;
-
- *(gpio + 7) = addr_h_s;
- *(gpio + 10) = addr_h_r;
-// while ((GET_GPIO(0)));
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio + 7) = addr_l_s;
- *(gpio + 10) = addr_l_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- //write phase
- *(gpio + 7) = data_s;
- *(gpio + 10) = data_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
- while ((GET_GPIO(0)));
- // asm volatile ("dmb" ::: "memory");
+void write16(uint32_t address, uint32_t data) {
+ uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+ uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+ uint32_t addr_l_s = (address >> 16) << 8;
+ uint32_t addr_l_r = (~address >> 16) << 8;
+ uint32_t data_s = (data & 0x0000ffff) << 8;
+ uint32_t data_r = (~data & 0x0000ffff) << 8;
+
+ // asm volatile ("dmb" ::: "memory");
+ W16 *(gpio) = gpfsel0_o;
+ *(gpio + 1) = gpfsel1_o;
+ *(gpio + 2) = gpfsel2_o;
+
+ *(gpio + 7) = addr_h_s;
+ *(gpio + 10) = addr_h_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio + 7) = addr_l_s;
+ *(gpio + 10) = addr_l_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ // write phase
+ *(gpio + 7) = data_s;
+ *(gpio + 10) = data_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
+ while ((GET_GPIO(0)))
+ ;
+ // asm volatile ("dmb" ::: "memory");
}
-
-void write8(uint32_t address, uint32_t data)
-{
-
- if ((address & 1) == 0)
- data = data + (data << 8); //EVEN, A0=0,UDS
- else data = data & 0xff ; //ODD , A0=1,LDS
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
- uint32_t data_s = (data & 0x0000ffff) << 8;
- uint32_t data_r = (~data & 0x0000ffff) << 8;
-
- // asm volatile ("dmb" ::: "memory");
- W8
- *(gpio) = gpfsel0_o;
- *(gpio + 1) = gpfsel1_o;
- *(gpio + 2) = gpfsel2_o;
-
- *(gpio + 7) = addr_h_s;
- *(gpio + 10) = addr_h_r;
- //while ((GET_GPIO(0)));
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio + 7) = addr_l_s;
- *(gpio + 10) = addr_l_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- //write phase
- *(gpio + 7) = data_s;
- *(gpio + 10) = data_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
- while ((GET_GPIO(0)));
- // asm volatile ("dmb" ::: "memory");
- // GPIO_SET = 1 << 7;
+void write8(uint32_t address, uint32_t data) {
+ if ((address & 1) == 0)
+ data = data + (data << 8); // EVEN, A0=0,UDS
+ else
+ data = data & 0xff; // ODD , A0=1,LDS
+ uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+ uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+ uint32_t addr_l_s = (address >> 16) << 8;
+ uint32_t addr_l_r = (~address >> 16) << 8;
+ uint32_t data_s = (data & 0x0000ffff) << 8;
+ uint32_t data_r = (~data & 0x0000ffff) << 8;
+
+ // asm volatile ("dmb" ::: "memory");
+ W8 *(gpio) = gpfsel0_o;
+ *(gpio + 1) = gpfsel1_o;
+ *(gpio + 2) = gpfsel2_o;
+
+ *(gpio + 7) = addr_h_s;
+ *(gpio + 10) = addr_h_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio + 7) = addr_l_s;
+ *(gpio + 10) = addr_l_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ // write phase
+ *(gpio + 7) = data_s;
+ *(gpio + 10) = data_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
+ while ((GET_GPIO(0)))
+ ;
+ // asm volatile ("dmb" ::: "memory");
}
-
-uint32_t read16(uint32_t address)
-{
- volatile int val;
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
-
- // asm volatile ("dmb" ::: "memory");
- R16
-
- *(gpio) = gpfsel0_o;
- *(gpio + 1) = gpfsel1_o;
- *(gpio + 2) = gpfsel2_o;
-
- *(gpio + 7) = addr_h_s;
- *(gpio + 10) = addr_h_r;
-// while ((GET_GPIO(0)));
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio + 7) = addr_l_s;
- *(gpio + 10) = addr_l_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- //read phase
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
- GPIO_CLR = 1 << 6;
- while (!(GET_GPIO(0)));
- GPIO_CLR = 1 << 6;
-// asm volatile ("nop" ::);
- val = *(gpio + 13);
- GPIO_SET = 1 << 6;
- // asm volatile ("dmb" ::: "memory");
- return (val >>8)&0xffff;
+uint32_t read16(uint32_t address) {
+ volatile int val;
+ uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+ uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+ uint32_t addr_l_s = (address >> 16) << 8;
+ uint32_t addr_l_r = (~address >> 16) << 8;
+
+ // asm volatile ("dmb" ::: "memory");
+ R16
+
+ *(gpio) = gpfsel0_o;
+ *(gpio + 1) = gpfsel1_o;
+ *(gpio + 2) = gpfsel2_o;
+
+ *(gpio + 7) = addr_h_s;
+ *(gpio + 10) = addr_h_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio + 7) = addr_l_s;
+ *(gpio + 10) = addr_l_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ // read phase
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
+ GPIO_CLR = 1 << 6;
+ while (!(GET_GPIO(0)))
+ ;
+ GPIO_CLR = 1 << 6;
+ val = *(gpio + 13);
+ GPIO_SET = 1 << 6;
+ // asm volatile ("dmb" ::: "memory");
+ return (val >> 8) & 0xffff;
}
-
-uint32_t read8(uint32_t address)
-{
- int val;
- uint32_t addr_h_s = (address & 0x0000ffff) << 8;
- uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
- uint32_t addr_l_s = (address >> 16) << 8;
- uint32_t addr_l_r = (~address >> 16) << 8;
-
- // asm volatile ("dmb" ::: "memory");
- R8
- *(gpio) = gpfsel0_o;
- *(gpio + 1) = gpfsel1_o;
- *(gpio + 2) = gpfsel2_o;
-
- *(gpio + 7) = addr_h_s;
- *(gpio + 10) = addr_h_r;
-// while ((GET_GPIO(0)));
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- *(gpio + 7) = addr_l_s;
- *(gpio + 10) = addr_l_r;
- GPIO_CLR = 1 << 7;
- GPIO_SET = 1 << 7;
-
- //read phase
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
-
- GPIO_CLR = 1 << 6;
- while (!(GET_GPIO(0)));
- GPIO_CLR = 1 << 6;
-// asm volatile ("nop" ::);
- val = *(gpio + 13);
- GPIO_SET = 1 << 6;
- // asm volatile ("dmb" ::: "memory");
-
- val = (val >>8)&0xffff;
- if ((address & 1) == 0)
- val = (val >> 8) & 0xff ; //EVEN, A0=0,UDS
- else
- val = val & 0xff ; //ODD , A0=1,LDS
- return val;
+uint32_t read8(uint32_t address) {
+ int val;
+ uint32_t addr_h_s = (address & 0x0000ffff) << 8;
+ uint32_t addr_h_r = (~address & 0x0000ffff) << 8;
+ uint32_t addr_l_s = (address >> 16) << 8;
+ uint32_t addr_l_r = (~address >> 16) << 8;
+
+ // asm volatile ("dmb" ::: "memory");
+ R8 *(gpio) = gpfsel0_o;
+ *(gpio + 1) = gpfsel1_o;
+ *(gpio + 2) = gpfsel2_o;
+
+ *(gpio + 7) = addr_h_s;
+ *(gpio + 10) = addr_h_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ *(gpio + 7) = addr_l_s;
+ *(gpio + 10) = addr_l_r;
+ GPIO_CLR = 1 << 7;
+ GPIO_SET = 1 << 7;
+
+ // read phase
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
+
+ GPIO_CLR = 1 << 6;
+ while (!(GET_GPIO(0)))
+ ;
+ GPIO_CLR = 1 << 6;
+ val = *(gpio + 13);
+ GPIO_SET = 1 << 6;
+ // asm volatile ("dmb" ::: "memory");
+
+ val = (val >> 8) & 0xffff;
+ if ((address & 1) == 0)
+ val = (val >> 8) & 0xff; // EVEN, A0=0,UDS
+ else
+ val = val & 0xff; // ODD , A0=1,LDS
+ return val;
}
-
-
/******************************************************/
-void write_reg(unsigned int value)
-{
- STATUSREGADDR
- *(gpio) = gpfsel0_o;
- *(gpio + 1) = gpfsel1_o;
- *(gpio + 2) = gpfsel2_o;
- *(gpio + 7) = (value & 0xffff) << 8;
- *(gpio + 10) = (~value & 0xffff) << 8;
- GPIO_CLR = 1 << 7;
- GPIO_CLR = 1 << 7; //delay
- GPIO_SET = 1 << 7;
- GPIO_SET = 1 << 7;
- //Bus HIGH-Z
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
+void write_reg(unsigned int value) {
+ STATUSREGADDR
+ *(gpio) = gpfsel0_o;
+ *(gpio + 1) = gpfsel1_o;
+ *(gpio + 2) = gpfsel2_o;
+ *(gpio + 7) = (value & 0xffff) << 8;
+ *(gpio + 10) = (~value & 0xffff) << 8;
+ GPIO_CLR = 1 << 7;
+ GPIO_CLR = 1 << 7; // delay
+ GPIO_SET = 1 << 7;
+ GPIO_SET = 1 << 7;
+ // Bus HIGH-Z
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
}
-
-uint16_t read_reg(void)
-{
- uint32_t val;
- STATUSREGADDR
- //Bus HIGH-Z
- *(gpio) = gpfsel0;
- *(gpio + 1) = gpfsel1;
- *(gpio + 2) = gpfsel2;
- GPIO_CLR = 1 << 6;
- GPIO_CLR = 1 << 6; //delay
- GPIO_CLR = 1 << 6;
- GPIO_CLR = 1 << 6;
- val = *(gpio + 13);
- GPIO_SET = 1 << 6;
- return (uint16_t)(val >> 8);
+uint16_t read_reg(void) {
+ uint32_t val;
+ STATUSREGADDR
+ // Bus HIGH-Z
+ *(gpio) = gpfsel0;
+ *(gpio + 1) = gpfsel1;
+ *(gpio + 2) = gpfsel2;
+ GPIO_CLR = 1 << 6;
+ GPIO_CLR = 1 << 6; // delay
+ GPIO_CLR = 1 << 6;
+ GPIO_CLR = 1 << 6;
+ val = *(gpio + 13);
+ GPIO_SET = 1 << 6;
+ return (uint16_t)(val >> 8);
}
-
//
// Set up a memory regions to access GPIO
//
-void setup_io()
-{
- /* open /dev/mem */
- if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
- printf("can't open /dev/mem \n");
- exit(-1);
- }
-
- /* mmap GPIO */
- gpio_map = mmap(
- NULL, //Any adddress in our space will do
- BCM2708_PERI_SIZE, //Map length
- PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
- MAP_SHARED, //Shared with other processes
- mem_fd, //File to map
- BCM2708_PERI_BASE //Offset to GPIO peripheral
- );
-
- close(mem_fd); //No need to keep mem_fd open after mmap
-
- if (gpio_map == MAP_FAILED) {
- printf("gpio mmap error %d\n", (int)gpio_map);//errno also set!
- exit(-1);
- }
-
- gpio = ((volatile unsigned *)gpio_map) + GPIO_ADDR/4;
- gpclk = ((volatile unsigned *)gpio_map) + GPCLK_ADDR/4;
+void setup_io() {
+ /* open /dev/mem */
+ if ((mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) {
+ printf("can't open /dev/mem \n");
+ exit(-1);
+ }
+ /* mmap GPIO */
+ gpio_map = mmap(
+ NULL, // Any adddress in our space will do
+ BCM2708_PERI_SIZE, // Map length
+ PROT_READ | PROT_WRITE, // Enable reading & writting to mapped memory
+ MAP_SHARED, // Shared with other processes
+ mem_fd, // File to map
+ BCM2708_PERI_BASE // Offset to GPIO peripheral
+ );
+
+ close(mem_fd); // No need to keep mem_fd open after mmap
+
+ if (gpio_map == MAP_FAILED) {
+ printf("gpio mmap error %d\n", (int)gpio_map); // errno also set!
+ exit(-1);
+ }
-} // setup_io
+ gpio = ((volatile unsigned *)gpio_map) + GPIO_ADDR / 4;
+ gpclk = ((volatile unsigned *)gpio_map) + GPCLK_ADDR / 4;
+} // setup_io