From 3dfc6a9b0b5a49988d6198bb021ab254107dd687 Mon Sep 17 00:00:00 2001 From: Will Sowerbutts Date: Thu, 1 Jan 2015 14:01:22 +0000 Subject: [PATCH] Kernel: RTC driver for DS1302 on platform-n8vem-mark4 --- Kernel/platform-n8vem-mark4/Makefile | 5 +- Kernel/platform-n8vem-mark4/config.h | 3 + Kernel/platform-n8vem-mark4/crt0.s | 1 + Kernel/platform-n8vem-mark4/devices.c | 2 + Kernel/platform-n8vem-mark4/ds1302-mark4.s | 77 ++++++++++++++++++++++ Kernel/platform-n8vem-mark4/kernel.def | 1 + Kernel/platform-n8vem-mark4/uzi.lnk | 2 + 7 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 Kernel/platform-n8vem-mark4/ds1302-mark4.s diff --git a/Kernel/platform-n8vem-mark4/Makefile b/Kernel/platform-n8vem-mark4/Makefile index decc6332..db10613b 100644 --- a/Kernel/platform-n8vem-mark4/Makefile +++ b/Kernel/platform-n8vem-mark4/Makefile @@ -1,7 +1,6 @@ CSRCS += devices.c main.c devtty.c devsdspi.c -DSRCS = ../dev/devide.c ../dev/devsd.c ../dev/mbr.c - -ASRCS = crt0.s z180.s mark4.s commonmem.s +DSRCS = ../dev/devide.c ../dev/devsd.c ../dev/mbr.c ../dev/ds1302.c +ASRCS = crt0.s z180.s commonmem.s mark4.s ds1302-mark4.s AOBJS = $(ASRCS:.s=.rel) COBJS = $(CSRCS:.c=.rel) diff --git a/Kernel/platform-n8vem-mark4/config.h b/Kernel/platform-n8vem-mark4/config.h index 22377c40..3b6fb756 100644 --- a/Kernel/platform-n8vem-mark4/config.h +++ b/Kernel/platform-n8vem-mark4/config.h @@ -57,3 +57,6 @@ #define DEVICE_SD #define SD_DRIVE_COUNT 1 + +/* We have a DS1302, we can read the time of day from it */ +#define CONFIG_RTC diff --git a/Kernel/platform-n8vem-mark4/crt0.s b/Kernel/platform-n8vem-mark4/crt0.s index 98ac696f..9f811a8d 100644 --- a/Kernel/platform-n8vem-mark4/crt0.s +++ b/Kernel/platform-n8vem-mark4/crt0.s @@ -7,6 +7,7 @@ ; we don't use them all, because their ordering is set ; when they are first seen. .area _CODE + .area _HOME ; compiler stores __mullong etc in here if you use them .area _CODE2 .area _CONST .area _DATA diff --git a/Kernel/platform-n8vem-mark4/devices.c b/Kernel/platform-n8vem-mark4/devices.c index ad3c585d..c1d72b1f 100644 --- a/Kernel/platform-n8vem-mark4/devices.c +++ b/Kernel/platform-n8vem-mark4/devices.c @@ -6,6 +6,7 @@ #include #include #include +#include struct devsw dev_tab[] = /* The device driver switch table */ { @@ -38,4 +39,5 @@ void device_init(void) { devide_init(); devsd_init(); + ds1302_init(); } diff --git a/Kernel/platform-n8vem-mark4/ds1302-mark4.s b/Kernel/platform-n8vem-mark4/ds1302-mark4.s new file mode 100644 index 00000000..f9bec020 --- /dev/null +++ b/Kernel/platform-n8vem-mark4/ds1302-mark4.s @@ -0,0 +1,77 @@ +; 2014-12-31 William R Sowerbutts +; N8VEM Mark IV SBC DS1302 real time clock interface code + + .module ds1302-mark4 + .z180 + + ; exported symbols + .globl _ds1302_set_pin_ce + .globl _ds1302_set_pin_clk + .globl _ds1302_set_pin_data + .globl _ds1302_set_pin_data_driven + .globl _ds1302_get_pin_data + + .include "kernel.def" + .include "../cpu-z180/z180.def" + .include "../kernel.def" + +; ----------------------------------------------------------------------------- +; DS1302 interface +; ----------------------------------------------------------------------------- + +MARK4_RTC = MARK4_IO_BASE + 0x0A +PIN_CE = 0x10 +PIN_DATA_HIZ = 0x20 +PIN_CLK = 0x40 +PIN_DATA_OUT = 0x80 +PIN_DATA_IN = 0x01 + +.area _DATA + +rtc_shadow: .db 0 ; we can't read back the latch contents, so we must keep a copy + +.area _CODE + +_ds1302_get_pin_data: + in a, (MARK4_RTC) ; read input register + and #PIN_DATA_IN ; mask off data pin + ld l, a ; return result in L + ret + +_ds1302_set_pin_data_driven: + ld hl, #2 ; get address of function argument + add hl, sp + ld b, (hl) ; load argument from stack + ld a, (rtc_shadow) + and #~PIN_DATA_HIZ ; 0 - output pin + bit 0, b ; test bit + jr nz, writereg + or #PIN_DATA_HIZ + jr writereg + +_ds1302_set_pin_data: + ld bc, #(((~PIN_DATA_OUT) << 8) | PIN_DATA_OUT) + jr setpin + +_ds1302_set_pin_ce: + ld bc, #(((~PIN_CE) << 8) | PIN_CE) + jr setpin + +_ds1302_set_pin_clk: + ld bc, #(((~PIN_CLK) << 8) | PIN_CLK) + jr setpin + +setpin: + ld a, (rtc_shadow) ; load current register contents + and b ; unset the pin + ld hl, #2 ; get address of function argument + add hl, sp + ld b, (hl) ; load argument from stack + bit 0, b ; test bit + jr z, writereg ; arg is false + or c ; arg is true +writereg: + out (MARK4_RTC), a ; write out new register contents + ld (rtc_shadow), a ; update our shadow copy + ret + diff --git a/Kernel/platform-n8vem-mark4/kernel.def b/Kernel/platform-n8vem-mark4/kernel.def index 73eb48a7..9ccfb4d3 100644 --- a/Kernel/platform-n8vem-mark4/kernel.def +++ b/Kernel/platform-n8vem-mark4/kernel.def @@ -10,6 +10,7 @@ OS_BANK .equ 0x00 ; value from include/kernel.h FIRST_RAM_BANK .equ 0x80 ; low 512K of physical memory is ROM/ECB window. RAM_KB .equ 512 Z180_IO_BASE .equ 0x40 +MARK4_IO_BASE .equ 0x80 ; No standard clock speed for the Mark IV board, but this is a common choice. CPU_CLOCK_KHZ .equ 36864 ; 18.432MHz * 2 diff --git a/Kernel/platform-n8vem-mark4/uzi.lnk b/Kernel/platform-n8vem-mark4/uzi.lnk index 31c4371b..ff30fb7b 100644 --- a/Kernel/platform-n8vem-mark4/uzi.lnk +++ b/Kernel/platform-n8vem-mark4/uzi.lnk @@ -36,4 +36,6 @@ platform-n8vem-mark4/devide.rel platform-n8vem-mark4/devsd.rel platform-n8vem-mark4/devsdspi.rel platform-n8vem-mark4/mbr.rel +platform-n8vem-mark4/ds1302.rel +platform-n8vem-mark4/ds1302-mark4.rel -e -- 2.34.1