Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
4d5242e1
Commit
4d5242e1
authored
Mar 16, 2015
by
Vowstar
Browse files
Merge pull request #284 from nodemcu/dev
Sync from dev to dev096.
parents
0b01f28c
5c84359b
Changes
4
Show whitespace changes
Inline
Side-by-side
app/modules/node.c
View file @
4d5242e1
...
...
@@ -80,11 +80,11 @@ static int node_info( lua_State* L )
lua_pushinteger
(
L
,
NODE_VERSION_REVISION
);
lua_pushinteger
(
L
,
system_get_chip_id
());
// chip id
lua_pushinteger
(
L
,
spi_flash_get_id
());
// flash id
#if defined(FLASH_SAFE_API)
#if defined(FLASH_SAFE_API)
lua_pushinteger
(
L
,
flash_safe_get_size_byte
()
/
1024
);
// flash size in KB
#else
#else
lua_pushinteger
(
L
,
flash_rom_get_size_byte
()
/
1024
);
// flash size in KB
#endif // defined(FLASH_SAFE_API)
#endif // defined(FLASH_SAFE_API)
lua_pushinteger
(
L
,
flash_rom_get_mode
());
lua_pushinteger
(
L
,
flash_rom_get_speed
());
return
8
;
...
...
@@ -117,15 +117,10 @@ static int node_flashid( lua_State* L )
// Lua: flashsize()
static
int
node_flashsize
(
lua_State
*
L
)
{
//uint32_t sz = 0;
//if(lua_type(L, 1) == LUA_TNUMBER)
//{
// sz = luaL_checkinteger(L, 1);
// if(sz > 0)
// {
// flash_set_size_byte(sz);
// }
//}
if
(
lua_type
(
L
,
1
)
==
LUA_TNUMBER
)
{
flash_rom_set_size_byte
(
luaL_checkinteger
(
L
,
1
));
}
#if defined(FLASH_SAFE_API)
uint32_t
sz
=
flash_safe_get_size_byte
();
#else
...
...
@@ -155,7 +150,7 @@ static int node_led( lua_State* L )
if
(
lua_isnumber
(
L
,
1
)
)
{
low
=
lua_tointeger
(
L
,
1
);
if
(
low
<
0
){
if
(
low
<
0
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
}
else
{
...
...
@@ -164,7 +159,7 @@ static int node_led( lua_State* L )
if
(
lua_isnumber
(
L
,
2
)
)
{
high
=
lua_tointeger
(
L
,
2
);
if
(
high
<
0
){
if
(
high
<
0
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
}
else
{
...
...
@@ -178,8 +173,8 @@ static int node_led( lua_State* L )
static
int
long_key_ref
=
LUA_NOREF
;
static
int
short_key_ref
=
LUA_NOREF
;
void
default_long_press
(
void
*
arg
){
if
(
led_high_count
==
12
&&
led_low_count
==
12
){
void
default_long_press
(
void
*
arg
)
{
if
(
led_high_count
==
12
&&
led_low_count
==
12
)
{
led_low_count
=
led_high_count
=
6
;
}
else
{
led_low_count
=
led_high_count
=
12
;
...
...
@@ -189,29 +184,29 @@ void default_long_press(void *arg){
// NODE_DBG("default_long_press is called. hc: %d, lc: %d\n", led_high_count, led_low_count);
}
void
default_short_press
(
void
*
arg
){
void
default_short_press
(
void
*
arg
)
{
system_restart
();
}
void
key_long_press
(
void
*
arg
){
void
key_long_press
(
void
*
arg
)
{
NODE_DBG
(
"key_long_press is called.
\n
"
);
if
(
long_key_ref
==
LUA_NOREF
){
if
(
long_key_ref
==
LUA_NOREF
)
{
default_long_press
(
arg
);
return
;
}
if
(
!
gL
)
if
(
!
gL
)
return
;
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
long_key_ref
);
lua_call
(
gL
,
0
,
0
);
}
void
key_short_press
(
void
*
arg
){
void
key_short_press
(
void
*
arg
)
{
NODE_DBG
(
"key_short_press is called.
\n
"
);
if
(
short_key_ref
==
LUA_NOREF
){
if
(
short_key_ref
==
LUA_NOREF
)
{
default_short_press
(
arg
);
return
;
}
if
(
!
gL
)
if
(
!
gL
)
return
;
lua_rawgeti
(
gL
,
LUA_REGISTRYINDEX
,
short_key_ref
);
lua_call
(
gL
,
0
,
0
);
...
...
@@ -227,22 +222,22 @@ static int node_key( lua_State* L )
if
(
str
==
NULL
)
return
luaL_error
(
L
,
"wrong arg type"
);
if
(
sl
==
5
&&
c_strcmp
(
str
,
"short"
)
==
0
){
if
(
sl
==
5
&&
c_strcmp
(
str
,
"short"
)
==
0
)
{
ref
=
&
short_key_ref
;
}
else
if
(
sl
==
4
&&
c_strcmp
(
str
,
"long"
)
==
0
){
}
else
if
(
sl
==
4
&&
c_strcmp
(
str
,
"long"
)
==
0
)
{
ref
=
&
long_key_ref
;
}
else
{
}
else
{
ref
=
&
short_key_ref
;
}
gL
=
L
;
// luaL_checkanyfunction(L, 2);
if
(
lua_type
(
L
,
2
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
2
)
==
LUA_TLIGHTFUNCTION
){
if
(
lua_type
(
L
,
2
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
2
)
==
LUA_TLIGHTFUNCTION
)
{
lua_pushvalue
(
L
,
2
);
// copy argument (func) to the top of stack
if
(
*
ref
!=
LUA_NOREF
)
if
(
*
ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
*
ref
);
*
ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
}
else
{
// unref the key press function
if
(
*
ref
!=
LUA_NOREF
)
if
(
*
ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
*
ref
);
*
ref
=
LUA_NOREF
;
}
...
...
@@ -257,15 +252,15 @@ extern void dojob(lua_Load *load);
// Lua: input("string")
static
int
node_input
(
lua_State
*
L
)
{
size_t
l
=
0
;
size_t
l
=
0
;
const
char
*
s
=
luaL_checklstring
(
L
,
1
,
&
l
);
if
(
s
!=
NULL
&&
l
>
0
&&
l
<
LUA_MAXINPUT
-
1
)
{
lua_Load
*
load
=
&
gLoad
;
if
(
load
->
line_position
==
0
){
if
(
load
->
line_position
==
0
)
{
c_memcpy
(
load
->
line
,
s
,
l
);
load
->
line
[
l
+
1
]
=
'\0'
;
load
->
line_position
=
c_strlen
(
load
->
line
)
+
1
;
load
->
line
[
l
+
1
]
=
'\0'
;
load
->
line_position
=
c_strlen
(
load
->
line
)
+
1
;
load
->
done
=
1
;
NODE_DBG
(
"Get command:
\n
"
);
NODE_DBG
(
load
->
line
);
// buggy here
...
...
@@ -280,18 +275,18 @@ static int node_input( lua_State* L )
static
int
output_redir_ref
=
LUA_NOREF
;
static
int
serial_debug
=
1
;
void
output_redirect
(
const
char
*
str
){
void
output_redirect
(
const
char
*
str
)
{
// if(c_strlen(str)>=TX_BUFF_SIZE){
// NODE_ERR("output too long.\n");
// return;
// }
if
(
output_redir_ref
==
LUA_NOREF
||
!
gL
){
if
(
output_redir_ref
==
LUA_NOREF
||
!
gL
)
{
uart0_sendStr
(
str
);
return
;
}
if
(
serial_debug
!=
0
){
if
(
serial_debug
!=
0
)
{
uart0_sendStr
(
str
);
}
...
...
@@ -305,13 +300,13 @@ static int node_output( lua_State* L )
{
gL
=
L
;
// luaL_checkanyfunction(L, 1);
if
(
lua_type
(
L
,
1
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
1
)
==
LUA_TLIGHTFUNCTION
){
if
(
lua_type
(
L
,
1
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
1
)
==
LUA_TLIGHTFUNCTION
)
{
lua_pushvalue
(
L
,
1
);
// copy argument (func) to the top of stack
if
(
output_redir_ref
!=
LUA_NOREF
)
if
(
output_redir_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
output_redir_ref
);
output_redir_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
}
else
{
// unref the key press function
if
(
output_redir_ref
!=
LUA_NOREF
)
if
(
output_redir_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
output_redir_ref
);
output_redir_ref
=
LUA_NOREF
;
serial_debug
=
1
;
...
...
@@ -321,7 +316,7 @@ static int node_output( lua_State* L )
if
(
lua_isnumber
(
L
,
2
)
)
{
serial_debug
=
lua_tointeger
(
L
,
2
);
if
(
serial_debug
!=
0
)
if
(
serial_debug
!=
0
)
serial_debug
=
1
;
}
else
{
serial_debug
=
1
;
// default to 1
...
...
@@ -334,13 +329,13 @@ static int writer(lua_State* L, const void* p, size_t size, void* u)
{
UNUSED
(
L
);
int
file_fd
=
*
(
(
int
*
)
u
);
if
((
FS_OPEN_OK
-
1
)
==
file_fd
)
if
((
FS_OPEN_OK
-
1
)
==
file_fd
)
return
1
;
NODE_DBG
(
"get fd:%d,size:%d
\n
"
,
file_fd
,
size
);
NODE_DBG
(
"get fd:%d,size:%d
\n
"
,
file_fd
,
size
);
if
(
size
!=
0
&&
(
size
!=
fs_write
(
file_fd
,
(
const
char
*
)
p
,
size
))
)
if
(
size
!=
0
&&
(
size
!=
fs_write
(
file_fd
,
(
const
char
*
)
p
,
size
))
)
return
1
;
NODE_DBG
(
"write fd:%d,size:%d
\n
"
,
file_fd
,
size
);
NODE_DBG
(
"write fd:%d,size:%d
\n
"
,
file_fd
,
size
);
return
0
;
}
...
...
@@ -352,45 +347,45 @@ static int node_compile( lua_State* L )
int
file_fd
=
FS_OPEN_OK
-
1
;
size_t
len
;
const
char
*
fname
=
luaL_checklstring
(
L
,
1
,
&
len
);
if
(
len
>
FS_NAME_MAX_LENGTH
)
if
(
len
>
FS_NAME_MAX_LENGTH
)
return
luaL_error
(
L
,
"filename too long"
);
char
output
[
FS_NAME_MAX_LENGTH
];
c_strcpy
(
output
,
fname
);
// check here that filename end with ".lua".
if
(
len
<
4
||
(
c_strcmp
(
output
+
len
-
4
,
".lua"
)
!=
0
)
)
if
(
len
<
4
||
(
c_strcmp
(
output
+
len
-
4
,
".lua"
)
!=
0
)
)
return
luaL_error
(
L
,
"not a .lua file"
);
output
[
c_strlen
(
output
)
-
2
]
=
'c'
;
output
[
c_strlen
(
output
)
-
1
]
=
'\0'
;
output
[
c_strlen
(
output
)
-
2
]
=
'c'
;
output
[
c_strlen
(
output
)
-
1
]
=
'\0'
;
NODE_DBG
(
output
);
NODE_DBG
(
"
\n
"
);
if
(
luaL_loadfsfile
(
L
,
fname
)
!=
0
){
return
luaL_error
(
L
,
lua_tostring
(
L
,
-
1
));
if
(
luaL_loadfsfile
(
L
,
fname
)
!=
0
)
{
return
luaL_error
(
L
,
lua_tostring
(
L
,
-
1
));
}
f
=
toproto
(
L
,
-
1
);
f
=
toproto
(
L
,
-
1
);
int
stripping
=
1
;
/* strip debug information? */
file_fd
=
fs_open
(
output
,
fs_mode2flag
(
"w+"
));
if
(
file_fd
<
FS_OPEN_OK
)
if
(
file_fd
<
FS_OPEN_OK
)
{
return
luaL_error
(
L
,
"cannot open/write to file"
);
}
lua_lock
(
L
);
int
result
=
luaU_dump
(
L
,
f
,
writer
,
&
file_fd
,
stripping
);
int
result
=
luaU_dump
(
L
,
f
,
writer
,
&
file_fd
,
stripping
);
lua_unlock
(
L
);
fs_flush
(
file_fd
);
fs_close
(
file_fd
);
file_fd
=
FS_OPEN_OK
-
1
;
if
(
result
==
LUA_ERR_CC_INTOVERFLOW
){
if
(
result
==
LUA_ERR_CC_INTOVERFLOW
)
{
return
luaL_error
(
L
,
"value too big or small for target integer type"
);
}
if
(
result
==
LUA_ERR_CC_NOTINTEGER
){
if
(
result
==
LUA_ERR_CC_NOTINTEGER
)
{
return
luaL_error
(
L
,
"target lua_Number is integral but fractional value found"
);
}
...
...
app/platform/flash_api.c
View file @
4d5242e1
...
...
@@ -149,27 +149,21 @@ bool flash_rom_set_size_type(uint8_t size)
// Dangerous, here are dinosaur infested!!!!!
// Reboot required!!!
// If you don't know what you're doing, your nodemcu may turn into stone ...
#if defined(FLASH_SAFE_API)
uint8_t
data
[
SPI_FLASH_SEC_SIZE
]
ICACHE_STORE_ATTR
;
flash_safe_read
(
0
,
(
uint32
*
)
data
,
sizeof
(
data
));
SPIFlashInfo
*
p_spi_flash_info
=
(
SPIFlashInfo
*
)(
data
);
p_spi_flash_info
->
size
=
size
;
flash_safe_erase_sector
(
0
);
flash_safe_write
(
0
,
(
uint32
*
)
data
,
sizeof
(
data
));
// TODO: CHECKSUM Firmware
//p_spi_flash_info = flash_rom_getinfo();
//p_spi_flash_info->size = size;
#else
NODE_DBG
(
"
\n
BEGIN SET FLASH HEADER
\n
"
);
uint8_t
data
[
SPI_FLASH_SEC_SIZE
]
ICACHE_STORE_ATTR
;
spi_flash_read
(
0
,
(
uint32
*
)
data
,
sizeof
(
data
));
SPIFlashInfo
*
p_spi_flash_info
=
(
SPIFlashInfo
*
)(
data
);
p_spi_flash_info
->
size
=
size
;
spi_flash_erase_sector
(
0
);
spi_flash_write
(
0
,
(
uint32
*
)
data
,
sizeof
(
data
));
// TODO: CHECKSUM Firmware
//p_spi_flash_info = flash_rom_getinfo();
//p_spi_flash_info->size = size;
#endif // defined(FLASH_SAFE_API)
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_read
(
0
,
(
uint32
*
)
data
,
SPI_FLASH_SEC_SIZE
))
{
((
SPIFlashInfo
*
)(
&
data
[
0
]))
->
size
=
size
;
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_erase_sector
(
0
*
SPI_FLASH_SEC_SIZE
))
{
NODE_DBG
(
"
\n
ERASE SUCCESS
\n
"
);
}
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_write
(
0
,
(
uint32
*
)
data
,
SPI_FLASH_SEC_SIZE
))
{
NODE_DBG
(
"
\n
WRITE SUCCESS, %u
\n
"
,
size
);
}
}
NODE_DBG
(
"
\n
END SET FLASH HEADER
\n
"
);
return
true
;
}
...
...
@@ -207,6 +201,16 @@ bool flash_rom_set_size_byte(uint32_t size)
flash_size
=
SIZE_32MBIT
;
flash_rom_set_size_type
(
flash_size
);
break
;
case
8
*
1024
*
1024
:
// 64Mbit, 8MByte
flash_size
=
SIZE_64MBIT
;
flash_rom_set_size_type
(
flash_size
);
break
;
case
16
*
1024
*
1024
:
// 128Mbit, 16MByte
flash_size
=
SIZE_128MBIT
;
flash_rom_set_size_type
(
flash_size
);
break
;
default:
// Unknown flash size.
result
=
false
;
...
...
@@ -272,6 +276,46 @@ uint32_t flash_rom_get_speed(void)
return
speed
;
}
bool
flash_rom_set_speed
(
uint32_t
speed
)
{
// Dangerous, here are dinosaur infested!!!!!
// Reboot required!!!
// If you don't know what you're doing, your nodemcu may turn into stone ...
NODE_DBG
(
"
\n
BEGIN SET FLASH HEADER
\n
"
);
uint8_t
data
[
SPI_FLASH_SEC_SIZE
]
ICACHE_STORE_ATTR
;
uint8_t
speed_type
=
SPEED_40MHZ
;
if
(
speed
<
26700000
)
{
speed_type
=
SPEED_20MHZ
;
}
else
if
(
speed
<
40000000
)
{
speed_type
=
SPEED_26MHZ
;
}
else
if
(
speed
<
80000000
)
{
speed_type
=
SPEED_40MHZ
;
}
else
if
(
speed
>=
80000000
)
{
speed_type
=
SPEED_80MHZ
;
}
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_read
(
0
,
(
uint32
*
)
data
,
SPI_FLASH_SEC_SIZE
))
{
((
SPIFlashInfo
*
)(
&
data
[
0
]))
->
speed
=
speed_type
;
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_erase_sector
(
0
*
SPI_FLASH_SEC_SIZE
))
{
NODE_DBG
(
"
\n
ERASE SUCCESS
\n
"
);
}
if
(
SPI_FLASH_RESULT_OK
==
spi_flash_write
(
0
,
(
uint32
*
)
data
,
SPI_FLASH_SEC_SIZE
))
{
NODE_DBG
(
"
\n
WRITE SUCCESS, %u
\n
"
,
speed_type
);
}
}
NODE_DBG
(
"
\n
END SET FLASH HEADER
\n
"
);
return
true
;
}
bool
flash_init_data_written
(
void
)
{
// FLASH SEC - 4
...
...
@@ -356,3 +400,28 @@ uint8_t byte_of_aligned_array(const uint8_t *aligned_array, uint32_t index)
uint8_t
*
p
=
(
uint8_t
*
)
(
&
v
);
return
p
[
(
index
%
4
)
];
}
// uint8_t flash_rom_get_checksum(void)
// {
// // SPIFlashInfo spi_flash_info ICACHE_STORE_ATTR = flash_rom_getinfo();
// // uint32_t address = sizeof(spi_flash_info) + spi_flash_info.segment_size;
// // uint32_t address_aligned_4bytes = (address + 3) & 0xFFFFFFFC;
// // uint8_t buffer[64] = {0};
// // spi_flash_read(address, (uint32 *) buffer, 64);
// // uint8_t i = 0;
// // c_printf("\nBEGIN DUMP\n");
// // for (i = 0; i < 64; i++)
// // {
// // c_printf("%02x," , buffer[i]);
// // }
// // i = (address + 0x10) & 0x10 - 1;
// // c_printf("\nSIZE:%d CHECK SUM:%02x\n", spi_flash_info.segment_size, buffer[i]);
// // c_printf("\nEND DUMP\n");
// // return buffer[0];
// return 0;
// }
// uint8_t flash_rom_calc_checksum(void)
// {
// return 0;
// }
\ No newline at end of file
app/platform/flash_api.h
View file @
4d5242e1
...
...
@@ -57,8 +57,8 @@ do { \
typedef
struct
{
uint8_t
e9
;
uint8_t
segment
s
;
uint8_t
header_magic
;
uint8_t
segment
_count
;
enum
{
MODE_QIO
=
0
,
...
...
@@ -83,6 +83,9 @@ typedef struct
SIZE_64MBIT
=
5
,
SIZE_128MBIT
=
6
,
}
size
:
4
;
uint32_t
entry_point
;
uint32_t
memory_offset
;
uint32_t
segment_size
;
}
ICACHE_STORE_TYPEDEF_ATTR
SPIFlashInfo
;
uint32_t
flash_detect_size_byte
(
void
);
...
...
@@ -104,5 +107,7 @@ bool flash_init_data_default(void);
bool
flash_init_data_blank
(
void
);
bool
flash_self_destruct
(
void
);
uint8_t
byte_of_aligned_array
(
const
uint8_t
*
aligned_array
,
uint32_t
index
);
// uint8_t flash_rom_get_checksum(void);
// uint8_t flash_rom_calc_checksum(void);
#endif // __FLASH_API_H__
app/user/user_main.c
View file @
4d5242e1
...
...
@@ -61,6 +61,18 @@ void nodemcu_init(void)
return
;
}
#if defined(FLASH_SAFE_API)
if
(
flash_safe_get_size_byte
()
!=
flash_rom_get_size_byte
())
{
NODE_ERR
(
"Self adjust flash size.
\n
"
);
// Fit hardware real flash size.
flash_rom_set_size_byte
(
flash_safe_get_size_byte
());
// Flash init data at FLASHSIZE - 0x04000 Byte.
flash_init_data_default
();
// Flash blank data at FLASHSIZE - 0x02000 Byte.
flash_init_data_blank
();
}
#endif // defined(FLASH_SAFE_API)
if
(
!
flash_init_data_written
()
){
NODE_ERR
(
"Restore init data.
\n
"
);
// Flash init data at FLASHSIZE - 0x04000 Byte.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment