OSDN Git Service

Step 10 added.
[kozos-expbrd/kozos_expbrd.git] / firm / junk / 06 / bootload / serial.c
1 #include "defines.h"
2 #include "serial.h"
3
4 #define SERIAL_SCI_NUM 3
5
6 #define H8_3069F_SCI0 ((volatile struct h8_3069f_sci *)0xffffb0)
7 #define H8_3069F_SCI1 ((volatile struct h8_3069f_sci *)0xffffb8)
8 #define H8_3069F_SCI2 ((volatile struct h8_3069f_sci *)0xffffc0)
9
10 struct h8_3069f_sci {
11   volatile uint8 smr;
12   volatile uint8 brr;
13   volatile uint8 scr;
14   volatile uint8 tdr;
15   volatile uint8 ssr;
16   volatile uint8 rdr;
17   volatile uint8 scmr;
18 };
19
20 #define H8_3069F_SCI_SMR_CKS_PER1  (0<<0)
21 #define H8_3069F_SCI_SMR_CKS_PER4  (1<<0)
22 #define H8_3069F_SCI_SMR_CKS_PER16 (2<<0)
23 #define H8_3069F_SCI_SMR_CKS_PER64 (3<<0)
24 #define H8_3069F_SCI_SMR_MP     (1<<2)
25 #define H8_3069F_SCI_SMR_STOP   (1<<3)
26 #define H8_3069F_SCI_SMR_OE     (1<<4)
27 #define H8_3069F_SCI_SMR_PE     (1<<5)
28 #define H8_3069F_SCI_SMR_CHR    (1<<6)
29 #define H8_3069F_SCI_SMR_CA     (1<<7)
30
31 #define H8_3069F_SCI_SCR_CKE0   (1<<0)
32 #define H8_3069F_SCI_SCR_CKE1   (1<<1)
33 #define H8_3069F_SCI_SCR_TEIE   (1<<2)
34 #define H8_3069F_SCI_SCR_MPIE   (1<<3)
35 #define H8_3069F_SCI_SCR_RE     (1<<4) /* ¼õ¿®Í­¸ú */
36 #define H8_3069F_SCI_SCR_TE     (1<<5) /* Á÷¿®Í­¸ú */
37 #define H8_3069F_SCI_SCR_RIE    (1<<6) /* ¼õ¿®³ä¹þ¤ßÍ­¸ú */
38 #define H8_3069F_SCI_SCR_TIE    (1<<7) /* Á÷¿®³ä¹þ¤ßÍ­¸ú */
39
40 #define H8_3069F_SCI_SSR_MPBT   (1<<0)
41 #define H8_3069F_SCI_SSR_MPB    (1<<1)
42 #define H8_3069F_SCI_SSR_TEND   (1<<2)
43 #define H8_3069F_SCI_SSR_PER    (1<<3)
44 #define H8_3069F_SCI_SSR_FERERS (1<<4)
45 #define H8_3069F_SCI_SSR_ORER   (1<<5)
46 #define H8_3069F_SCI_SSR_RDRF   (1<<6) /* ¼õ¿®´°Î» */
47 #define H8_3069F_SCI_SSR_TDRE   (1<<7) /* Á÷¿®´°Î» */
48
49 static struct {
50   volatile struct h8_3069f_sci *sci;
51 } regs[SERIAL_SCI_NUM] = {
52   { H8_3069F_SCI0 }, 
53   { H8_3069F_SCI1 }, 
54   { H8_3069F_SCI2 }, 
55 };
56
57 /* ¥Ç¥Ð¥¤¥¹½é´ü²½ */
58 int serial_init(int index)
59 {
60   volatile struct h8_3069f_sci *sci = regs[index].sci;
61
62   sci->scr = 0;
63   sci->smr = 0;
64   sci->brr = 64; /* 20MHz¤Î¥¯¥í¥Ã¥¯¤«¤é9600bps¤òÀ¸À®(25MHz¤Î¾ì¹ç¤Ï80¤Ë¤¹¤ë) */
65   sci->scr = H8_3069F_SCI_SCR_RE | H8_3069F_SCI_SCR_TE; /* Á÷¼õ¿®²Äǽ */
66   sci->ssr = 0;
67
68   return 0;
69 }
70
71 /* Á÷¿®²Äǽ¤«¡© */
72 int serial_is_send_enable(int index)
73 {
74   volatile struct h8_3069f_sci *sci = regs[index].sci;
75   return (sci->ssr & H8_3069F_SCI_SSR_TDRE);
76 }
77
78 /* £±Ê¸»úÁ÷¿® */
79 int serial_send_byte(int index, unsigned char c)
80 {
81   volatile struct h8_3069f_sci *sci = regs[index].sci;
82
83   /* Á÷¿®²Äǽ¤Ë¤Ê¤ë¤Þ¤ÇÂԤĠ*/
84   while (!serial_is_send_enable(index))
85     ;
86   sci->tdr = c;
87   sci->ssr &= ~H8_3069F_SCI_SSR_TDRE; /* Á÷¿®³«»Ï */
88
89   return 0;
90 }
91
92 /* ¼õ¿®²Äǽ¤«¡© */
93 int serial_is_recv_enable(int index)
94 {
95   volatile struct h8_3069f_sci *sci = regs[index].sci;
96   return (sci->ssr & H8_3069F_SCI_SSR_RDRF);
97 }
98
99 /* £±Ê¸»ú¼õ¿® */
100 unsigned char serial_recv_byte(int index)
101 {
102   volatile struct h8_3069f_sci *sci = regs[index].sci;
103   unsigned char c;
104
105   /* ¼õ¿®Ê¸»ú¤¬Íè¤ë¤Þ¤ÇÂԤĠ*/
106   while (!serial_is_recv_enable(index))
107     ;
108   c = sci->rdr;
109   sci->ssr &= ~H8_3069F_SCI_SSR_RDRF; /* ¼õ¿®´°Î» */
110
111   return c;
112 }