Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
R
reform-boundary-uboot
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jack Humbert
reform-boundary-uboot
Commits
71ae411a
Commit
71ae411a
authored
19 years ago
by
Markus Klotzbuecher
Committed by
Markus Klotzbuecher
19 years ago
Browse files
Options
Downloads
Patches
Plain Diff
delta board: support for magic key detection and handling.
parent
76544f80
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
board/delta/delta.c
+208
-0
208 additions, 0 deletions
board/delta/delta.c
include/configs/delta.h
+11
-0
11 additions, 0 deletions
include/configs/delta.h
with
219 additions
and
0 deletions
board/delta/delta.c
+
208
−
0
View file @
71ae411a
...
...
@@ -28,6 +28,8 @@
#include
<common.h>
#include
<i2c.h>
#include
<da9030.h>
#include
<malloc.h>
#include
<command.h>
#include
<asm/arch/pxa-regs.h>
DECLARE_GLOBAL_DATA_PTR
;
...
...
@@ -35,6 +37,9 @@ DECLARE_GLOBAL_DATA_PTR;
/* ------------------------------------------------------------------------- */
static
void
init_DA9030
(
void
);
static
void
keys_init
(
void
);
static
void
get_pressed_keys
(
uchar
*
s
);
static
uchar
*
key_match
(
uchar
*
kbd_data
);
/*
* Miscelaneous platform dependent initialisations
...
...
@@ -56,13 +61,216 @@ int board_init (void)
int
board_late_init
(
void
)
{
#ifdef DELTA_CHECK_KEYBD
uchar
kbd_data
[
KEYBD_DATALEN
];
char
keybd_env
[
2
*
KEYBD_DATALEN
+
1
];
char
*
str
;
int
i
;
#endif
/* DELTA_CHECK_KEYBD */
setenv
(
"stdout"
,
"serial"
);
setenv
(
"stderr"
,
"serial"
);
#ifdef DELTA_CHECK_KEYBD
keys_init
();
memset
(
kbd_data
,
'\0'
,
KEYBD_DATALEN
);
/* check for pressed keys and setup keybd_env */
get_pressed_keys
(
kbd_data
);
for
(
i
=
0
;
i
<
KEYBD_DATALEN
;
++
i
)
{
sprintf
(
keybd_env
+
i
+
i
,
"%02X"
,
kbd_data
[
i
]);
}
setenv
(
"keybd"
,
keybd_env
);
str
=
strdup
((
char
*
)
key_match
(
kbd_data
));
/* decode keys */
# ifdef CONFIG_PREBOOT
/* automatically configure "preboot" command on key match */
setenv
(
"preboot"
,
str
);
/* set or delete definition */
# endif
/* CONFIG_PREBOOT */
if
(
str
!=
NULL
)
{
free
(
str
);
}
#endif
/* DELTA_CHECK_KEYBD */
init_DA9030
();
return
0
;
}
/*
* Magic Key Handling, mainly copied from board/lwmon/lwmon.c
*/
#ifdef DELTA_CHECK_KEYBD
static
uchar
kbd_magic_prefix
[]
=
"key_magic"
;
static
uchar
kbd_command_prefix
[]
=
"key_cmd"
;
/*
* Get pressed keys
* s is a buffer of size KEYBD_DATALEN-1
*/
static
void
get_pressed_keys
(
uchar
*
s
)
{
unsigned
long
val
;
val
=
GPLR3
;
if
(
val
&
(
1
<<
31
))
*
s
++
=
KEYBD_KP_DKIN0
;
if
(
val
&
(
1
<<
18
))
*
s
++
=
KEYBD_KP_DKIN1
;
if
(
val
&
(
1
<<
29
))
*
s
++
=
KEYBD_KP_DKIN2
;
if
(
val
&
(
1
<<
22
))
*
s
++
=
KEYBD_KP_DKIN5
;
}
static
void
keys_init
()
{
CKENB
|=
CKENB_7_GPIO
;
udelay
(
100
);
/* Configure GPIOs */
GPIO127
=
0xa840
;
/* KP_DKIN0 */
GPIO114
=
0xa840
;
/* KP_DKIN1 */
GPIO125
=
0xa840
;
/* KP_DKIN2 */
GPIO118
=
0xa840
;
/* KP_DKIN5 */
/* Configure GPIOs as inputs */
GPDR3
&=
~
(
1
<<
31
|
1
<<
18
|
1
<<
29
|
1
<<
22
);
GCDR3
=
(
1
<<
31
|
1
<<
18
|
1
<<
29
|
1
<<
22
);
udelay
(
100
);
}
static
int
compare_magic
(
uchar
*
kbd_data
,
uchar
*
str
)
{
/* uchar compare[KEYBD_DATALEN-1]; */
uchar
compare
[
KEYBD_DATALEN
];
char
*
nxt
;
int
i
;
/* Don't include modifier byte */
/* memcpy (compare, kbd_data+1, KEYBD_DATALEN-1); */
memcpy
(
compare
,
kbd_data
,
KEYBD_DATALEN
);
for
(;
str
!=
NULL
;
str
=
(
*
nxt
)
?
(
uchar
*
)(
nxt
+
1
)
:
(
uchar
*
)
nxt
)
{
uchar
c
;
int
k
;
c
=
(
uchar
)
simple_strtoul
((
char
*
)
str
,
(
char
**
)
(
&
nxt
),
16
);
if
(
str
==
(
uchar
*
)
nxt
)
{
/* invalid character */
break
;
}
/*
* Check if this key matches the input.
* Set matches to zero, so they match only once
* and we can find duplicates or extra keys
*/
for
(
k
=
0
;
k
<
sizeof
(
compare
);
++
k
)
{
if
(
compare
[
k
]
==
'\0'
)
/* only non-zero entries */
continue
;
if
(
c
==
compare
[
k
])
{
/* found matching key */
compare
[
k
]
=
'\0'
;
break
;
}
}
if
(
k
==
sizeof
(
compare
))
{
return
-
1
;
/* unmatched key */
}
}
/*
* A full match leaves no keys in the `compare' array,
*/
for
(
i
=
0
;
i
<
sizeof
(
compare
);
++
i
)
{
if
(
compare
[
i
])
{
return
-
1
;
}
}
return
0
;
}
static
uchar
*
key_match
(
uchar
*
kbd_data
)
{
char
magic
[
sizeof
(
kbd_magic_prefix
)
+
1
];
uchar
*
suffix
;
char
*
kbd_magic_keys
;
/*
* The following string defines the characters that can pe appended
* to "key_magic" to form the names of environment variables that
* hold "magic" key codes, i. e. such key codes that can cause
* pre-boot actions. If the string is empty (""), then only
* "key_magic" is checked (old behaviour); the string "125" causes
* checks for "key_magic1", "key_magic2" and "key_magic5", etc.
*/
if
((
kbd_magic_keys
=
getenv
(
"magic_keys"
))
==
NULL
)
kbd_magic_keys
=
""
;
/* loop over all magic keys;
* use '\0' suffix in case of empty string
*/
for
(
suffix
=
(
uchar
*
)
kbd_magic_keys
;
*
suffix
||
suffix
==
(
uchar
*
)
kbd_magic_keys
;
++
suffix
)
{
sprintf
(
magic
,
"%s%c"
,
kbd_magic_prefix
,
*
suffix
);
#if 0
printf ("### Check magic \"%s\"\n", magic);
#endif
if
(
compare_magic
(
kbd_data
,
(
uchar
*
)
getenv
(
magic
))
==
0
)
{
char
cmd_name
[
sizeof
(
kbd_command_prefix
)
+
1
];
char
*
cmd
;
sprintf
(
cmd_name
,
"%s%c"
,
kbd_command_prefix
,
*
suffix
);
cmd
=
getenv
(
cmd_name
);
#if 0
printf ("### Set PREBOOT to $(%s): \"%s\"\n",
cmd_name, cmd ? cmd : "<<NULL>>");
#endif
*
kbd_data
=
*
suffix
;
return
((
uchar
*
)
cmd
);
}
}
#if 0
printf ("### Delete PREBOOT\n");
#endif
*
kbd_data
=
'\0'
;
return
(
NULL
);
}
int
do_kbd
(
cmd_tbl_t
*
cmdtp
,
int
flag
,
int
argc
,
char
*
argv
[])
{
uchar
kbd_data
[
KEYBD_DATALEN
];
char
keybd_env
[
2
*
KEYBD_DATALEN
+
1
];
int
i
;
/* Read keys */
get_pressed_keys
(
kbd_data
);
puts
(
"Keys:"
);
for
(
i
=
0
;
i
<
KEYBD_DATALEN
;
++
i
)
{
sprintf
(
keybd_env
+
i
+
i
,
"%02X"
,
kbd_data
[
i
]);
printf
(
" %02x"
,
kbd_data
[
i
]);
}
putc
(
'\n'
);
setenv
(
"keybd"
,
keybd_env
);
return
0
;
}
U_BOOT_CMD
(
kbd
,
1
,
1
,
do_kbd
,
"kbd - read keyboard status
\n
"
,
NULL
);
#endif
/* DELTA_CHECK_KEYBD */
int
dram_init
(
void
)
{
gd
->
bd
->
bi_dram
[
0
].
start
=
PHYS_SDRAM_1
;
...
...
This diff is collapsed.
Click to expand it.
include/configs/delta.h
+
11
−
0
View file @
71ae411a
...
...
@@ -66,6 +66,17 @@
#define CFG_I2C_INIT_BOARD 1
/* #define CONFIG_HW_WATCHDOG 1 /\* Required for hitting the DA9030 WD *\/ */
#define DELTA_CHECK_KEYBD 1
/* check for keys pressed during boot */
#define CONFIG_PREBOOT "\0"
#ifdef DELTA_CHECK_KEYBD
# define KEYBD_DATALEN 4
/* we have four keys */
# define KEYBD_KP_DKIN0 0x1
/* vol+ */
# define KEYBD_KP_DKIN1 0x2
/* vol- */
# define KEYBD_KP_DKIN2 0x3
/* multi */
# define KEYBD_KP_DKIN5 0x4
/* SWKEY_GN */
#endif
/* DELTA_CHECK_KEYBD */
/*
* select serial console configuration
*/
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment