• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/x86/kernel/acpi/realmode/
1#include "wakeup.h"
2#include "boot.h"
3
4static void udelay(int loops)
5{
6	while (loops--)
7		io_delay();	/* Approximately 1 us */
8}
9
10static void beep(unsigned int hz)
11{
12	u8 enable;
13
14	if (!hz) {
15		enable = 0x00;		/* Turn off speaker */
16	} else {
17		u16 div = 1193181/hz;
18
19		outb(0xb6, 0x43);	/* Ctr 2, squarewave, load, binary */
20		io_delay();
21		outb(div, 0x42);	/* LSB of counter */
22		io_delay();
23		outb(div >> 8, 0x42);	/* MSB of counter */
24		io_delay();
25
26		enable = 0x03;		/* Turn on speaker */
27	}
28	inb(0x61);		/* Dummy read of System Control Port B */
29	io_delay();
30	outb(enable, 0x61);	/* Enable timer 2 output to speaker */
31	io_delay();
32}
33
34#define DOT_HZ		880
35#define DASH_HZ		587
36#define US_PER_DOT	125000
37
38/* Okay, this is totally silly, but it's kind of fun. */
39static void send_morse(const char *pattern)
40{
41	char s;
42
43	while ((s = *pattern++)) {
44		switch (s) {
45		case '.':
46			beep(DOT_HZ);
47			udelay(US_PER_DOT);
48			beep(0);
49			udelay(US_PER_DOT);
50			break;
51		case '-':
52			beep(DASH_HZ);
53			udelay(US_PER_DOT * 3);
54			beep(0);
55			udelay(US_PER_DOT);
56			break;
57		default:	/* Assume it's a space */
58			udelay(US_PER_DOT * 3);
59			break;
60		}
61	}
62}
63
64void main(void)
65{
66	/* Kill machine if structures are wrong */
67	if (wakeup_header.real_magic != 0x12345678)
68		while (1);
69
70	if (wakeup_header.realmode_flags & 4)
71		send_morse("...-");
72
73	if (wakeup_header.realmode_flags & 1)
74		asm volatile("lcallw   $0xc000,$3");
75
76	if (wakeup_header.realmode_flags & 2) {
77		/* Need to call BIOS */
78		probe_cards(0);
79		set_mode(wakeup_header.video_mode);
80	}
81}
82