2 * Copyright 2020-2021 Niklas Ekström
5 #include <exec/types.h>
6 #include <exec/memory.h>
7 #include <exec/tasks.h>
8 #include <hardware/intbits.h>
9 #include <libraries/expansion.h>
10 #include <libraries/expansionbase.h>
12 #include <proto/exec.h>
13 #include <proto/expansion.h>
15 #include <exec/nodes.h>
16 #include <exec/interrupts.h>
22 #include "fix_mem_region.h"
25 #define A314_MANUFACTURER 0x07db
26 #define A314_PRODUCT 0xa3
28 #define TASK_PRIORITY 80
29 #define TASK_STACK_SIZE 1024
31 struct ExpansionBase *ExpansionBase;
32 struct MsgPort task_mp;
42 struct InterruptData interrupt_data;
43 struct Interrupt ports_interrupt;
45 extern void task_main();
46 extern void init_sockets();
47 extern void IntServer();
49 void NewList(struct List *l)
51 l->lh_Head = (struct Node *)&(l->lh_Tail);
53 l->lh_TailPred = (struct Node *)&(l->lh_Head);
56 static struct Task *create_task(char *name, long priority, char *initialPC, unsigned long stacksize)
58 char *stack = AllocMem(stacksize, MEMF_CLEAR);
62 struct Task *tc = AllocMem(sizeof(struct Task), MEMF_CLEAR | MEMF_PUBLIC);
65 FreeMem(stack, stacksize);
69 tc->tc_Node.ln_Type = NT_TASK;
70 tc->tc_Node.ln_Pri = priority;
71 tc->tc_Node.ln_Name = name;
72 tc->tc_SPLower = (APTR)stack;
73 tc->tc_SPUpper = (APTR)(stack + stacksize);
74 tc->tc_SPReg = (APTR)(stack + stacksize);
76 AddTask(tc, initialPC, 0);
80 static void init_message_port()
82 task_mp.mp_Node.ln_Name = device_name;
83 task_mp.mp_Node.ln_Pri = 0;
84 task_mp.mp_Node.ln_Type = NT_MSGPORT;
85 task_mp.mp_Flags = PA_SIGNAL;
86 task_mp.mp_SigBit = SIGB_MSGPORT;
87 task_mp.mp_SigTask = task;
88 NewList(&(task_mp.mp_MsgList));
91 static void add_interrupt_handler()
93 interrupt_data.task = task;
94 interrupt_data.ca = ca;
96 ports_interrupt.is_Node.ln_Type = NT_INTERRUPT;
97 ports_interrupt.is_Node.ln_Pri = 0;
98 ports_interrupt.is_Node.ln_Name = device_name;
99 ports_interrupt.is_Data = (APTR)&interrupt_data;
100 ports_interrupt.is_Code = IntServer;
102 AddIntServer(INTB_PORTS, &ports_interrupt);
107 ExpansionBase = (struct ExpansionBase *)OpenLibrary(EXPANSIONNAME, 0);
111 struct ConfigDev *cd = FindConfigDev(NULL, A314_MANUFACTURER, A314_PRODUCT);
114 CloseLibrary((struct Library *)ExpansionBase);
118 ca = (struct ComArea *)cd->cd_BoardAddr;
123 task = create_task(device_name, TASK_PRIORITY, (void *)task_main, TASK_STACK_SIZE);
126 debug_printf("Unable to create task\n");
134 unsigned char discard_value = ca->a_events;
136 ca->r_events = R_EVENT_STARTED;
138 add_interrupt_handler();
140 ca->a_enable = A_EVENT_R2A_TAIL;