mirror of
https://github.com/ADElectronics/RTL00_WEB_VS.git
synced 2024-11-24 11:24:15 +00:00
update
This commit is contained in:
parent
6a1f93f17b
commit
764b020238
1201 changed files with 527271 additions and 1 deletions
BIN
.vs/RTLGDB/v14/.suo
Normal file
BIN
.vs/RTLGDB/v14/.suo
Normal file
Binary file not shown.
1030
.vs/config/applicationhost.config
Normal file
1030
.vs/config/applicationhost.config
Normal file
File diff suppressed because it is too large
Load diff
1
External Tools/ExternalToolsRTL-2017-11-19.vssettings
Normal file
1
External Tools/ExternalToolsRTL-2017-11-19.vssettings
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<UserSettings><ApplicationIdentity version="14.0"/><ToolsOptions/><Category name="Environment_Group" RegisteredName="Environment_Group"><Category name="Environment_ExternalTools" Category="{E8FAE9E8-FBA2-4474-B134-AB0FFCFB291D}" Package="{DA9FB551-C724-11d0-AE1F-00A0C90FFFC3}" RegisteredName="Environment_ExternalTools" PackageName="Visual Studio Environment Package"><ExternalTools><UserCreatedTool><Arguments>-s runram</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>0</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Run in RAM</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-s runsdram</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>1</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Run in SDRAM</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-s flashburn</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>2</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Flash and Run</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-s flashboot</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>3</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Flash Boot</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-s flashwebfs</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>4</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Flash WEB Image</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-s reset</Arguments><CloseOnExit>true</CloseOnExit><Command>mingw32-make.exe</Command><Index>5</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>false</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Reset CPU</Title><Unicode>false</Unicode><UseOutputWindow>true</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-select USB -device Cortex-M3 -if SWD -speed 1000 -ir</Arguments><CloseOnExit>false</CloseOnExit><Command>JLinkGDBServer.exe</Command><Index>6</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>true</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Start J-Link GDB Server M3</Title><Unicode>false</Unicode><UseOutputWindow>false</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><UserCreatedTool><Arguments>-select USB -device Cortex-M4 -if SWD -speed 1000 -ir</Arguments><CloseOnExit>false</CloseOnExit><Command>JLinkGDBServer.exe</Command><Index>7</Index><InitialDirectory>$(ProjectDir)</InitialDirectory><IsGUIapp>true</IsGUIapp><NameID>0</NameID><Package>{00000000-0000-0000-0000-000000000000}</Package><PromptForArguments>false</PromptForArguments><SaveAllDocs>true</SaveAllDocs><Title>[RTL] Start J-Link GDB Server M4</Title><Unicode>false</Unicode><UseOutputWindow>false</UseOutputWindow><UseTaskList>false</UseTaskList></UserCreatedTool><ExcludeRegisteredTool SourceKeyName="Error Loo&kup"/><ExcludeRegisteredTool SourceKeyName="Sp&y++"/><ExcludeRegisteredTool SourceKeyName="Spy++ (x64)"/><ExcludeRegisteredTool SourceKeyName="PreEmptive Protection - Dot&fuscator"/><ExcludeRegisteredTool SourceKeyName="Create GUID"/></ExternalTools></Category></Category></UserSettings>
|
11
README.md
11
README.md
|
@ -1 +1,10 @@
|
||||||
# RTL00_WEB_VS
|
# RTL00_WEB_VS
|
||||||
|
|
||||||
|
Описание порта для Visual Studio 2015:
|
||||||
|
https://adelectronics.ru/2017/10/18/rtl8195am-rtl871xax-%d0%bd%d0%b0%d0%bf%d0%b8%d1%81%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d1%88%d0%b8%d0%b2%d0%ba%d0%b8-%d0%b8-%d0%be%d1%82%d0%bb%d0%b0%d0%b4%d0%ba%d0%b0-%d0%b2-visual-studio-20/
|
||||||
|
|
||||||
|
Оригинальный проект:
|
||||||
|
https://github.com/pvvx/RTL00_WEB
|
||||||
|
|
||||||
|
Пример аппаратной части на основе RTL8711AM:
|
||||||
|
https://adelectronics.ru/2017/09/29/rtl8711am-%d1%81%d1%85%d0%b5%d0%bc%d0%be%d1%82%d0%b5%d1%85%d0%bd%d0%b8%d0%ba%d0%b0-%d0%bf%d0%be%d1%80%d1%82%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d0%be%d0%b3%d0%be-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81/
|
BIN
RTLGDB.VC.db
Normal file
BIN
RTLGDB.VC.db
Normal file
Binary file not shown.
28
RTLGDB.sln
Normal file
28
RTLGDB.sln
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 14
|
||||||
|
VisualStudioVersion = 14.0.25420.1
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RTLGDB", "RTLGDB\RTLGDB.vcxproj", "{3D8B16B6-9763-48AD-A514-F45680E8613B}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Release|x64.Build.0 = Release|x64
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{3D8B16B6-9763-48AD-A514-F45680E8613B}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
82
RTLGDB/Assets/LinuxDebugger.xaml
Normal file
82
RTLGDB/Assets/LinuxDebugger.xaml
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--Copyright, Microsoft Corporation, All rights reserved.-->
|
||||||
|
<Rule
|
||||||
|
Name="LinuxDebugger"
|
||||||
|
DisplayName="Remote GDB"
|
||||||
|
PageTemplate="debugger"
|
||||||
|
Order="300"
|
||||||
|
Description="Debugger options"
|
||||||
|
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns="http://schemas.microsoft.com/build/2009/properties">
|
||||||
|
|
||||||
|
<!--Rule.Metadata>
|
||||||
|
<sys:Guid x:Key="DebugTargetTypeCommandGuid">FEEA6E9D-77D8-423F-9EDE-3970CBB76125</sys:Guid>
|
||||||
|
<sys:UInt32 x:Key="DebugTargetTypeCommandId">0x400</sys:UInt32>
|
||||||
|
<sys:String x:Key="DebugTargetDropdownEnum">AndroidDeviceID</sys:String>
|
||||||
|
</Rule.Metadata-->
|
||||||
|
<Rule.DataSource>
|
||||||
|
<DataSource Persistence="UserFile" />
|
||||||
|
</Rule.DataSource>
|
||||||
|
<Rule.Categories>
|
||||||
|
<Category Name="StartOptions" DisplayName="Start Options" Description="Start Options"/>
|
||||||
|
</Rule.Categories>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteHostName"
|
||||||
|
DisplayName="Remote Host Name"
|
||||||
|
Description="Host name or IP address of the remote machine"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteUserName"
|
||||||
|
DisplayName="Remote User Name"
|
||||||
|
Description="User Name for the remote machine"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="PrivateKey"
|
||||||
|
DisplayName="Private Key"
|
||||||
|
Description="Private Key for authentication in the remote machine"
|
||||||
|
Subtype="file"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="SecureShellExecutable"
|
||||||
|
DisplayName="Secure Shell Executable"
|
||||||
|
Description="Command to invoke a Secure Shell session to stream debuger session through, e.g. ssh or plink"
|
||||||
|
Subtype="file"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteWorkingDirectory"
|
||||||
|
DisplayName="Remote Working Directory"
|
||||||
|
Description="Remote root location where executable runs"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteExecutable"
|
||||||
|
DisplayName="Remote Executable"
|
||||||
|
Description="Name of the remote executable program"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteExecutableArguments"
|
||||||
|
DisplayName="Remote Executable Arguments"
|
||||||
|
Description="Optional, arguments to pass to the remote executable"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="RemoteDebuggerExecutable"
|
||||||
|
DisplayName="Remote Debugger Executable"
|
||||||
|
Description="Command to invoke remote debugger executable"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
</Rule>
|
63
RTLGDB/Assets/LocalDebugger.xaml
Normal file
63
RTLGDB/Assets/LocalDebugger.xaml
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--Copyright, Microsoft Corporation, All rights reserved.-->
|
||||||
|
<Rule
|
||||||
|
Name="LocalDebugger"
|
||||||
|
DisplayName="Local GDB"
|
||||||
|
PageTemplate="debugger"
|
||||||
|
Order="200"
|
||||||
|
Description="Debugger options"
|
||||||
|
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns="http://schemas.microsoft.com/build/2009/properties">
|
||||||
|
|
||||||
|
<!--Rule.Metadata>
|
||||||
|
<sys:Guid x:Key="DebugTargetTypeCommandGuid">FEEA6E9D-77D8-423F-9EDE-3970CBB76125</sys:Guid>
|
||||||
|
<sys:UInt32 x:Key="DebugTargetTypeCommandId">0x400</sys:UInt32>
|
||||||
|
<sys:String x:Key="DebugTargetDropdownEnum">AndroidDeviceID</sys:String>
|
||||||
|
</Rule.Metadata-->
|
||||||
|
<Rule.DataSource>
|
||||||
|
<DataSource Persistence="UserFile" />
|
||||||
|
</Rule.DataSource>
|
||||||
|
<Rule.Categories>
|
||||||
|
<Category Name="StartOptions" DisplayName="Start Options" Description="Start Options"/>
|
||||||
|
</Rule.Categories>
|
||||||
|
|
||||||
|
<StringProperty Name="LocalWorkingDirectory"
|
||||||
|
DisplayName="Local Working Directory"
|
||||||
|
Description="Local root location where executable runs"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFolderPropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="LocalExecutable"
|
||||||
|
DisplayName="Local Executable"
|
||||||
|
Description="Name of the local executable program"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="LocalExecutableArguments"
|
||||||
|
DisplayName="Local Executable Arguments"
|
||||||
|
Description="Optional, arguments to pass to the local executable"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="LocalDebuggerExecutable"
|
||||||
|
DisplayName="Local Debugger Executable"
|
||||||
|
Description="Full path to local gdb/lldb executable"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="LocalDebuggerServerAddress"
|
||||||
|
DisplayName="Local Debugger Server Address"
|
||||||
|
Description="Optional, local debugger server address if needed"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
</Rule>
|
57
RTLGDB/Assets/OCDDebugger.xaml
Normal file
57
RTLGDB/Assets/OCDDebugger.xaml
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--Copyright, Microsoft Corporation, All rights reserved.-->
|
||||||
|
<Rule
|
||||||
|
Name="OCDDebugger"
|
||||||
|
DisplayName="OCD GDB Debugger"
|
||||||
|
PageTemplate="debugger"
|
||||||
|
Order="100"
|
||||||
|
Description="Debugger options"
|
||||||
|
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns="http://schemas.microsoft.com/build/2009/properties">
|
||||||
|
|
||||||
|
<Rule.DataSource>
|
||||||
|
<DataSource Persistence="UserFile" />
|
||||||
|
</Rule.DataSource>
|
||||||
|
<Rule.Categories>
|
||||||
|
<Category Name="StartOptions" DisplayName="Start Options" Description="Start Options"/>
|
||||||
|
</Rule.Categories>
|
||||||
|
|
||||||
|
<StringProperty Name="OCDDebuggerExecutable"
|
||||||
|
DisplayName="OCD Debugger Executable"
|
||||||
|
Description="Full path to OCD debugger executable"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="OCDDebuggerServerAddress"
|
||||||
|
DisplayName="OCD Debugger Server Address"
|
||||||
|
Description="OCD Debugger Server Address"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<StringProperty Name="OCDDebugBinary"
|
||||||
|
DisplayName="OCD Debug Binary"
|
||||||
|
Description="Location of binary file with debug symbols for OCD"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<StringProperty Name="OCDDebuggerSymbols"
|
||||||
|
DisplayName="OCD Debugger Symbols"
|
||||||
|
Description="Full path to debug symbols for binary"
|
||||||
|
F1Keyword="VC.Project.LinuxDebugger.PackagePath">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultStringPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
<ValueEditor EditorType="DefaultFilePropertyEditor" DisplayName="<Browse...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
-->
|
||||||
|
</Rule>
|
69
RTLGDB/Assets/linux_nmake.xaml
Normal file
69
RTLGDB/Assets/linux_nmake.xaml
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--Copyright, Microsoft Corporation, All rights reserved.-->
|
||||||
|
<Rule
|
||||||
|
Name="ConfigurationNMake"
|
||||||
|
DisplayName="NMake"
|
||||||
|
PageTemplate="generic"
|
||||||
|
Description="NMake"
|
||||||
|
SwitchPrefix="/"
|
||||||
|
Order="100"
|
||||||
|
xmlns="http://schemas.microsoft.com/build/2009/properties">
|
||||||
|
<Rule.Categories>
|
||||||
|
<Category Name="General" DisplayName="General" Description="General" />
|
||||||
|
<Category Name="IntelliSense" DisplayName="IntelliSense" Description="IntelliSense" />
|
||||||
|
</Rule.Categories>
|
||||||
|
<Rule.DataSource>
|
||||||
|
<DataSource Persistence="ProjectFile" />
|
||||||
|
</Rule.DataSource>
|
||||||
|
<StringProperty Name="NMakeBuildCommandLine" DisplayName="Build Command Line"
|
||||||
|
Description="Specifies the command line to run for the 'Build' command."
|
||||||
|
IncludeInCommandLine="false"
|
||||||
|
Category="General"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.BuildCommandLine">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultCommandPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
<StringProperty Name="NMakeReBuildCommandLine" DisplayName="Rebuild All Command Line"
|
||||||
|
Description="Specifies the command line to run for the 'Rebuild All' command."
|
||||||
|
IncludeInCommandLine="false"
|
||||||
|
Category="General"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.ReBuildCommandLine">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultCommandPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
<StringProperty Name="NMakeCleanCommandLine" DisplayName="Clean Command Line"
|
||||||
|
Description="Specifies the command line to run for the 'Clean' command."
|
||||||
|
IncludeInCommandLine="false"
|
||||||
|
Category="General"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.CleanCommandLine">
|
||||||
|
<StringProperty.ValueEditors>
|
||||||
|
<ValueEditor EditorType="DefaultCommandPropertyEditor" DisplayName="<Edit...>"/>
|
||||||
|
</StringProperty.ValueEditors>
|
||||||
|
</StringProperty>
|
||||||
|
<StringProperty Name="NMakeOutput" DisplayName="Output"
|
||||||
|
Description='Specifies the output file to generate.'
|
||||||
|
Category="General"
|
||||||
|
IncludeInCommandLine="false"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.Output"/>
|
||||||
|
|
||||||
|
|
||||||
|
<StringListProperty Name="NMakePreprocessorDefinitions" DisplayName="Preprocessor Definitions" Category="IntelliSense" Switch="D"
|
||||||
|
Description="Specifies the preprocessor defines used by the source files."
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.PreprocessorDefinitions"/>
|
||||||
|
<StringListProperty Name="NMakeIncludeSearchPath" DisplayName="Include Search Path" Category="IntelliSense" Switch="I"
|
||||||
|
Description="Specifies the include search path for resolving included files." Subtype="folder"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.IncludeSearchPath"/>
|
||||||
|
<StringListProperty Name="NMakeForcedIncludes" DisplayName="Forced Includes" Category="IntelliSense" Switch="FI"
|
||||||
|
Description="Specifies the files that are forced included." Subtype="folder"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.ForcedIncludes"/>
|
||||||
|
<StringListProperty Name="NMakeAssemblySearchPath" DisplayName="Assembly Search Path" Category="IntelliSense" Switch="AI"
|
||||||
|
Description="Specifies the assembly search path for resolving used .NET assemblies." Subtype="folder"
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.AssemblySearchPath"/>
|
||||||
|
<StringListProperty Name="AdditionalSOSearchPaths" DisplayName="Additional Symbol Search Paths" Category="IntelliSense"
|
||||||
|
Description="Locations to identify "
|
||||||
|
F1Keyword="VC.Project.VCNMakeTool.AdditionalSOSearchPaths" />
|
||||||
|
<StringProperty Name="AdditionalOptions" DisplayName="Additional Options" Category="IntelliSense"
|
||||||
|
Description="Specifies additional compiler switches to be used by Intellisense when parsing C++ files" />
|
||||||
|
</Rule>
|
212
RTLGDB/Project/FreeRTOSConfig.h
Normal file
212
RTLGDB/Project/FreeRTOSConfig.h
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
/*
|
||||||
|
FreeRTOS V7.3.0 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||||
|
|
||||||
|
FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT
|
||||||
|
http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||||
|
|
||||||
|
***************************************************************************
|
||||||
|
* *
|
||||||
|
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||||
|
* Complete, revised, and edited pdf reference manuals are also *
|
||||||
|
* available. *
|
||||||
|
* *
|
||||||
|
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||||
|
* ensuring you get running as quickly as possible and with an *
|
||||||
|
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||||
|
* the FreeRTOS project to continue with its mission of providing *
|
||||||
|
* professional grade, cross platform, de facto standard solutions *
|
||||||
|
* for microcontrollers - completely free of charge! *
|
||||||
|
* *
|
||||||
|
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||||
|
* *
|
||||||
|
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||||
|
* *
|
||||||
|
***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
This file is part of the FreeRTOS distribution.
|
||||||
|
|
||||||
|
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU General Public License (version 2) as published by the
|
||||||
|
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||||
|
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||||
|
distribute a combined work that includes FreeRTOS without being obliged to
|
||||||
|
provide the source code for proprietary components outside of the FreeRTOS
|
||||||
|
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
more details. You should have received a copy of the GNU General Public
|
||||||
|
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||||
|
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||||
|
by writing to Richard Barry, contact details for whom are available on the
|
||||||
|
FreeRTOS WEB site.
|
||||||
|
|
||||||
|
1 tab == 4 spaces!
|
||||||
|
|
||||||
|
***************************************************************************
|
||||||
|
* *
|
||||||
|
* Having a problem? Start by reading the FAQ "My application does *
|
||||||
|
* not run, what could be wrong?" *
|
||||||
|
* *
|
||||||
|
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||||
|
* *
|
||||||
|
***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
http://www.FreeRTOS.org - Documentation, training, latest versions, license
|
||||||
|
and contact details.
|
||||||
|
|
||||||
|
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||||
|
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||||
|
|
||||||
|
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||||
|
the code with commercial support, indemnification, and middleware, under
|
||||||
|
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||||
|
provide a safety engineered and independently SIL3 certified version under
|
||||||
|
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_CONFIG_H
|
||||||
|
#define FREERTOS_CONFIG_H
|
||||||
|
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
|
||||||
|
#include <stdint.h>
|
||||||
|
extern uint32_t SystemCoreClock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------
|
||||||
|
* Application specific definitions.
|
||||||
|
*
|
||||||
|
* These definitions should be adjusted for your particular hardware and
|
||||||
|
* application requirements.
|
||||||
|
*
|
||||||
|
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||||
|
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||||
|
*
|
||||||
|
* See http://www.freertos.org/a00110.html.
|
||||||
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define configUSE_STACK_TCM_HEAP 5 // RTL871xAx/RTL8195Ax Stack priority used TCM HEAP
|
||||||
|
#define configUSE_PREEMPTION 1
|
||||||
|
#define configUSE_IDLE_HOOK 1
|
||||||
|
#define configUSE_TICK_HOOK 0
|
||||||
|
#define configCPU_CLOCK_HZ ( SystemCoreClock )
|
||||||
|
#define configTICK_RATE_HZ ( ( uint32_t ) 1000 )
|
||||||
|
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 )
|
||||||
|
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 90 * 1024 ) ) // use HEAP5
|
||||||
|
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||||
|
#define configUSE_TRACE_FACILITY 0
|
||||||
|
#define configUSE_16_BIT_TICKS 0
|
||||||
|
#define configIDLE_SHOULD_YIELD 0
|
||||||
|
#define configUSE_CO_ROUTINES 1
|
||||||
|
#define configUSE_MUTEXES 1
|
||||||
|
#define configUSE_TIMERS 1
|
||||||
|
|
||||||
|
#define configMAX_PRIORITIES ( 11 )
|
||||||
|
#define PRIORITIE_OFFSET ( 4 )
|
||||||
|
|
||||||
|
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||||
|
|
||||||
|
#define configUSE_COUNTING_SEMAPHORES 1
|
||||||
|
#define configUSE_ALTERNATIVE_API 0
|
||||||
|
#define configCHECK_FOR_STACK_OVERFLOW 0
|
||||||
|
#define configUSE_RECURSIVE_MUTEXES 1
|
||||||
|
#define configQUEUE_REGISTRY_SIZE 0
|
||||||
|
#define configGENERATE_RUN_TIME_STATS 1
|
||||||
|
|
||||||
|
#if configGENERATE_RUN_TIME_STATS
|
||||||
|
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
|
||||||
|
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() //( ulHighFrequencyTimerTicks = 0UL )
|
||||||
|
#define portGET_RUN_TIME_COUNTER_VALUE() xTickCount //ulHighFrequencyTimerTicks
|
||||||
|
#undef configUSE_TRACE_FACILITY
|
||||||
|
#define configUSE_TRACE_FACILITY 1
|
||||||
|
#define portCONFIGURE_STATS_PEROID_VALUE 1000 //unit Ticks
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define configTIMER_TASK_PRIORITY ( 1 )
|
||||||
|
|
||||||
|
#ifdef CONFIG_UVC
|
||||||
|
#define configTIMER_QUEUE_LENGTH ( 20 )
|
||||||
|
#else
|
||||||
|
#define configTIMER_QUEUE_LENGTH ( 10 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define configTIMER_TASK_STACK_DEPTH ( 512 ) //USE_MIN_STACK_SIZE modify from 512 to 256
|
||||||
|
|
||||||
|
#if (__IASMARM__ != 1)
|
||||||
|
|
||||||
|
extern void freertos_pre_sleep_processing(uint32_t *expected_idle_time);
|
||||||
|
extern void freertos_post_sleep_processing(uint32_t *expected_idle_time);
|
||||||
|
extern int freertos_ready_to_sleep();
|
||||||
|
|
||||||
|
/* Enable tickless power saving. */
|
||||||
|
#define configUSE_TICKLESS_IDLE 1
|
||||||
|
|
||||||
|
/* In wlan usage, this value is suggested to use value less than 80 milliseconds */
|
||||||
|
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
|
||||||
|
|
||||||
|
/* It's magic trick that let us can use our own sleep function */
|
||||||
|
#define configPRE_SLEEP_PROCESSING( x ) ( freertos_pre_sleep_processing(&x) )
|
||||||
|
|
||||||
|
#define configPOST_SLEEP_PROCESSING( x ) ( freertos_post_sleep_processing(&x) )
|
||||||
|
|
||||||
|
/* It's magic trick that let us can enable/disable tickless dynamically */
|
||||||
|
#define traceLOW_POWER_IDLE_BEGIN(); do { \
|
||||||
|
if (!freertos_ready_to_sleep()) { \
|
||||||
|
mtCOVERAGE_TEST_MARKER(); \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );
|
||||||
|
|
||||||
|
#define traceLOW_POWER_IDLE_END(); } while (0);
|
||||||
|
|
||||||
|
/* It's FreeRTOS related feature but it's not included in FreeRTOS design. */
|
||||||
|
#define configUSE_WAKELOCK_PMU 1
|
||||||
|
|
||||||
|
#endif // #if (__IASMARM__ != 1)
|
||||||
|
|
||||||
|
/* Set the following definitions to 1 to include the API function, or zero
|
||||||
|
to exclude the API function. */
|
||||||
|
#define INCLUDE_vTaskPrioritySet 1
|
||||||
|
#define INCLUDE_uxTaskPriorityGet 1
|
||||||
|
#define INCLUDE_vTaskDelete 1
|
||||||
|
#define INCLUDE_vTaskCleanUpResources 0
|
||||||
|
#define INCLUDE_vTaskSuspend 1
|
||||||
|
#define INCLUDE_vTaskDelayUntil 1
|
||||||
|
#define INCLUDE_vTaskDelay 1
|
||||||
|
#define INCLUDE_pcTaskGetTaskName 1
|
||||||
|
#define INCLUDE_xTimerPendFunctionCall 1
|
||||||
|
|
||||||
|
/* Cortex-M specific definitions. */
|
||||||
|
#ifdef __NVIC_PRIO_BITS
|
||||||
|
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
|
||||||
|
#define configPRIO_BITS __NVIC_PRIO_BITS
|
||||||
|
#else
|
||||||
|
#define configPRIO_BITS 4 /* 15 priority levels */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* The lowest interrupt priority that can be used in a call to a "set priority"
|
||||||
|
function. */
|
||||||
|
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f
|
||||||
|
|
||||||
|
/* The highest interrupt priority that can be used by any interrupt service
|
||||||
|
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
|
||||||
|
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
|
||||||
|
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
|
||||||
|
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
|
||||||
|
|
||||||
|
|
||||||
|
/* Interrupt priorities used by the kernel port layer itself. These are generic
|
||||||
|
to all Cortex-M ports, and do not rely on any particular library functions. */
|
||||||
|
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||||
|
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||||
|
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||||
|
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||||
|
|
||||||
|
//#define RTK_MODE_TIMER
|
||||||
|
|
||||||
|
|
||||||
|
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||||
|
|
||||||
|
#endif /* FREERTOS_CONFIG_H */
|
413
RTLGDB/Project/MLX90614/MLX90614.c
Normal file
413
RTLGDB/Project/MLX90614/MLX90614.c
Normal file
|
@ -0,0 +1,413 @@
|
||||||
|
/*
|
||||||
|
* MLX90614drv.c
|
||||||
|
* https://esp8266.ru/forum/threads/i2c-na-rtl.2450/
|
||||||
|
* Created on: 02/09/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
|
||||||
|
#include "basic_types.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "osdep_api.h"
|
||||||
|
#include "timer_api.h"
|
||||||
|
|
||||||
|
//#include "i2c_api.h"
|
||||||
|
//#include "i2c_ex_api.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "rtl_lib.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
#include "platform_stdlib.h"
|
||||||
|
#include "web_websocket.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
|
||||||
|
#include "hal_com_reg.h"
|
||||||
|
|
||||||
|
#define MLX90614_I2CADDR 0x5A
|
||||||
|
// RAM
|
||||||
|
#define MLX90614_RAWIR1 0x04
|
||||||
|
#define MLX90614_RAWIR2 0x05
|
||||||
|
#define MLX90614_TA 0x06
|
||||||
|
#define MLX90614_TOBJ1 0x07
|
||||||
|
#define MLX90614_TOBJ2 0x08
|
||||||
|
// EEPROM
|
||||||
|
#define MLX90614_TOMAX 0x20
|
||||||
|
#define MLX90614_TOMIN 0x21
|
||||||
|
#define MLX90614_PWMCTRL 0x22
|
||||||
|
#define MLX90614_TARANGE 0x23
|
||||||
|
#define MLX90614_EMISS 0x24
|
||||||
|
#define MLX90614_CONFIG 0x25
|
||||||
|
#define MLX90614_ADDR 0x0E
|
||||||
|
#define MLX90614_ID1 0x3C
|
||||||
|
#define MLX90614_ID2 0x3D
|
||||||
|
#define MLX90614_ID3 0x3E
|
||||||
|
#define MLX90614_ID4 0x3F
|
||||||
|
#define MLX90614_SLEEP 0xFF
|
||||||
|
|
||||||
|
typedef struct _MLX90614_data {
|
||||||
|
union {
|
||||||
|
signed short to1; // Tobj1
|
||||||
|
unsigned char uc[2];
|
||||||
|
} o;
|
||||||
|
union {
|
||||||
|
signed short ta; // Ta
|
||||||
|
unsigned char uc[2];
|
||||||
|
} a;
|
||||||
|
} MLX90614DATA, *PMLX90614DATA;
|
||||||
|
|
||||||
|
typedef struct _MLX90614drv {
|
||||||
|
unsigned char status;
|
||||||
|
unsigned char addr; // адрес MLX90614 на шине I2C (формат 7 bit)
|
||||||
|
signed char init;
|
||||||
|
unsigned char tmp;
|
||||||
|
|
||||||
|
unsigned short config; // регистр конфигурации MLX90614
|
||||||
|
unsigned short timetik; // время опроса таймером (в us)
|
||||||
|
|
||||||
|
unsigned short count; // счетчик считанных значений
|
||||||
|
unsigned short overrun; // счет переполнений буфера
|
||||||
|
|
||||||
|
unsigned short errs; // счет ошибок на I2C
|
||||||
|
unsigned short buf_idx; // объем буфера pbuf[buf_idx+1], максимальный индекс-номер замера
|
||||||
|
unsigned short buf_rx; // индекс-номер ещё не считанного замера
|
||||||
|
unsigned short buf_tx; // индекс-номер для записи следующего замера
|
||||||
|
PMLX90614DATA pbuf;
|
||||||
|
gtimer_t timer;
|
||||||
|
union { // буфер
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned short us[2];
|
||||||
|
signed short ss[2];
|
||||||
|
unsigned int ui;
|
||||||
|
} buf_i2c;
|
||||||
|
i2c_drv_t i2c;
|
||||||
|
} MLX90614DRV, *PMLX90614DRV;
|
||||||
|
|
||||||
|
|
||||||
|
#define MLX90614_I2C_PIN_SDA PC_4
|
||||||
|
#define MLX90614_I2C_PIN_SCL PC_5
|
||||||
|
#define MLX90614_I2C_BUS_CLK 50000 // The maximum frequency of the MLX90614 SMBus is 100 KHz and the minimum is 10 KHz.
|
||||||
|
#define MLX90614_TIMER TIMER3 // используемый таймер
|
||||||
|
|
||||||
|
MLX90614DRV mlx90614drv = {
|
||||||
|
.addr = MLX90614_I2CADDR,
|
||||||
|
.timetik = 10000, // Время опроса таймером: 10000 us
|
||||||
|
.buf_idx = 709, // циклический буфер на 710 замеров (по 4 байт -> sizeof(MLX90614DATA))
|
||||||
|
// Если шаг заполнения 1 ms -> буфер на 0.71 сек
|
||||||
|
// Оптимизация под TCP: (TCP_MSS*2 - 80)/4 = (1460*2 - 80)/4 = 710
|
||||||
|
.i2c.status = DRV_I2C_OFF,
|
||||||
|
.i2c.idx = 1, // I2C1
|
||||||
|
.i2c.io_sel = S0, // PC_4, PC_5
|
||||||
|
.i2c.mode = DRV_I2C_SS_MODE // DRV_I2C_FS_MODE // DRV_I2C_HS_MODE
|
||||||
|
};
|
||||||
|
|
||||||
|
#define i2c_reg(r) *((volatile uint32 *)(pi2c->base_regs + r))
|
||||||
|
|
||||||
|
#define MLX90614_USE_CRC
|
||||||
|
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
unsigned char crc8(unsigned char x) {
|
||||||
|
for (int i = 8; i; i--) {
|
||||||
|
x = ( x << 1 ) ^ ( x & 128 ? 7 : 0 );
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Пример непрерывного чтения регистров Tobj1 и Tobj2
|
||||||
|
* MLX90614 по прерыванию таймера */
|
||||||
|
void mlx_tick_handler(void *par) {
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
switch(p->status) {
|
||||||
|
default:
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
p->status = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
p->status = 2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (i2c_reg(REG_DW_I2C_IC_RAW_INTR_STAT) & BIT_IC_RAW_INTR_STAT_TX_ABRT) {
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
p->errs++;
|
||||||
|
p->status = 0;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if(p->pbuf) {
|
||||||
|
PMLX90614DATA pd = p->pbuf + p->buf_tx;
|
||||||
|
// Считаем готовые значения из FIFO ic I2C
|
||||||
|
pd->o.uc[0] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
pd->o.uc[1] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
// B407B5 -> 0x28 (http://crccalc.com/)
|
||||||
|
if(crc8(pd->o.uc[1] ^ crc8(pd->o.uc[0] ^ 0x28)) != (uint8) i2c_reg(REG_DW_I2C_IC_DATA_CMD)) {
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 2; // ABORT
|
||||||
|
p->errs++;
|
||||||
|
p->status = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
pd->a.uc[0] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
pd->a.uc[1] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
// B406B5 -> 0x3D (http://crccalc.com/)
|
||||||
|
if(crc8(pd->a.uc[1] ^ crc8(pd->a.uc[0] ^ 0x3D)) != (uint8) i2c_reg(REG_DW_I2C_IC_DATA_CMD)) {
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 2; // ABORT
|
||||||
|
p->errs++;
|
||||||
|
p->status = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
|
||||||
|
else p->buf_tx++;
|
||||||
|
if(p->buf_rx == p->buf_tx) {
|
||||||
|
p->overrun++; // todo: if(p->overrun++ > 100000) deinit() ?
|
||||||
|
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
|
||||||
|
else p->buf_rx++;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// удаление из FIFO блока данных
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#endif
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
// Заполним FIFO ic I2C командами чтения
|
||||||
|
// Write Command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = MLX90614_TOBJ1;
|
||||||
|
// Read command & data (3 bytes).
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_RESTART;
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
#endif
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Write Command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = MLX90614_TA;
|
||||||
|
// Read command & data (3 bytes).
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_RESTART;
|
||||||
|
#ifdef MLX90614_USE_CRC
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
#endif
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
p->status = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 mlx90614_chkdata(uint16 cnt)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
int len = p->buf_tx - p->buf_rx;
|
||||||
|
if(len < 0) len += p->buf_idx + 1;
|
||||||
|
if(cnt > (uint16)len) cnt = (uint16)len;
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t mlx90614_getdata(void *pd, uint16 cnt)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
// cnt = mlx90614_chkdata(cnt);
|
||||||
|
unsigned short *pus = (unsigned short *) pd;
|
||||||
|
taskDISABLE_INTERRUPTS();
|
||||||
|
uint16 buf_rx = p->buf_rx;
|
||||||
|
*pus++ = cnt; // кол-во замеров
|
||||||
|
*pus++ = p->count + p->overrun; // индекс замера для анализа пропусков на стороне приемника
|
||||||
|
// если не пропущено, то равен прошлому + кол-во считанных замеров в прошлом блоке
|
||||||
|
p->count += cnt; // p->overrun = 0;
|
||||||
|
unsigned char *puc = (unsigned char *) pus;
|
||||||
|
if(cnt) {
|
||||||
|
uint16 lend = buf_rx + cnt;
|
||||||
|
if(lend > p->buf_idx) {
|
||||||
|
lend -= p->buf_idx + 1;
|
||||||
|
p->buf_rx = lend;
|
||||||
|
} else {
|
||||||
|
p->buf_rx = lend;
|
||||||
|
lend = 0;
|
||||||
|
};
|
||||||
|
size_t len = (cnt - lend) *sizeof(MLX90614DATA);
|
||||||
|
if(len) memcpy(puc, (void *)(p->pbuf + buf_rx), len);
|
||||||
|
if(lend) memcpy(puc + len, (void *)p->pbuf, lend *sizeof(MLX90614DATA));
|
||||||
|
}
|
||||||
|
taskENABLE_INTERRUPTS();
|
||||||
|
return cnt * sizeof(MLX90614DATA) + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
#define mMAX(a, b) ((a>b)?a:b)
|
||||||
|
|
||||||
|
#include "web_srv.h"
|
||||||
|
#include "websock.h"
|
||||||
|
|
||||||
|
int mlx90614_ws(TCP_SERV_CONN *ts_conn, char cmd)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
switch(cmd) {
|
||||||
|
case 'd': // deinit
|
||||||
|
if(p->init > 0) {
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
_i2c_deinit(&p->i2c);
|
||||||
|
if(p->pbuf) {
|
||||||
|
free(p->pbuf);
|
||||||
|
p->pbuf = NULL;
|
||||||
|
}
|
||||||
|
p->init = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
case 'c': // get count
|
||||||
|
return mlx90614_chkdata(p->buf_idx + 1);
|
||||||
|
case 'i': // init
|
||||||
|
return p->init;
|
||||||
|
default: // get_data
|
||||||
|
if(p->init <= 0) {
|
||||||
|
p->status = 0;
|
||||||
|
p->count = 0;
|
||||||
|
p->overrun = 0;
|
||||||
|
p->errs = 0;
|
||||||
|
if(!p->pbuf) {
|
||||||
|
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(MLX90614DATA));
|
||||||
|
if(!p->pbuf) {
|
||||||
|
error_printf("Error create buffer!\n");
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
p->buf_tx = 0;
|
||||||
|
p->buf_rx = 0;
|
||||||
|
};
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
gtimer_init(&p->timer, MLX90614_TIMER);
|
||||||
|
gtimer_start_periodical(&p->timer, p->timetik, (void*)mlx_tick_handler, (uint32_t)&mlx90614drv);
|
||||||
|
p->init = 1;
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
case 'g': // get
|
||||||
|
{
|
||||||
|
uint32 i = mlx90614_chkdata(p->buf_idx + 1);
|
||||||
|
if(i) {
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
i = mMIN((web_conn->msgbufsize / sizeof(MLX90614DATA)), i);
|
||||||
|
if(websock_tx_frame(ts_conn, WS_OPCODE_BINARY | WS_FRAGMENT_FIN, web_conn->msgbuf, mlx90614_getdata(web_conn->msgbuf, i)) != ERR_OK)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mlx90614_init(void)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
if(p->init <= 0) {
|
||||||
|
rtl_printf("Init MLX90614\n");
|
||||||
|
p->status = 0;
|
||||||
|
p->count = 0;
|
||||||
|
p->errs = 0;
|
||||||
|
if(!p->pbuf) {
|
||||||
|
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(MLX90614DATA));
|
||||||
|
if(!p->pbuf) {
|
||||||
|
error_printf("Error create buffer!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
p->buf_tx = 0;
|
||||||
|
p->buf_rx = 0;
|
||||||
|
};
|
||||||
|
// (!) Установки драйвера I2C заданы в структуре mlx90614drv
|
||||||
|
// _i2c_setup(&p->i2c, MLX90614_I2C_PIN_SDA , MLX90614_I2C_PIN_SCL, DRV_I2C_FS_MODE); // == DRV_I2C_OK?
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
// _i2c_set_speed(&p->i2c, MLX90614_I2C_BUS_CLK);
|
||||||
|
rtl_printf("I2C%d mode = %d, drvStatus = %d\n", p->i2c.idx, p->i2c.mode, p->i2c.status);
|
||||||
|
// (!) Инициализация MLX90614 перенесена в прерывание таймера
|
||||||
|
// Initial a periodical timer
|
||||||
|
gtimer_init(&p->timer, MLX90614_TIMER);
|
||||||
|
// Tick every 0.001 sec (p->timetik)
|
||||||
|
gtimer_start_periodical(&p->timer, p->timetik, (void*)mlx_tick_handler, (uint32_t)&mlx90614drv);
|
||||||
|
rtl_printf("MLX90614 Timer Period = %u us\n", p->timetik);
|
||||||
|
p->init = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mlx90614_deinit(void)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
if(p->init > 0) {
|
||||||
|
rtl_printf("Deinit MLX90614\n");
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
// (!) Не используется mlx90614_write / mlx90614_read для сокращения кода
|
||||||
|
// mlx90614_write(MLX90614_REG_CONFIG, MLX90614_CONFIG_MODE_POWERDOWN);
|
||||||
|
// Break controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) |= 2;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
/* Exit from Sleep Mode > 250 ms !
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
// Заполним FIFO ic I2C командой sleep MLX90614
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// MLX90614 Enter Sleep Mode
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = MLX90614_SLEEP | BIT_IC_DATA_CMD_STOP;
|
||||||
|
*/
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
_i2c_deinit(&p->i2c);
|
||||||
|
if(p->pbuf) {
|
||||||
|
free(p->pbuf);
|
||||||
|
p->pbuf = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p->init = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL void ShowMlx(void)
|
||||||
|
{
|
||||||
|
PMLX90614DRV p = &mlx90614drv;
|
||||||
|
rtl_printf("MLX90614: %d, %d\n", p->buf_i2c.us[0], p->buf_i2c.ss[1]);
|
||||||
|
rtl_printf("MLX90614: Cnt = %u, Err = %u\n", p->count, p->errs);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL void fATMLX(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc > 1) {
|
||||||
|
if(atoi(argv[1])) {
|
||||||
|
mlx90614_init();
|
||||||
|
vTaskDelay(10); // +WDT
|
||||||
|
}
|
||||||
|
else mlx90614_deinit();
|
||||||
|
}
|
||||||
|
ShowMlx();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_mlx90614[] = {
|
||||||
|
{"ATMLX", 0, fATMLX, "=[0/1]: MLX90614 =1 start, =0 stop"}
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Test i2c:
|
||||||
|
* ati2c i
|
||||||
|
* ati2c g 5a 1 6 3
|
||||||
|
* ati2c d
|
||||||
|
*/
|
223
RTLGDB/Project/MPU6050/MPU6050.c
Normal file
223
RTLGDB/Project/MPU6050/MPU6050.c
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
#include "MPU6050.h"
|
||||||
|
#include "kalman.h"
|
||||||
|
|
||||||
|
MPU6050_DataPack dataPack1[MPU6050_PACKSIZE], dataPack2[MPU6050_PACKSIZE];
|
||||||
|
uint16_t currentDataPackPointer = 0;
|
||||||
|
uint8_t currentDataPack = 0;
|
||||||
|
uint8_t previousDataPackReady = 0;
|
||||||
|
|
||||||
|
MPU6050_Data mpu =
|
||||||
|
{
|
||||||
|
.i2c.idx = 3, // I2C3
|
||||||
|
.i2c.io_sel = S0, // PB_2, PB_3
|
||||||
|
.i2c.mode = DRV_I2C_FS_MODE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void MPU6050T_irq_handler(uint32_t *par)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
|
||||||
|
// MPU6050_ReadGyroscope
|
||||||
|
uint8_t data[2];
|
||||||
|
data[0] = MPU6050_GYRO_XOUT_H; // MPU6050_ACCEL_XOUT_H;// MPU6050_GYRO_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 2, 1);
|
||||||
|
|
||||||
|
p->Gyro_X = (int16_t)(data[0] << 8 | data[1]);
|
||||||
|
|
||||||
|
data[0] = MPU6050_ACCEL_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 2, 1);
|
||||||
|
|
||||||
|
p->Accel_X = (int16_t)(data[0] << 8 | data[1]);
|
||||||
|
|
||||||
|
if (currentDataPack)
|
||||||
|
{
|
||||||
|
dataPack2[currentDataPackPointer].X = Kalman_GetAngle(p->Accel_X, p->Gyro_X, 0.001);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dataPack1[currentDataPackPointer].X = Kalman_GetAngle(p->Accel_X, p->Gyro_X, 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentDataPackPointer++;
|
||||||
|
if (currentDataPackPointer >= MPU6050_PACKSIZE)
|
||||||
|
{
|
||||||
|
currentDataPackPointer = 0;
|
||||||
|
currentDataPack = !currentDataPack;
|
||||||
|
previousDataPackReady = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t MPU6050_Init()
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
uint8_t temp;
|
||||||
|
uint8_t d[2];
|
||||||
|
|
||||||
|
Kalman_Init();
|
||||||
|
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
|
||||||
|
d[0] = MPU6050_PWR_MGMT_1;
|
||||||
|
d[1] = 0x00;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &d, 2, 1);
|
||||||
|
|
||||||
|
|
||||||
|
temp = MPU6050_WHO_AM_I;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 1);
|
||||||
|
|
||||||
|
if (temp != MPU6050_I_AM)
|
||||||
|
{
|
||||||
|
DiagPrintf("MPU6050. Init Error. ID = %d (default:%d)\n", temp, MPU6050_I_AM);
|
||||||
|
return MPU6050_RESULT_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DiagPrintf("MPU6050. Init Done. ID = %d\n", temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
MPU6050_SetDataRate(MPU6050_DataRate_8KHz);
|
||||||
|
MPU6050_SetAccelerometer(MPU6050_Accelerometer_2G);
|
||||||
|
MPU6050_SetGyroscope(MPU6050_Gyroscope_250s);
|
||||||
|
MPU6050_SetDLPF(MPU6050_Bandwidth_Infinity);
|
||||||
|
|
||||||
|
MPU6050_OffsetCalibrate(2000);
|
||||||
|
|
||||||
|
gtimer_init(&p->timer, MPU6050_IRQTIMER);
|
||||||
|
gtimer_start_periodical(&p->timer, MPU6050_PERIOD_US, (void*)MPU6050T_irq_handler, (uint32_t)&mpu);
|
||||||
|
|
||||||
|
return MPU6050_RESULT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPU6050_SetGyroscope(MPU6050_Gyroscope gs)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
uint8_t temp;
|
||||||
|
temp = MPU6050_GYRO_CONFIG;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 1);
|
||||||
|
|
||||||
|
temp = (temp & 0xE7) | (uint8_t)gs << 3;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPU6050_SetAccelerometer(MPU6050_Accelerometer as)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
uint8_t temp;
|
||||||
|
temp = MPU6050_ACCEL_CONFIG;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 1);
|
||||||
|
|
||||||
|
temp = (temp & 0xE7) | (uint8_t)as << 3;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &temp, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPU6050_SetDataRate(uint8_t rate)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
uint8_t d[2];
|
||||||
|
|
||||||
|
d[0] = MPU6050_SMPLRT_DIV;
|
||||||
|
d[1] = rate;
|
||||||
|
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &d, 2, 1);
|
||||||
|
}
|
||||||
|
int16_t MPU6050_IsDataPacketReady(MPU6050_DataPack *dp)
|
||||||
|
{
|
||||||
|
if (previousDataPackReady)
|
||||||
|
{
|
||||||
|
previousDataPackReady = 0;
|
||||||
|
|
||||||
|
if (currentDataPack)
|
||||||
|
{
|
||||||
|
memcpy(dp, &dataPack1, sizeof(MPU6050_DataPack) * MPU6050_PACKSIZE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(dp, &dataPack2, sizeof(MPU6050_DataPack) * MPU6050_PACKSIZE);
|
||||||
|
}
|
||||||
|
return MPU6050_RESULT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MPU6050_RESULT_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPU6050_OffsetCalibrate(int32_t num)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
int32_t x = 0, y = 0, z = 0, i;
|
||||||
|
uint8_t data[6];
|
||||||
|
|
||||||
|
DiagPrintf("MPU6050. Calibrating gyroscope, don't move the hardware!\n");
|
||||||
|
//vTaskDelay(500);
|
||||||
|
|
||||||
|
data[0] = MPU6050_GYRO_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 6, 1);
|
||||||
|
|
||||||
|
x = (int16_t)(data[0] << 8 | data[1]);
|
||||||
|
y = (int16_t)(data[2] << 8 | data[3]);
|
||||||
|
z = (int16_t)(data[4] << 8 | data[5]);
|
||||||
|
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
data[0] = MPU6050_GYRO_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 6, 1);
|
||||||
|
|
||||||
|
x = (x + (int16_t)(data[0] << 8 | data[1])) / 2;
|
||||||
|
y = (y + (int16_t)(data[2] << 8 | data[3])) / 2;
|
||||||
|
z = (z + (int16_t)(data[4] << 8 | data[5])) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//gyro_x_OC = x;
|
||||||
|
//gyro_y_OC = y;
|
||||||
|
//gyro_z_OC = z;
|
||||||
|
|
||||||
|
DiagPrintf("MPU6050. Gyroscope offsets: X = %d Y = %d Z = %d\n", x, y, z);
|
||||||
|
|
||||||
|
data[0] = MPU6050_ACCEL_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 6, 1);
|
||||||
|
|
||||||
|
DiagPrintf("MPU6050. Calibrating accelrometer, don't move the hardware!\n");
|
||||||
|
|
||||||
|
x = (int16_t)(data[0] << 8 | data[1]);
|
||||||
|
y = (int16_t)(data[2] << 8 | data[3]);
|
||||||
|
z = (int16_t)(data[4] << 8 | data[5]);
|
||||||
|
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
data[0] = MPU6050_ACCEL_XOUT_H;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 1, 0);
|
||||||
|
_i2c_read(&p->i2c, MPU6050_I2C_ADDR, &data, 6, 1);
|
||||||
|
|
||||||
|
x = (x + (int16_t)(data[0] << 8 | data[1])) / 2;
|
||||||
|
y = (y + (int16_t)(data[2] << 8 | data[3])) / 2;
|
||||||
|
z = (z + (int16_t)(data[4] << 8 | data[5])) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//accel_x_OC = x;
|
||||||
|
//accel_y_OC = y;
|
||||||
|
//accel_z_OC = z - (float)g * 1000 / accel_scale_fact;
|
||||||
|
|
||||||
|
DiagPrintf("MPU6050. Accelrometer offsets: X = %d Y = %d Z = %d\n", x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPU6050_SetDLPF(uint8_t Bandwidth)
|
||||||
|
{
|
||||||
|
MPU6050_Data_p p = &mpu;
|
||||||
|
uint8_t data[2];
|
||||||
|
|
||||||
|
if (Bandwidth < MPU6050_Bandwidth_Infinity || Bandwidth > MPU6050_Bandwidth_5Hz)
|
||||||
|
{
|
||||||
|
Bandwidth = MPU6050_Bandwidth_Infinity;
|
||||||
|
}
|
||||||
|
|
||||||
|
data[0] = MPU6050_CONFIG;
|
||||||
|
data[1] = Bandwidth;
|
||||||
|
_i2c_write(&p->i2c, MPU6050_I2C_ADDR, &data[0], 2, 1);
|
||||||
|
}
|
140
RTLGDB/Project/MPU6050/MPU6050.h
Normal file
140
RTLGDB/Project/MPU6050/MPU6050.h
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
#ifndef _MPU6050_H_
|
||||||
|
#define _MPU6050_H_
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "platform_stdlib.h"
|
||||||
|
|
||||||
|
#include "timer_api.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
|
||||||
|
#define MPU6050_IRQTIMER TIMER0
|
||||||
|
#define MPU6050_I2C_ADDR 0x68
|
||||||
|
#define MPU6050_PACKSIZE 4096
|
||||||
|
#define MPU6050_PERIOD_US 1000
|
||||||
|
|
||||||
|
typedef struct _MPU6050_Data
|
||||||
|
{
|
||||||
|
// Ïðèâàòíûå
|
||||||
|
i2c_drv_t i2c;
|
||||||
|
gtimer_t timer;
|
||||||
|
|
||||||
|
// Ïóáëè÷íûå
|
||||||
|
int16_t Accel_X;
|
||||||
|
int16_t Accel_Y;
|
||||||
|
int16_t Accel_Z;
|
||||||
|
int16_t Gyro_X;
|
||||||
|
int16_t Gyro_Y;
|
||||||
|
int16_t Gyro_Z;
|
||||||
|
float Temp_Deg;
|
||||||
|
} MPU6050_Data, *MPU6050_Data_p;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double X;
|
||||||
|
//int16_t Y;
|
||||||
|
//int16_t Z;
|
||||||
|
} MPU6050_DataPack;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MPU6050_Accelerometer_2G = 0x00,
|
||||||
|
MPU6050_Accelerometer_4G = 0x01,
|
||||||
|
MPU6050_Accelerometer_8G = 0x02,
|
||||||
|
MPU6050_Accelerometer_16G = 0x03
|
||||||
|
} MPU6050_Accelerometer;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MPU6050_Bandwidth_Infinity = 0x00,
|
||||||
|
MPU6050_Bandwidth_184Hz = 0x01,
|
||||||
|
MPU6050_Bandwidth_94Hz = 0x02,
|
||||||
|
MPU6050_Bandwidth_44Hz = 0x03,
|
||||||
|
MPU6050_Bandwidth_21Hz = 0x04,
|
||||||
|
MPU6050_Bandwidth_10Hz = 0x05,
|
||||||
|
MPU6050_Bandwidth_5Hz = 0x06,
|
||||||
|
} MPU6050_DLFP;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MPU6050_Gyroscope_250s = 0x00,
|
||||||
|
MPU6050_Gyroscope_500s = 0x01,
|
||||||
|
MPU6050_Gyroscope_1000s = 0x02,
|
||||||
|
MPU6050_Gyroscope_2000s = 0x03
|
||||||
|
} MPU6050_Gyroscope;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MPU6050_RESULT_OK = 1,
|
||||||
|
MPU6050_RESULT_NO = 0,
|
||||||
|
MPU6050_RESULT_ERROR = -1,
|
||||||
|
MPU6050_RESULT_DEVNOTCONN = -2
|
||||||
|
} MPU6050_Result;
|
||||||
|
|
||||||
|
#define MPU6050_DataRate_8KHz 0
|
||||||
|
#define MPU6050_DataRate_4KHz 1
|
||||||
|
#define MPU6050_DataRate_2KHz 3
|
||||||
|
#define MPU6050_DataRate_1KHz 7
|
||||||
|
#define MPU6050_DataRate_500Hz 15
|
||||||
|
#define MPU6050_DataRate_250Hz 31
|
||||||
|
#define MPU6050_DataRate_125Hz 63
|
||||||
|
#define MPU6050_DataRate_100Hz 79
|
||||||
|
|
||||||
|
#define MPU6050_AUX_VDDIO 0x01
|
||||||
|
#define MPU6050_SMPLRT_DIV 0x19
|
||||||
|
#define MPU6050_CONFIG 0x1A
|
||||||
|
#define MPU6050_GYRO_CONFIG 0x1B
|
||||||
|
#define MPU6050_ACCEL_CONFIG 0x1C
|
||||||
|
#define MPU6050_MOTION_THRESH 0x1F
|
||||||
|
#define MPU6050_INT_PIN_CFG 0x37
|
||||||
|
#define MPU6050_INT_ENABLE 0x38
|
||||||
|
#define MPU6050_INT_STATUS 0x3A
|
||||||
|
#define MPU6050_ACCEL_XOUT_H 0x3B
|
||||||
|
#define MPU6050_ACCEL_XOUT_L 0x3C
|
||||||
|
#define MPU6050_ACCEL_YOUT_H 0x3D
|
||||||
|
#define MPU6050_ACCEL_YOUT_L 0x3E
|
||||||
|
#define MPU6050_ACCEL_ZOUT_H 0x3F
|
||||||
|
#define MPU6050_ACCEL_ZOUT_L 0x40
|
||||||
|
#define MPU6050_TEMP_OUT_H 0x41
|
||||||
|
#define MPU6050_TEMP_OUT_L 0x42
|
||||||
|
#define MPU6050_GYRO_XOUT_H 0x43
|
||||||
|
#define MPU6050_GYRO_XOUT_L 0x44
|
||||||
|
#define MPU6050_GYRO_YOUT_H 0x45
|
||||||
|
#define MPU6050_GYRO_YOUT_L 0x46
|
||||||
|
#define MPU6050_GYRO_ZOUT_H 0x47
|
||||||
|
#define MPU6050_GYRO_ZOUT_L 0x48
|
||||||
|
#define MPU6050_MOT_DETECT_STATUS 0x61
|
||||||
|
#define MPU6050_SIGNAL_PATH_RESET 0x68
|
||||||
|
#define MPU6050_MOT_DETECT_CTRL 0x69
|
||||||
|
#define MPU6050_USER_CTRL 0x6A
|
||||||
|
#define MPU6050_PWR_MGMT_1 0x6B
|
||||||
|
#define MPU6050_PWR_MGMT_2 0x6C
|
||||||
|
#define MPU6050_FIFO_COUNTH 0x72
|
||||||
|
#define MPU6050_FIFO_COUNTL 0x73
|
||||||
|
#define MPU6050_FIFO_R_W 0x74
|
||||||
|
#define MPU6050_WHO_AM_I 0x75
|
||||||
|
#define MPU6050_I_AM 0x68
|
||||||
|
|
||||||
|
// Gyro sensitivities in degrees/s
|
||||||
|
#define MPU6050_GYRO_SENS_250 ((double) 131.0)
|
||||||
|
#define MPU6050_GYRO_SENS_500 ((double) 65.5)
|
||||||
|
#define MPU6050_GYRO_SENS_1000 ((double) 32.8)
|
||||||
|
#define MPU6050_GYRO_SENS_2000 ((double) 16.4)
|
||||||
|
|
||||||
|
// Acce sensitivities in g/s
|
||||||
|
#define MPU6050_ACCE_SENS_2 ((double) 16384.0)
|
||||||
|
#define MPU6050_ACCE_SENS_4 ((double) 8192.0)
|
||||||
|
#define MPU6050_ACCE_SENS_8 ((double) 4096.0)
|
||||||
|
#define MPU6050_ACCE_SENS_16 ((double) 2048.0)
|
||||||
|
|
||||||
|
int16_t MPU6050_Init();
|
||||||
|
void MPU6050_SetGyroscope(MPU6050_Gyroscope gs);
|
||||||
|
void MPU6050_SetAccelerometer(MPU6050_Accelerometer as);
|
||||||
|
void MPU6050_SetDataRate(uint8_t rate);
|
||||||
|
int16_t MPU6050_IsDataPacketReady(MPU6050_DataPack *dp);
|
||||||
|
void MPU6050_OffsetCalibrate(int32_t num);
|
||||||
|
void MPU6050_SetDLPF(uint8_t Bandwidth);
|
||||||
|
|
||||||
|
#endif // _MPU6050_H_
|
65
RTLGDB/Project/MPU6050/kalman.c
Normal file
65
RTLGDB/Project/MPU6050/kalman.c
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#include "kalman.h"
|
||||||
|
|
||||||
|
const double Q_angle = 0.01;
|
||||||
|
const double Q_bias = 0.003;
|
||||||
|
const double R_measure = 0.03;
|
||||||
|
|
||||||
|
static double angle;
|
||||||
|
static double bias;
|
||||||
|
static double rate;
|
||||||
|
|
||||||
|
double P[2][2];
|
||||||
|
double K[2];
|
||||||
|
double y;
|
||||||
|
double S;
|
||||||
|
|
||||||
|
void Kalman_Init()
|
||||||
|
{
|
||||||
|
bias = 0;
|
||||||
|
rate = 0;
|
||||||
|
angle = 180;
|
||||||
|
|
||||||
|
P[0][0] = 0;
|
||||||
|
P[0][1] = 0;
|
||||||
|
P[1][0] = 0;
|
||||||
|
P[1][1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Óãîë â ãðàäóñàõ è óãëîâàÿ ñêîðîñòü â ãðàäóñ\ñåê, ïåðèîä â ñåêóíäàõ.
|
||||||
|
double Kalman_GetAngle(double newAngle, double newRate, double dt)
|
||||||
|
{
|
||||||
|
// Step 1
|
||||||
|
rate = newRate - bias;
|
||||||
|
angle += dt * rate;
|
||||||
|
|
||||||
|
// Update estimation error covariance - Project the error covariance ahead
|
||||||
|
// Step 2
|
||||||
|
P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
|
||||||
|
P[0][1] -= dt * P[1][1];
|
||||||
|
P[1][0] -= dt * P[1][1];
|
||||||
|
P[1][1] += Q_bias * dt;
|
||||||
|
|
||||||
|
// Discrete Kalman filter measurement update equations - Measurement Update ("Correct")
|
||||||
|
// Calculate Kalman gain - Compute the Kalman gain
|
||||||
|
// Step 4
|
||||||
|
S = P[0][0] + R_measure;
|
||||||
|
// Step 5
|
||||||
|
K[0] = P[0][0] / S;
|
||||||
|
K[1] = P[1][0] / S;
|
||||||
|
|
||||||
|
// Calculate angle and bias - Update estimate with measurement zk(newAngle)
|
||||||
|
// Step 3
|
||||||
|
y = newAngle - angle;
|
||||||
|
// Step 6
|
||||||
|
angle += K[0] * y;
|
||||||
|
bias += K[1] * y;
|
||||||
|
|
||||||
|
// Calculate estimation error covariance - Update the error covariance
|
||||||
|
// Step 7
|
||||||
|
P[0][0] -= K[0] * P[0][0];
|
||||||
|
P[0][1] -= K[0] * P[0][1];
|
||||||
|
P[1][0] -= K[1] * P[0][0];
|
||||||
|
P[1][1] -= K[1] * P[0][1];
|
||||||
|
|
||||||
|
return angle;
|
||||||
|
}
|
12
RTLGDB/Project/MPU6050/kalman.h
Normal file
12
RTLGDB/Project/MPU6050/kalman.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef _KALMAN_H_
|
||||||
|
#define _KALMAN_H_
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "platform_stdlib.h"
|
||||||
|
|
||||||
|
void Kalman_Init();
|
||||||
|
double Kalman_GetAngle(double newAngle, double newRate, double dt);
|
||||||
|
|
||||||
|
#endif // _KALMAN_H_
|
498
RTLGDB/Project/SSD1306/SSD1306.c
Normal file
498
RTLGDB/Project/SSD1306/SSD1306.c
Normal file
|
@ -0,0 +1,498 @@
|
||||||
|
#include "SSD1306.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
i2c_t SSD1306_i2c;
|
||||||
|
//i2c_drv_t SSD1306_i2c;
|
||||||
|
|
||||||
|
// SSD1306 data buffer
|
||||||
|
static uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];
|
||||||
|
static SSD1306_t SSD1306;
|
||||||
|
|
||||||
|
void SSD1306_I2C_WriteMulti(uint8_t reg, uint8_t* data, uint16_t count)
|
||||||
|
{
|
||||||
|
uint8_t datasend[count + 1];
|
||||||
|
|
||||||
|
datasend[0] = reg;
|
||||||
|
for (int i = 0; i<count; i++)
|
||||||
|
{
|
||||||
|
datasend[i + 1] = data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_write(&SSD1306_i2c, SSD1306_I2C_ADDR, &datasend, count + 1, 1);
|
||||||
|
//_i2c_write(&SSD1306_i2c, SSD1306_I2C_ADDR, &datasend, count + 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_I2C_Write(uint8_t reg, uint8_t data)
|
||||||
|
{
|
||||||
|
uint8_t datasend[2] = { reg , data };
|
||||||
|
i2c_write(&SSD1306_i2c, SSD1306_I2C_ADDR, &datasend, 2, 1);
|
||||||
|
//_i2c_write(&SSD1306_i2c, SSD1306_I2C_ADDR, &datasend, 2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t SSD1306_Init(i2c_t *i2c)
|
||||||
|
{
|
||||||
|
//_memset(&SSD1306_i2c, 0x00, sizeof(i2c_t));
|
||||||
|
//i2c_init(&SSD1306_i2c, SSD1306_I2C_PIN_SDA, SSD1306_I2C_PIN_SCL);
|
||||||
|
//i2c_frequency(&SSD1306_i2c, SSD1306_I2C_BUS_CLK);
|
||||||
|
|
||||||
|
//SSD1306_i2c.status = DRV_I2C_OFF;
|
||||||
|
//SSD1306_i2c.idx = 3; // I2C1
|
||||||
|
//SSD1306_i2c.io_sel = S0; // PC_4, PC_5
|
||||||
|
//SSD1306_i2c.mode = DRV_I2C_HS_MODE;
|
||||||
|
|
||||||
|
//_i2c_setup(&SSD1306_i2c, PB_3, PB_2, DRV_I2C_HS_MODE);
|
||||||
|
//_i2c_init(&SSD1306_i2c);
|
||||||
|
|
||||||
|
SSD1306_i2c = *i2c;
|
||||||
|
|
||||||
|
//vTaskDelay(10);
|
||||||
|
|
||||||
|
SSD1306_WRITECOMMAND(0xAE); //display off
|
||||||
|
SSD1306_WRITECOMMAND(0x20); //Set Memory Addressing Mode
|
||||||
|
SSD1306_WRITECOMMAND(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
|
||||||
|
SSD1306_WRITECOMMAND(0xB0); //Set Page Start Address for Page Addressing Mode,0-7
|
||||||
|
SSD1306_WRITECOMMAND(0xC8); //Set COM Output Scan Direction
|
||||||
|
SSD1306_WRITECOMMAND(0x00); //---set low column address
|
||||||
|
SSD1306_WRITECOMMAND(0x10); //---set high column address
|
||||||
|
SSD1306_WRITECOMMAND(0x40); //--set start line address
|
||||||
|
SSD1306_WRITECOMMAND(0x81); //--set contrast control register
|
||||||
|
SSD1306_WRITECOMMAND(0xFF);
|
||||||
|
SSD1306_WRITECOMMAND(0xA1); //--set segment re-map 0 to 127
|
||||||
|
SSD1306_WRITECOMMAND(0xA6); //--set normal display
|
||||||
|
SSD1306_WRITECOMMAND(0xA8); //--set multiplex ratio(1 to 64)
|
||||||
|
SSD1306_WRITECOMMAND(0x3F); //
|
||||||
|
SSD1306_WRITECOMMAND(0xA4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
|
||||||
|
SSD1306_WRITECOMMAND(0xD3); //-set display offset
|
||||||
|
SSD1306_WRITECOMMAND(0x00); //-not offset
|
||||||
|
SSD1306_WRITECOMMAND(0xD5); //--set display clock divide ratio/oscillator frequency
|
||||||
|
SSD1306_WRITECOMMAND(0xF0); //--set divide ratio
|
||||||
|
SSD1306_WRITECOMMAND(0xD9); //--set pre-charge period
|
||||||
|
SSD1306_WRITECOMMAND(0x22); //
|
||||||
|
SSD1306_WRITECOMMAND(0xDA); //--set com pins hardware configuration
|
||||||
|
SSD1306_WRITECOMMAND(0x12);
|
||||||
|
SSD1306_WRITECOMMAND(0xDB); //--set vcomh
|
||||||
|
SSD1306_WRITECOMMAND(0x20); //0x20,0.77xVcc
|
||||||
|
SSD1306_WRITECOMMAND(0x8D); //--set DC-DC enable
|
||||||
|
SSD1306_WRITECOMMAND(0x14); //
|
||||||
|
SSD1306_WRITECOMMAND(0xAF); //--turn on SSD1306 panel
|
||||||
|
|
||||||
|
SSD1306_Fill(SSD1306_COLOR_BLACK);
|
||||||
|
|
||||||
|
SSD1306_UpdateScreen();
|
||||||
|
|
||||||
|
SSD1306.CurrentX = 0;
|
||||||
|
SSD1306.CurrentY = 0;
|
||||||
|
|
||||||
|
SSD1306.Initialized = 1;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_UpdateScreen(void)
|
||||||
|
{
|
||||||
|
uint8_t m;
|
||||||
|
|
||||||
|
for (m = 0; m < 8; m++)
|
||||||
|
{
|
||||||
|
SSD1306_WRITECOMMAND(0xB0 + m);
|
||||||
|
SSD1306_WRITECOMMAND(0x00);
|
||||||
|
SSD1306_WRITECOMMAND(0x10);
|
||||||
|
|
||||||
|
SSD1306_I2C_WriteMulti(0x40, &SSD1306_Buffer[SSD1306_WIDTH * m], SSD1306_WIDTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_ToggleInvert(void)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
|
||||||
|
SSD1306.Inverted = !SSD1306.Inverted;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(SSD1306_Buffer); i++)
|
||||||
|
{
|
||||||
|
SSD1306_Buffer[i] = ~SSD1306_Buffer[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_Fill(SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
memset(SSD1306_Buffer, (color == SSD1306_COLOR_BLACK) ? 0x00 : 0xFF, sizeof(SSD1306_Buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
if(x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SSD1306.Inverted)
|
||||||
|
{
|
||||||
|
color = (SSD1306_COLOR_t)!color;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color == SSD1306_COLOR_WHITE)
|
||||||
|
{
|
||||||
|
SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] |= 1 << (y % 8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_GotoXY(uint16_t x, uint16_t y)
|
||||||
|
{
|
||||||
|
SSD1306.CurrentX = x;
|
||||||
|
SSD1306.CurrentY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
char SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
uint32_t i, b, j;
|
||||||
|
|
||||||
|
// Check available space in LCD
|
||||||
|
if(SSD1306_WIDTH <= (SSD1306.CurrentX + Font->FontWidth) || SSD1306_HEIGHT <= (SSD1306.CurrentY + Font->FontHeight))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Font->FontHeight; i++)
|
||||||
|
{
|
||||||
|
b = Font->data[(ch - 32) * Font->FontHeight + i];
|
||||||
|
for (j = 0; j < Font->FontWidth; j++)
|
||||||
|
{
|
||||||
|
if ((b << j) & 0x8000)
|
||||||
|
{
|
||||||
|
SSD1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR_t) color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SSD1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR_t)!color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SSD1306.CurrentX += Font->FontWidth;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
char SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
while (*str)
|
||||||
|
{
|
||||||
|
if (SSD1306_Putc(*str, Font, color) != *str)
|
||||||
|
{
|
||||||
|
return *str; // Error
|
||||||
|
}
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *str; // Ok
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SSD1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR_t c)
|
||||||
|
{
|
||||||
|
int16_t dx, dy, sx, sy, err, e2, i, tmp;
|
||||||
|
|
||||||
|
if(x0 >= SSD1306_WIDTH)
|
||||||
|
{
|
||||||
|
x0 = SSD1306_WIDTH - 1;
|
||||||
|
}
|
||||||
|
if(x1 >= SSD1306_WIDTH)
|
||||||
|
{
|
||||||
|
x1 = SSD1306_WIDTH - 1;
|
||||||
|
}
|
||||||
|
if(y0 >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
y0 = SSD1306_HEIGHT - 1;
|
||||||
|
}
|
||||||
|
if(y1 >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
y1 = SSD1306_HEIGHT - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dx = (x0 < x1) ? (x1 - x0) : (x0 - x1);
|
||||||
|
dy = (y0 < y1) ? (y1 - y0) : (y0 - y1);
|
||||||
|
sx = (x0 < x1) ? 1 : -1;
|
||||||
|
sy = (y0 < y1) ? 1 : -1;
|
||||||
|
err = ((dx > dy) ? dx : -dy) / 2;
|
||||||
|
|
||||||
|
if(dx == 0)
|
||||||
|
{
|
||||||
|
if(y1 < y0)
|
||||||
|
{
|
||||||
|
tmp = y1;
|
||||||
|
y1 = y0;
|
||||||
|
y0 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(x1 < x0)
|
||||||
|
{
|
||||||
|
tmp = x1;
|
||||||
|
x1 = x0;
|
||||||
|
x0 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertical line
|
||||||
|
for(i = y0; i <= y1; i++)
|
||||||
|
{
|
||||||
|
SSD1306_DrawPixel(x0, i, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dy == 0)
|
||||||
|
{
|
||||||
|
if (y1 < y0)
|
||||||
|
{
|
||||||
|
tmp = y1;
|
||||||
|
y1 = y0;
|
||||||
|
y0 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x1 < x0)
|
||||||
|
{
|
||||||
|
tmp = x1;
|
||||||
|
x1 = x0;
|
||||||
|
x0 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Horizontal line
|
||||||
|
for (i = x0; i <= x1; i++)
|
||||||
|
{
|
||||||
|
SSD1306_DrawPixel(i, y0, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
SSD1306_DrawPixel(x0, y0, c);
|
||||||
|
if (x0 == x1 && y0 == y1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
e2 = err;
|
||||||
|
if (e2 > -dx)
|
||||||
|
{
|
||||||
|
err -= dy;
|
||||||
|
x0 += sx;
|
||||||
|
}
|
||||||
|
if (e2 < dy)
|
||||||
|
{
|
||||||
|
err += dx;
|
||||||
|
y0 += sy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c)
|
||||||
|
{
|
||||||
|
if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((x + w) >= SSD1306_WIDTH)
|
||||||
|
{
|
||||||
|
w = SSD1306_WIDTH - x;
|
||||||
|
}
|
||||||
|
if ((y + h) >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
h = SSD1306_HEIGHT - y;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSD1306_DrawLine(x, y, x + w, y, c); //Top line
|
||||||
|
SSD1306_DrawLine(x, y + h, x + w, y + h, c); // Bottom line
|
||||||
|
SSD1306_DrawLine(x, y, x, y + h, c); // Left line
|
||||||
|
SSD1306_DrawLine(x + w, y, x + w, y + h, c); // Right line
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawFilledRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if(x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((x + w) >= SSD1306_WIDTH)
|
||||||
|
{
|
||||||
|
w = SSD1306_WIDTH - x;
|
||||||
|
}
|
||||||
|
if ((y + h) >= SSD1306_HEIGHT)
|
||||||
|
{
|
||||||
|
h = SSD1306_HEIGHT - y;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= h; i++)
|
||||||
|
{
|
||||||
|
SSD1306_DrawLine(x, y + i, x + w, y + i, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
SSD1306_DrawLine(x1, y1, x2, y2, color);
|
||||||
|
SSD1306_DrawLine(x2, y2, x3, y3, color);
|
||||||
|
SSD1306_DrawLine(x3, y3, x1, y1, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SSD1306_DrawFilledTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color)
|
||||||
|
{
|
||||||
|
int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
|
||||||
|
yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
|
||||||
|
curpixel = 0;
|
||||||
|
|
||||||
|
deltax = ABS(x2 - x1);
|
||||||
|
deltay = ABS(y2 - y1);
|
||||||
|
x = x1;
|
||||||
|
y = y1;
|
||||||
|
|
||||||
|
if(x2 >= x1)
|
||||||
|
{
|
||||||
|
xinc1 = 1;
|
||||||
|
xinc2 = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xinc1 = -1;
|
||||||
|
xinc2 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(y2 >= y1)
|
||||||
|
{
|
||||||
|
yinc1 = 1;
|
||||||
|
yinc2 = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yinc1 = -1;
|
||||||
|
yinc2 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(deltax >= deltay)
|
||||||
|
{
|
||||||
|
xinc1 = 0;
|
||||||
|
yinc2 = 0;
|
||||||
|
den = deltax;
|
||||||
|
num = deltax / 2;
|
||||||
|
numadd = deltay;
|
||||||
|
numpixels = deltax;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xinc2 = 0;
|
||||||
|
yinc1 = 0;
|
||||||
|
den = deltay;
|
||||||
|
num = deltay / 2;
|
||||||
|
numadd = deltax;
|
||||||
|
numpixels = deltay;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (curpixel = 0; curpixel <= numpixels; curpixel++)
|
||||||
|
{
|
||||||
|
SSD1306_DrawLine(x, y, x3, y3, color);
|
||||||
|
|
||||||
|
num += numadd;
|
||||||
|
if (num >= den)
|
||||||
|
{
|
||||||
|
num -= den;
|
||||||
|
x += xinc1;
|
||||||
|
y += yinc1;
|
||||||
|
}
|
||||||
|
x += xinc2;
|
||||||
|
y += yinc2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c)
|
||||||
|
{
|
||||||
|
int16_t f = 1 - r;
|
||||||
|
int16_t ddF_x = 1;
|
||||||
|
int16_t ddF_y = -2 * r;
|
||||||
|
int16_t x = 0;
|
||||||
|
int16_t y = r;
|
||||||
|
|
||||||
|
SSD1306_DrawPixel(x0, y0 + r, c);
|
||||||
|
SSD1306_DrawPixel(x0, y0 - r, c);
|
||||||
|
SSD1306_DrawPixel(x0 + r, y0, c);
|
||||||
|
SSD1306_DrawPixel(x0 - r, y0, c);
|
||||||
|
|
||||||
|
while (x < y)
|
||||||
|
{
|
||||||
|
if (f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
SSD1306_DrawPixel(x0 + x, y0 + y, c);
|
||||||
|
SSD1306_DrawPixel(x0 - x, y0 + y, c);
|
||||||
|
SSD1306_DrawPixel(x0 + x, y0 - y, c);
|
||||||
|
SSD1306_DrawPixel(x0 - x, y0 - y, c);
|
||||||
|
|
||||||
|
SSD1306_DrawPixel(x0 + y, y0 + x, c);
|
||||||
|
SSD1306_DrawPixel(x0 - y, y0 + x, c);
|
||||||
|
SSD1306_DrawPixel(x0 + y, y0 - x, c);
|
||||||
|
SSD1306_DrawPixel(x0 - y, y0 - x, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c)
|
||||||
|
{
|
||||||
|
int16_t f = 1 - r;
|
||||||
|
int16_t ddF_x = 1;
|
||||||
|
int16_t ddF_y = -2 * r;
|
||||||
|
int16_t x = 0;
|
||||||
|
int16_t y = r;
|
||||||
|
|
||||||
|
SSD1306_DrawPixel(x0, y0 + r, c);
|
||||||
|
SSD1306_DrawPixel(x0, y0 - r, c);
|
||||||
|
SSD1306_DrawPixel(x0 + r, y0, c);
|
||||||
|
SSD1306_DrawPixel(x0 - r, y0, c);
|
||||||
|
SSD1306_DrawLine(x0 - r, y0, x0 + r, y0, c);
|
||||||
|
|
||||||
|
while (x < y)
|
||||||
|
{
|
||||||
|
if (f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
SSD1306_DrawLine(x0 - x, y0 + y, x0 + x, y0 + y, c);
|
||||||
|
SSD1306_DrawLine(x0 + x, y0 - y, x0 - x, y0 - y, c);
|
||||||
|
|
||||||
|
SSD1306_DrawLine(x0 + y, y0 + x, x0 - y, y0 + x, c);
|
||||||
|
SSD1306_DrawLine(x0 + y, y0 - x, x0 - y, y0 - x, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_ON(void)
|
||||||
|
{
|
||||||
|
SSD1306_WRITECOMMAND(0x8D);
|
||||||
|
SSD1306_WRITECOMMAND(0x14);
|
||||||
|
SSD1306_WRITECOMMAND(0xAF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1306_OFF(void)
|
||||||
|
{
|
||||||
|
SSD1306_WRITECOMMAND(0x8D);
|
||||||
|
SSD1306_WRITECOMMAND(0x10);
|
||||||
|
SSD1306_WRITECOMMAND(0xAE);
|
||||||
|
}
|
65
RTLGDB/Project/SSD1306/SSD1306.h
Normal file
65
RTLGDB/Project/SSD1306/SSD1306.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#ifndef _SSD1306_H_
|
||||||
|
#define _SSD1306_H_
|
||||||
|
|
||||||
|
#include "device.h"
|
||||||
|
#include "fonts.h"
|
||||||
|
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
#include "i2c_api.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "ex_api.h"
|
||||||
|
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
|
||||||
|
#define SSD1306_I2C_PIN_SDA PC_4
|
||||||
|
#define SSD1306_I2C_PIN_SCL PC_5
|
||||||
|
#define SSD1306_I2C_BUS_CLK 1000000 //hz
|
||||||
|
|
||||||
|
// I2C address
|
||||||
|
#ifndef SSD1306_I2C_ADDR
|
||||||
|
#define SSD1306_I2C_ADDR (0x78 >> 1)
|
||||||
|
//#define SSD1306_I2C_ADDR 0x7A
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SSD1306 settings
|
||||||
|
#ifndef SSD1306_WIDTH
|
||||||
|
#define SSD1306_WIDTH 128
|
||||||
|
#endif
|
||||||
|
#ifndef SSD1306_HEIGHT
|
||||||
|
#define SSD1306_HEIGHT 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SSD1306_COLOR_BLACK = 0x00,
|
||||||
|
SSD1306_COLOR_WHITE = 0x01
|
||||||
|
} SSD1306_COLOR_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t CurrentX;
|
||||||
|
uint16_t CurrentY;
|
||||||
|
uint8_t Inverted;
|
||||||
|
uint8_t Initialized;
|
||||||
|
} SSD1306_t;
|
||||||
|
|
||||||
|
#define SSD1306_WRITECOMMAND(command) SSD1306_I2C_Write(0x00, (command))
|
||||||
|
#define SSD1306_WRITEDATA(data) SSD1306_I2C_Write(0x40, (data))
|
||||||
|
#define ABS(x) ((x) > 0 ? (x) : -(x))
|
||||||
|
|
||||||
|
uint8_t SSD1306_Init(i2c_t *i2c);
|
||||||
|
void SSD1306_UpdateScreen(void);
|
||||||
|
void SSD1306_ToggleInvert(void);
|
||||||
|
void SSD1306_Fill(SSD1306_COLOR_t Color);
|
||||||
|
void SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color);
|
||||||
|
void SSD1306_GotoXY(uint16_t x, uint16_t y);
|
||||||
|
char SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color);
|
||||||
|
char SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color);
|
||||||
|
void SSD1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR_t c);
|
||||||
|
void SSD1306_DrawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c);
|
||||||
|
void SSD1306_DrawFilledRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c);
|
||||||
|
void SSD1306_DrawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color);
|
||||||
|
void SSD1306_DrawCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c);
|
||||||
|
void SSD1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c);
|
||||||
|
|
||||||
|
#endif // _SSD1306_H_
|
345
RTLGDB/Project/SSD1306/fonts.c
Normal file
345
RTLGDB/Project/SSD1306/fonts.c
Normal file
|
@ -0,0 +1,345 @@
|
||||||
|
/**
|
||||||
|
* original author: Tilen Majerle<tilen@majerle.eu>
|
||||||
|
* modification for STM32f10x: Alexander Lutsai<s.lyra@ya.ru>
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Copyright (C) Alexander Lutsai, 2016
|
||||||
|
Copyright (C) Tilen Majerle, 2015
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#include "fonts.h"
|
||||||
|
|
||||||
|
const uint16_t Font7x10 [] = {
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // sp
|
||||||
|
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // !
|
||||||
|
0x2800, 0x2800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // "
|
||||||
|
0x2400, 0x2400, 0x7C00, 0x2400, 0x4800, 0x7C00, 0x4800, 0x4800, 0x0000, 0x0000, // #
|
||||||
|
0x3800, 0x5400, 0x5000, 0x3800, 0x1400, 0x5400, 0x5400, 0x3800, 0x1000, 0x0000, // $
|
||||||
|
0x2000, 0x5400, 0x5800, 0x3000, 0x2800, 0x5400, 0x1400, 0x0800, 0x0000, 0x0000, // %
|
||||||
|
0x1000, 0x2800, 0x2800, 0x1000, 0x3400, 0x4800, 0x4800, 0x3400, 0x0000, 0x0000, // &
|
||||||
|
0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // '
|
||||||
|
0x0800, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x0800, // (
|
||||||
|
0x2000, 0x1000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1000, 0x2000, // )
|
||||||
|
0x1000, 0x3800, 0x1000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // *
|
||||||
|
0x0000, 0x0000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, // +
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // ,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, // -
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // .
|
||||||
|
0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, // /
|
||||||
|
0x3800, 0x4400, 0x4400, 0x5400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 0
|
||||||
|
0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // 1
|
||||||
|
0x3800, 0x4400, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x7C00, 0x0000, 0x0000, // 2
|
||||||
|
0x3800, 0x4400, 0x0400, 0x1800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 3
|
||||||
|
0x0800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7C00, 0x0800, 0x0800, 0x0000, 0x0000, // 4
|
||||||
|
0x7C00, 0x4000, 0x4000, 0x7800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 5
|
||||||
|
0x3800, 0x4400, 0x4000, 0x7800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 6
|
||||||
|
0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, // 7
|
||||||
|
0x3800, 0x4400, 0x4400, 0x3800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 8
|
||||||
|
0x3800, 0x4400, 0x4400, 0x4400, 0x3C00, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 9
|
||||||
|
0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // :
|
||||||
|
0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // ;
|
||||||
|
0x0000, 0x0000, 0x0C00, 0x3000, 0x4000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x0000, // <
|
||||||
|
0x0000, 0x0000, 0x0000, 0x7C00, 0x0000, 0x7C00, 0x0000, 0x0000, 0x0000, 0x0000, // =
|
||||||
|
0x0000, 0x0000, 0x6000, 0x1800, 0x0400, 0x1800, 0x6000, 0x0000, 0x0000, 0x0000, // >
|
||||||
|
0x3800, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // ?
|
||||||
|
0x3800, 0x4400, 0x4C00, 0x5400, 0x5C00, 0x4000, 0x4000, 0x3800, 0x0000, 0x0000, // @
|
||||||
|
0x1000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7C00, 0x4400, 0x4400, 0x0000, 0x0000, // A
|
||||||
|
0x7800, 0x4400, 0x4400, 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x0000, 0x0000, // B
|
||||||
|
0x3800, 0x4400, 0x4000, 0x4000, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // C
|
||||||
|
0x7000, 0x4800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4800, 0x7000, 0x0000, 0x0000, // D
|
||||||
|
0x7C00, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // E
|
||||||
|
0x7C00, 0x4000, 0x4000, 0x7800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // F
|
||||||
|
0x3800, 0x4400, 0x4000, 0x4000, 0x5C00, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // G
|
||||||
|
0x4400, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // H
|
||||||
|
0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3800, 0x0000, 0x0000, // I
|
||||||
|
0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // J
|
||||||
|
0x4400, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // K
|
||||||
|
0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // L
|
||||||
|
0x4400, 0x6C00, 0x6C00, 0x5400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // M
|
||||||
|
0x4400, 0x6400, 0x6400, 0x5400, 0x5400, 0x4C00, 0x4C00, 0x4400, 0x0000, 0x0000, // N
|
||||||
|
0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // O
|
||||||
|
0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // P
|
||||||
|
0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x5400, 0x3800, 0x0400, 0x0000, // Q
|
||||||
|
0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // R
|
||||||
|
0x3800, 0x4400, 0x4000, 0x3000, 0x0800, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // S
|
||||||
|
0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // T
|
||||||
|
0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // U
|
||||||
|
0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000, // V
|
||||||
|
0x4400, 0x4400, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // W
|
||||||
|
0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, // X
|
||||||
|
0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // Y
|
||||||
|
0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // Z
|
||||||
|
0x1800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1800, // [
|
||||||
|
0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000, /* \ */
|
||||||
|
0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3000, // ]
|
||||||
|
0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ^
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, // _
|
||||||
|
0x2000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // `
|
||||||
|
0x0000, 0x0000, 0x3800, 0x4400, 0x3C00, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // a
|
||||||
|
0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000, // b
|
||||||
|
0x0000, 0x0000, 0x3800, 0x4400, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // c
|
||||||
|
0x0400, 0x0400, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // d
|
||||||
|
0x0000, 0x0000, 0x3800, 0x4400, 0x7C00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // e
|
||||||
|
0x0C00, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // f
|
||||||
|
0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x7800, // g
|
||||||
|
0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // h
|
||||||
|
0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // i
|
||||||
|
0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xE000, // j
|
||||||
|
0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x0000, 0x0000, // k
|
||||||
|
0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // l
|
||||||
|
0x0000, 0x0000, 0x7800, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x0000, 0x0000, // m
|
||||||
|
0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // n
|
||||||
|
0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // o
|
||||||
|
0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000, // p
|
||||||
|
0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x0400, // q
|
||||||
|
0x0000, 0x0000, 0x5800, 0x6400, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // r
|
||||||
|
0x0000, 0x0000, 0x3800, 0x4400, 0x3000, 0x0800, 0x4400, 0x3800, 0x0000, 0x0000, // s
|
||||||
|
0x2000, 0x2000, 0x7800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x0000, 0x0000, // t
|
||||||
|
0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // u
|
||||||
|
0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000, // v
|
||||||
|
0x0000, 0x0000, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // w
|
||||||
|
0x0000, 0x0000, 0x4400, 0x2800, 0x1000, 0x1000, 0x2800, 0x4400, 0x0000, 0x0000, // x
|
||||||
|
0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x6000, // y
|
||||||
|
0x0000, 0x0000, 0x7C00, 0x0800, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // z
|
||||||
|
0x1800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1800, // {
|
||||||
|
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, // |
|
||||||
|
0x3000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x3000, // }
|
||||||
|
0x0000, 0x0000, 0x0000, 0x7400, 0x4C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ~
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t Font11x18 [] = {
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // sp
|
||||||
|
0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // !
|
||||||
|
0x0000, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // "
|
||||||
|
0x0000, 0x1980, 0x1980, 0x1980, 0x1980, 0x7FC0, 0x7FC0, 0x1980, 0x3300, 0x7FC0, 0x7FC0, 0x3300, 0x3300, 0x3300, 0x3300, 0x0000, 0x0000, 0x0000, // #
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x7580, 0x6580, 0x7400, 0x3C00, 0x1E00, 0x0700, 0x0580, 0x6580, 0x6580, 0x7580, 0x3F00, 0x1E00, 0x0400, 0x0400, 0x0000, // $
|
||||||
|
0x0000, 0x7000, 0xD800, 0xD840, 0xD8C0, 0xD980, 0x7300, 0x0600, 0x0C00, 0x1B80, 0x36C0, 0x66C0, 0x46C0, 0x06C0, 0x0380, 0x0000, 0x0000, 0x0000, // %
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3300, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x3CC0, 0x66C0, 0x6380, 0x6180, 0x6380, 0x3EC0, 0x1C80, 0x0000, 0x0000, 0x0000, // &
|
||||||
|
0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // '
|
||||||
|
0x0080, 0x0100, 0x0300, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0300, 0x0100, 0x0080, // (
|
||||||
|
0x2000, 0x1000, 0x1800, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x1800, 0x1000, 0x2000, // )
|
||||||
|
0x0000, 0x0C00, 0x2D00, 0x3F00, 0x1E00, 0x3300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // *
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // +
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800, // ,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1E00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // -
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // .
|
||||||
|
0x0000, 0x0300, 0x0300, 0x0300, 0x0600, 0x0600, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, // /
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6D80, 0x6D80, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 0
|
||||||
|
0x0000, 0x0600, 0x0E00, 0x1E00, 0x3600, 0x2600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // 1
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // 2
|
||||||
|
0x0000, 0x1C00, 0x3E00, 0x6300, 0x6300, 0x0300, 0x0E00, 0x0E00, 0x0300, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 3
|
||||||
|
0x0000, 0x0600, 0x0E00, 0x0E00, 0x1E00, 0x1E00, 0x1600, 0x3600, 0x3600, 0x6600, 0x7F80, 0x7F80, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // 4
|
||||||
|
0x0000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x6380, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 5
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3380, 0x6180, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x3380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 6
|
||||||
|
0x0000, 0x7F80, 0x7F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0800, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, // 7
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x6380, 0x6180, 0x6180, 0x2100, 0x1E00, 0x3F00, 0x6180, 0x6180, 0x6180, 0x6180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 8
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6180, 0x7300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 9
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // :
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800, // ;
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0380, 0x0E00, 0x3800, 0x6000, 0x3800, 0x0E00, 0x0380, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // <
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // =
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x7000, 0x1C00, 0x0700, 0x0180, 0x0700, 0x1C00, 0x7000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // >
|
||||||
|
0x0000, 0x1F00, 0x3F80, 0x71C0, 0x60C0, 0x00C0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // ?
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3180, 0x7180, 0x6380, 0x6F80, 0x6D80, 0x6D80, 0x6F80, 0x6780, 0x6000, 0x3200, 0x3E00, 0x1C00, 0x0000, 0x0000, 0x0000, // @
|
||||||
|
0x0000, 0x0E00, 0x0E00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x3180, 0x3180, 0x3F80, 0x3F80, 0x3180, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000, // A
|
||||||
|
0x0000, 0x7C00, 0x7E00, 0x6300, 0x6300, 0x6300, 0x6300, 0x7E00, 0x7E00, 0x6300, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x0000, 0x0000, 0x0000, // B
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // C
|
||||||
|
0x0000, 0x7C00, 0x7F00, 0x6300, 0x6380, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6300, 0x6300, 0x7E00, 0x7C00, 0x0000, 0x0000, 0x0000, // D
|
||||||
|
0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // E
|
||||||
|
0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, // F
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6380, 0x6380, 0x6180, 0x6180, 0x3180, 0x3F80, 0x1E00, 0x0000, 0x0000, 0x0000, // G
|
||||||
|
0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7F80, 0x7F80, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // H
|
||||||
|
0x0000, 0x3F00, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3F00, 0x3F00, 0x0000, 0x0000, 0x0000, // I
|
||||||
|
0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // J
|
||||||
|
0x0000, 0x60C0, 0x6180, 0x6300, 0x6600, 0x6600, 0x6C00, 0x7800, 0x7C00, 0x6600, 0x6600, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // K
|
||||||
|
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // L
|
||||||
|
0x0000, 0x71C0, 0x71C0, 0x7BC0, 0x7AC0, 0x6AC0, 0x6AC0, 0x6EC0, 0x64C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000, // M
|
||||||
|
0x0000, 0x7180, 0x7180, 0x7980, 0x7980, 0x7980, 0x6D80, 0x6D80, 0x6D80, 0x6580, 0x6780, 0x6780, 0x6780, 0x6380, 0x6380, 0x0000, 0x0000, 0x0000, // N
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // O
|
||||||
|
0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, // P
|
||||||
|
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6580, 0x6780, 0x3300, 0x3F80, 0x1E40, 0x0000, 0x0000, 0x0000, // Q
|
||||||
|
0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6600, 0x6300, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // R
|
||||||
|
0x0000, 0x0E00, 0x1F00, 0x3180, 0x3180, 0x3000, 0x3800, 0x1E00, 0x0700, 0x0380, 0x6180, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // S
|
||||||
|
0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // T
|
||||||
|
0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // U
|
||||||
|
0x0000, 0x60C0, 0x60C0, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x0400, 0x0000, 0x0000, 0x0000, // V
|
||||||
|
0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xCCC0, 0x4C80, 0x4C80, 0x5E80, 0x5280, 0x5280, 0x7380, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // W
|
||||||
|
0x0000, 0xC0C0, 0x6080, 0x6180, 0x3300, 0x3B00, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x1F00, 0x3B00, 0x7180, 0x6180, 0xC0C0, 0x0000, 0x0000, 0x0000, // X
|
||||||
|
0x0000, 0xC0C0, 0x6180, 0x6180, 0x3300, 0x3300, 0x1E00, 0x1E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // Y
|
||||||
|
0x0000, 0x3F80, 0x3F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // Z
|
||||||
|
0x0F00, 0x0F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0F00, 0x0F00, // [
|
||||||
|
0x0000, 0x1800, 0x1800, 0x1800, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, 0x0300, 0x0000, 0x0000, 0x0000, /* \ */
|
||||||
|
0x1E00, 0x1E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x1E00, 0x1E00, // ]
|
||||||
|
0x0000, 0x0C00, 0x0C00, 0x1E00, 0x1200, 0x3300, 0x3300, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ^
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFE0, 0x0000, // _
|
||||||
|
0x0000, 0x3800, 0x1800, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // `
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x3F80, 0x6180, 0x0180, 0x1F80, 0x3F80, 0x6180, 0x6380, 0x7F80, 0x38C0, 0x0000, 0x0000, 0x0000, // a
|
||||||
|
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x0000, 0x0000, 0x0000, // b
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6000, 0x6000, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // c
|
||||||
|
0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0000, 0x0000, 0x0000, // d
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x7F80, 0x7F80, 0x6000, 0x7180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // e
|
||||||
|
0x0000, 0x07C0, 0x0FC0, 0x0C00, 0x0C00, 0x7F80, 0x7F80, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // f
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6380, 0x7F00, 0x3E00, // g
|
||||||
|
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // h
|
||||||
|
0x0000, 0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // i
|
||||||
|
0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x4600, 0x7E00, 0x3C00, // j
|
||||||
|
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x6300, 0x6600, 0x6C00, 0x7C00, 0x7600, 0x6300, 0x6300, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // k
|
||||||
|
0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // l
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xFFC0, 0xCEC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0x0000, 0x0000, 0x0000, // m
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // n
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // o
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x6000, 0x6000, 0x6000, 0x6000, // p
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x0180, 0x0180, 0x0180, // q
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6700, 0x3F80, 0x3900, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000, 0x0000, // r
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F80, 0x6180, 0x6000, 0x7F00, 0x3F80, 0x0180, 0x6180, 0x7F00, 0x1E00, 0x0000, 0x0000, 0x0000, // s
|
||||||
|
0x0000, 0x0000, 0x0800, 0x1800, 0x1800, 0x7F00, 0x7F00, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1F80, 0x0F80, 0x0000, 0x0000, 0x0000, // t
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F80, 0x3D80, 0x0000, 0x0000, 0x0000, // u
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0600, 0x0000, 0x0000, 0x0000, // v
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xDD80, 0xDD80, 0x5500, 0x5500, 0x5500, 0x7700, 0x7700, 0x2200, 0x2200, 0x0000, 0x0000, 0x0000, // w
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x3300, 0x3300, 0x6180, 0x0000, 0x0000, 0x0000, // x
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x3180, 0x3300, 0x3300, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x1C00, 0x7C00, 0x7000, // y
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FC0, 0x7FC0, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x7FC0, 0x7FC0, 0x0000, 0x0000, 0x0000, // z
|
||||||
|
0x0380, 0x0780, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0E00, 0x1C00, 0x1C00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0780, 0x0380, // {
|
||||||
|
0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, // |
|
||||||
|
0x3800, 0x3C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0E00, 0x0700, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3C00, 0x3800, // }
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3880, 0x7F80, 0x4700, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ~
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t Font16x26 [] = {
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [ ]
|
||||||
|
0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x03C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [!]
|
||||||
|
0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = ["]
|
||||||
|
0x01CE,0x03CE,0x03DE,0x039E,0x039C,0x079C,0x3FFF,0x7FFF,0x0738,0x0F38,0x0F78,0x0F78,0x0E78,0xFFFF,0xFFFF,0x1EF0,0x1CF0,0x1CE0,0x3CE0,0x3DE0,0x39E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [#]
|
||||||
|
0x03FC,0x0FFE,0x1FEE,0x1EE0,0x1EE0,0x1EE0,0x1EE0,0x1FE0,0x0FE0,0x07E0,0x03F0,0x01FC,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x3DFE,0x3FFC,0x0FF0,0x01E0,0x01E0,0x0000,0x0000,0x0000, // Ascii = [$]
|
||||||
|
0x3E03,0xF707,0xE78F,0xE78E,0xE39E,0xE3BC,0xE7B8,0xE7F8,0xF7F0,0x3FE0,0x01C0,0x03FF,0x07FF,0x07F3,0x0FF3,0x1EF3,0x3CF3,0x38F3,0x78F3,0xF07F,0xE03F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [%]
|
||||||
|
0x07E0,0x0FF8,0x0F78,0x1F78,0x1F78,0x1F78,0x0F78,0x0FF0,0x0FE0,0x1F80,0x7FC3,0xFBC3,0xF3E7,0xF1F7,0xF0F7,0xF0FF,0xF07F,0xF83E,0x7C7F,0x3FFF,0x1FEF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [&]
|
||||||
|
0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [']
|
||||||
|
0x003F,0x007C,0x01F0,0x01E0,0x03C0,0x07C0,0x0780,0x0780,0x0F80,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F80,0x0780,0x0780,0x07C0,0x03C0,0x01E0,0x01F0,0x007C,0x003F,0x000F,0x0000, // Ascii = [(]
|
||||||
|
0x7E00,0x1F00,0x07C0,0x03C0,0x01E0,0x01F0,0x00F0,0x00F0,0x00F8,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x00F8,0x00F0,0x00F0,0x01F0,0x01E0,0x03C0,0x07C0,0x1F00,0x7E00,0x7800,0x0000, // Ascii = [)]
|
||||||
|
0x03E0,0x03C0,0x01C0,0x39CE,0x3FFF,0x3F7F,0x0320,0x0370,0x07F8,0x0F78,0x1F3C,0x0638,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [*]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0xFFFF,0xFFFF,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [+]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x01C0,0x0380, // Ascii = [,]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [-]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [.]
|
||||||
|
0x000F,0x000F,0x001E,0x001E,0x003C,0x003C,0x0078,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0780,0x0F00,0x0F00,0x1E00,0x1E00,0x3C00,0x3C00,0x7800,0x7800,0xF000,0x0000, // Ascii = [/]
|
||||||
|
0x07F0,0x0FF8,0x1F7C,0x3E3E,0x3C1E,0x7C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x7C1F,0x3C1E,0x3E3E,0x1F7C,0x0FF8,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [0]
|
||||||
|
0x00F0,0x07F0,0x3FF0,0x3FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [1]
|
||||||
|
0x0FE0,0x3FF8,0x3C7C,0x003C,0x003E,0x003E,0x003E,0x003C,0x003C,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0780,0x0F00,0x1E00,0x3E00,0x3C00,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [2]
|
||||||
|
0x0FF0,0x1FF8,0x1C7C,0x003E,0x003E,0x003E,0x003C,0x003C,0x00F8,0x0FF0,0x0FF8,0x007C,0x003E,0x001E,0x001E,0x001E,0x001E,0x003E,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [3]
|
||||||
|
0x0078,0x00F8,0x00F8,0x01F8,0x03F8,0x07F8,0x07F8,0x0F78,0x1E78,0x1E78,0x3C78,0x7878,0x7878,0xFFFF,0xFFFF,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [4]
|
||||||
|
0x1FFC,0x1FFC,0x1FFC,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FE0,0x1FF8,0x00FC,0x007C,0x003E,0x003E,0x001E,0x003E,0x003E,0x003C,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [5]
|
||||||
|
0x01FC,0x07FE,0x0F8E,0x1F00,0x1E00,0x3E00,0x3C00,0x3C00,0x3DF8,0x3FFC,0x7F3E,0x7E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3E0F,0x1E1F,0x1F3E,0x0FFC,0x03F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [6]
|
||||||
|
0x3FFF,0x3FFF,0x3FFF,0x000F,0x001E,0x001E,0x003C,0x0038,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0F80,0x0F80,0x0F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [7]
|
||||||
|
0x07F8,0x0FFC,0x1F3E,0x1E1E,0x3E1E,0x3E1E,0x1E1E,0x1F3C,0x0FF8,0x07F0,0x0FF8,0x1EFC,0x3E3E,0x3C1F,0x7C1F,0x7C0F,0x7C0F,0x3C1F,0x3F3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [8]
|
||||||
|
0x07F0,0x0FF8,0x1E7C,0x3C3E,0x3C1E,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x3C1F,0x3E3F,0x1FFF,0x07EF,0x001F,0x001E,0x001E,0x003E,0x003C,0x38F8,0x3FF0,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [9]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [:]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x03C0,0x0380, // Ascii = [;]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000F,0x003F,0x00FC,0x03F0,0x0FC0,0x3F00,0xFE00,0x3F00,0x0FC0,0x03F0,0x00FC,0x003F,0x000F,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [<]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [=]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xE000,0xF800,0x7E00,0x1F80,0x07E0,0x01F8,0x007E,0x001F,0x007E,0x01F8,0x07E0,0x1F80,0x7E00,0xF800,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [>]
|
||||||
|
0x1FF0,0x3FFC,0x383E,0x381F,0x381F,0x001E,0x001E,0x003C,0x0078,0x00F0,0x01E0,0x03C0,0x03C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [?]
|
||||||
|
0x03F8,0x0FFE,0x1F1E,0x3E0F,0x3C7F,0x78FF,0x79EF,0x73C7,0xF3C7,0xF38F,0xF38F,0xF38F,0xF39F,0xF39F,0x73FF,0x7BFF,0x79F7,0x3C00,0x1F1C,0x0FFC,0x03F8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [@]
|
||||||
|
0x0000,0x0000,0x0000,0x03E0,0x03E0,0x07F0,0x07F0,0x07F0,0x0F78,0x0F78,0x0E7C,0x1E3C,0x1E3C,0x3C3E,0x3FFE,0x3FFF,0x781F,0x780F,0xF00F,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [A]
|
||||||
|
0x0000,0x0000,0x0000,0x3FF8,0x3FFC,0x3C3E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7C,0x3FF0,0x3FF8,0x3C7E,0x3C1F,0x3C1F,0x3C0F,0x3C0F,0x3C1F,0x3FFE,0x3FF8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [B]
|
||||||
|
0x0000,0x0000,0x0000,0x01FF,0x07FF,0x1F87,0x3E00,0x3C00,0x7C00,0x7800,0x7800,0x7800,0x7800,0x7800,0x7C00,0x7C00,0x3E00,0x3F00,0x1F83,0x07FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [C]
|
||||||
|
0x0000,0x0000,0x0000,0x7FF0,0x7FFC,0x787E,0x781F,0x781F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x781F,0x781E,0x787E,0x7FF8,0x7FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [D]
|
||||||
|
0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFE,0x3FFE,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [E]
|
||||||
|
0x0000,0x0000,0x0000,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [F]
|
||||||
|
0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x7C00,0x7C00,0x7800,0xF800,0xF800,0xF87F,0xF87F,0x780F,0x7C0F,0x7C0F,0x3E0F,0x1F8F,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [G]
|
||||||
|
0x0000,0x0000,0x0000,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7FFF,0x7FFF,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [H]
|
||||||
|
0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [I]
|
||||||
|
0x0000,0x0000,0x0000,0x1FFC,0x1FFC,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x0078,0x0078,0x38F8,0x3FF0,0x3FC0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [J]
|
||||||
|
0x0000,0x0000,0x0000,0x3C1F,0x3C1E,0x3C3C,0x3C78,0x3CF0,0x3DE0,0x3FE0,0x3FC0,0x3F80,0x3FC0,0x3FE0,0x3DF0,0x3CF0,0x3C78,0x3C7C,0x3C3E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [K]
|
||||||
|
0x0000,0x0000,0x0000,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [L]
|
||||||
|
0x0000,0x0000,0x0000,0xF81F,0xFC1F,0xFC1F,0xFE3F,0xFE3F,0xFE3F,0xFF7F,0xFF77,0xFF77,0xF7F7,0xF7E7,0xF3E7,0xF3E7,0xF3C7,0xF007,0xF007,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [M]
|
||||||
|
0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7E0F,0x7F0F,0x7F0F,0x7F8F,0x7F8F,0x7FCF,0x7BEF,0x79EF,0x79FF,0x78FF,0x78FF,0x787F,0x783F,0x783F,0x781F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [N]
|
||||||
|
0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [O]
|
||||||
|
0x0000,0x0000,0x0000,0x3FFC,0x3FFF,0x3E1F,0x3E0F,0x3E0F,0x3E0F,0x3E0F,0x3E1F,0x3E3F,0x3FFC,0x3FF0,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [P]
|
||||||
|
0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F8,0x007C,0x003F,0x000F,0x0003,0x0000, // Ascii = [Q]
|
||||||
|
0x0000,0x0000,0x0000,0x3FF0,0x3FFC,0x3C7E,0x3C3E,0x3C1E,0x3C1E,0x3C3E,0x3C3C,0x3CFC,0x3FF0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [R]
|
||||||
|
0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x3E0E,0x3C00,0x3C00,0x3C00,0x3E00,0x1FC0,0x0FF8,0x03FE,0x007F,0x001F,0x000F,0x000F,0x201F,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [S]
|
||||||
|
0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [T]
|
||||||
|
0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x3C1E,0x3C1E,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [U]
|
||||||
|
0x0000,0x0000,0x0000,0xF007,0xF007,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1F3C,0x1F78,0x0F78,0x0FF8,0x07F0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [V]
|
||||||
|
0x0000,0x0000,0x0000,0xE003,0xF003,0xF003,0xF007,0xF3E7,0xF3E7,0xF3E7,0x73E7,0x7BF7,0x7FF7,0x7FFF,0x7F7F,0x7F7F,0x7F7E,0x3F7E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [W]
|
||||||
|
0x0000,0x0000,0x0000,0xF807,0x7C0F,0x3E1E,0x3E3E,0x1F3C,0x0FF8,0x07F0,0x07E0,0x03E0,0x03E0,0x07F0,0x0FF8,0x0F7C,0x1E7C,0x3C3E,0x781F,0x780F,0xF00F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [X]
|
||||||
|
0x0000,0x0000,0x0000,0xF807,0x7807,0x7C0F,0x3C1E,0x3E1E,0x1F3C,0x0F78,0x0FF8,0x07F0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Y]
|
||||||
|
0x0000,0x0000,0x0000,0x7FFF,0x7FFF,0x000F,0x001F,0x003E,0x007C,0x00F8,0x00F0,0x01E0,0x03E0,0x07C0,0x0F80,0x0F00,0x1E00,0x3E00,0x7C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Z]
|
||||||
|
0x07FF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07FF,0x07FF,0x0000, // Ascii = [[]
|
||||||
|
0x7800,0x7800,0x3C00,0x3C00,0x1E00,0x1E00,0x0F00,0x0F00,0x0780,0x0780,0x03C0,0x03C0,0x01E0,0x01E0,0x00F0,0x00F0,0x0078,0x0078,0x003C,0x003C,0x001E,0x001E,0x000F,0x000F,0x0007,0x0000, // Ascii = [\]
|
||||||
|
0x7FF0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x7FF0,0x7FF0,0x0000, // Ascii = []]
|
||||||
|
0x00C0,0x01C0,0x01C0,0x03E0,0x03E0,0x07F0,0x07F0,0x0778,0x0F78,0x0F38,0x1E3C,0x1E3C,0x3C1E,0x3C1E,0x380F,0x780F,0x7807,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [^]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000, // Ascii = [_]
|
||||||
|
0x00F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [`]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x3FFC,0x3C7C,0x003E,0x003E,0x003E,0x07FE,0x1FFE,0x3E3E,0x7C3E,0x783E,0x7C3E,0x7C7E,0x3FFF,0x1FCF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [a]
|
||||||
|
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3C1E,0x3F3E,0x3FFC,0x3BF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [b]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x3E00,0x3C00,0x7C00,0x7C00,0x7C00,0x3C00,0x3E00,0x3E00,0x1F87,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [c]
|
||||||
|
0x001F,0x001F,0x001F,0x001F,0x001F,0x001F,0x07FF,0x1FFF,0x3E3F,0x3C1F,0x7C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [d]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03F8,0x0FFC,0x1F3E,0x3E1E,0x3C1F,0x7C1F,0x7FFF,0x7FFF,0x7C00,0x7C00,0x3C00,0x3E00,0x1F07,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [e]
|
||||||
|
0x01FF,0x03E1,0x03C0,0x07C0,0x07C0,0x07C0,0x7FFF,0x7FFF,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [f]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EF,0x1FFF,0x3E7F,0x3C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x001E,0x001E,0x001E,0x387C,0x3FF8, // Ascii = [g]
|
||||||
|
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [h]
|
||||||
|
0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x7FE0,0x7FE0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [i]
|
||||||
|
0x00F8,0x00F8,0x0000,0x0000,0x0000,0x0000,0x3FF8,0x3FF8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F0,0x71F0,0x7FE0, // Ascii = [j]
|
||||||
|
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C1F,0x3C3E,0x3C7C,0x3CF8,0x3DF0,0x3DE0,0x3FC0,0x3FC0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [k]
|
||||||
|
0x7FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [l]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFBE7,0xF9E7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [m]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [n]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x3C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x3C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [o]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3E1E,0x3F3E,0x3FFC,0x3FF8,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00, // Ascii = [p]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EE,0x1FFE,0x3E7E,0x3C1E,0x7C1E,0x781E,0x781E,0x781E,0x781E,0x781E,0x7C1E,0x7C3E,0x3E7E,0x1FFE,0x0FDE,0x001E,0x001E,0x001E,0x001E,0x001E, // Ascii = [q]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F7F,0x1FFF,0x1FE7,0x1FC7,0x1F87,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [r]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x1E0E,0x3E00,0x3E00,0x3F00,0x1FE0,0x07FC,0x00FE,0x003E,0x001E,0x001E,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [s]
|
||||||
|
0x0000,0x0000,0x0000,0x0780,0x0780,0x0780,0x7FFF,0x7FFF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07C0,0x03FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [t]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7E,0x3EFE,0x1FFE,0x0FDE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [u]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF007,0x780F,0x780F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1E3C,0x0F78,0x0F78,0x0FF0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [v]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF003,0xF1E3,0xF3E3,0xF3E7,0xF3F7,0xF3F7,0x7FF7,0x7F77,0x7F7F,0x7F7F,0x7F7F,0x3E3E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [w]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C0F,0x3E1E,0x3E3C,0x1F3C,0x0FF8,0x07F0,0x07F0,0x03E0,0x07F0,0x07F8,0x0FF8,0x1E7C,0x3E3E,0x3C1F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [x]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x1E3C,0x1E3C,0x1F3C,0x0F78,0x0FF8,0x07F0,0x07F0,0x03E0,0x03E0,0x03C0,0x03C0,0x03C0,0x0780,0x0F80,0x7F00, // Ascii = [y]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x001F,0x003E,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0F80,0x1F00,0x1E00,0x3C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [z]
|
||||||
|
0x01FE,0x03E0,0x03C0,0x03C0,0x03C0,0x03C0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x3F80,0x3F80,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x03C0,0x03C0,0x03C0,0x03C0,0x03E0,0x01FE,0x007E,0x0000, // Ascii = [{]
|
||||||
|
0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000, // Ascii = [|]
|
||||||
|
0x3FC0,0x03E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x00FE,0x00FE,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x01E0,0x03E0,0x3FC0,0x3F00,0x0000, // Ascii = [}]
|
||||||
|
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3F07,0x7FC7,0x73E7,0xF1FF,0xF07E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [~]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
FontDef_t Font_7x10 = {
|
||||||
|
7,
|
||||||
|
10,
|
||||||
|
Font7x10
|
||||||
|
};
|
||||||
|
|
||||||
|
FontDef_t Font_11x18 = {
|
||||||
|
11,
|
||||||
|
18,
|
||||||
|
Font11x18
|
||||||
|
};
|
||||||
|
|
||||||
|
FontDef_t Font_16x26 = {
|
||||||
|
16,
|
||||||
|
26,
|
||||||
|
Font16x26
|
||||||
|
};
|
||||||
|
|
||||||
|
char* FONTS_GetStringSize(char* str, FONTS_SIZE_t* SizeStruct, FontDef_t* Font) {
|
||||||
|
/* Fill settings */
|
||||||
|
SizeStruct->Height = Font->FontHeight;
|
||||||
|
SizeStruct->Length = Font->FontWidth * strlen(str);
|
||||||
|
|
||||||
|
/* Return pointer */
|
||||||
|
return str;
|
||||||
|
}
|
132
RTLGDB/Project/SSD1306/fonts.h
Normal file
132
RTLGDB/Project/SSD1306/fonts.h
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
/**
|
||||||
|
* original author: Tilen Majerle<tilen@majerle.eu>
|
||||||
|
* modification for STM32f10x: Alexander Lutsai<s.lyra@ya.ru>
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Copyright (C) Alexander Lutsai, 2016
|
||||||
|
Copyright (C) Tilen Majerle, 2015
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#ifndef FONTS_H
|
||||||
|
#define FONTS_H 120
|
||||||
|
|
||||||
|
/* C++ detection */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern C {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Default fonts library. It is used in all LCD based libraries.
|
||||||
|
*
|
||||||
|
* \par Supported fonts
|
||||||
|
*
|
||||||
|
* Currently, these fonts are supported:
|
||||||
|
* - 7 x 10 pixels
|
||||||
|
* - 11 x 18 pixels
|
||||||
|
* - 16 x 26 pixels
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include "device.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup LIB_Typedefs
|
||||||
|
* @brief Library Typedefs
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Font structure used on my LCD libraries
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint8_t FontWidth; /*!< Font width in pixels */
|
||||||
|
uint8_t FontHeight; /*!< Font height in pixels */
|
||||||
|
const uint16_t *data; /*!< Pointer to data font data array */
|
||||||
|
} FontDef_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief String length and height
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint16_t Length; /*!< String length in units of pixels */
|
||||||
|
uint16_t Height; /*!< String height in units of pixels */
|
||||||
|
} FONTS_SIZE_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup FONTS_FontVariables
|
||||||
|
* @brief Library font variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 7 x 10 pixels font size structure
|
||||||
|
*/
|
||||||
|
extern FontDef_t Font_7x10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 11 x 18 pixels font size structure
|
||||||
|
*/
|
||||||
|
extern FontDef_t Font_11x18;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16 x 26 pixels font size structure
|
||||||
|
*/
|
||||||
|
extern FontDef_t Font_16x26;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup FONTS_Functions
|
||||||
|
* @brief Library functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calculates string length and height in units of pixels depending on string and font used
|
||||||
|
* @param *str: String to be checked for length and height
|
||||||
|
* @param *SizeStruct: Pointer to empty @ref FONTS_SIZE_t structure where informations will be saved
|
||||||
|
* @param *Font: Pointer to @ref FontDef_t font used for calculations
|
||||||
|
* @retval Pointer to string used for length and height
|
||||||
|
*/
|
||||||
|
char* FONTS_GetStringSize(char* str, FONTS_SIZE_t* SizeStruct, FontDef_t* Font);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* C++ detection */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
354
RTLGDB/Project/WS2812/WS2812.c
Normal file
354
RTLGDB/Project/WS2812/WS2812.c
Normal file
|
@ -0,0 +1,354 @@
|
||||||
|
#include "WS2812.h"
|
||||||
|
|
||||||
|
/* Quick and dirty, we use one big DMA buffer for the whole strip length.
|
||||||
|
* TODO: use smaller DMA buffer and fill in bit patterns on the fly */
|
||||||
|
uint8_t dma_buffer[WS2812_DMABUF_LEN(WS2812_LEDS_MAX)];
|
||||||
|
|
||||||
|
/* scale uint8 value from range 2-255 to range 0-scale */
|
||||||
|
static inline uint8_t WS2812_Scale(uint8_t value, uint8_t scale)
|
||||||
|
{
|
||||||
|
uint32_t tmp;
|
||||||
|
|
||||||
|
tmp = value * scale;
|
||||||
|
tmp /= 256;
|
||||||
|
|
||||||
|
return (uint8_t)tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// wake up waiting tasks when DMA transfer is complete
|
||||||
|
static void master_tr_done_callback(void *pdata, SpiIrq event)
|
||||||
|
{
|
||||||
|
BaseType_t task_woken, result;
|
||||||
|
WS2812_t *cfg;
|
||||||
|
|
||||||
|
task_woken = pdFALSE;
|
||||||
|
cfg = (WS2812_t *) pdata;
|
||||||
|
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case SpiRxIrq:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SpiTxIrq:
|
||||||
|
result = xEventGroupSetBitsFromISR(cfg->events, BIT_DONE, &task_woken);
|
||||||
|
if(result == pdPASS)
|
||||||
|
{
|
||||||
|
portYIELD_FROM_ISR(task_woken);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DBG_8195A("WS2812: Unknown SPI irq event!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WS2812_HSV2RGB(WS2812_HSV_t *hsv, WS2812_RGB_t *rgb)
|
||||||
|
{
|
||||||
|
//uint8_t r, g, b;
|
||||||
|
uint8_t hue, sat, val;
|
||||||
|
uint8_t base, sector, offset;
|
||||||
|
uint8_t rise, fall;
|
||||||
|
|
||||||
|
// scale hue to range 0- 3*64. Makes subsequent calculations easier
|
||||||
|
hue = WS2812_Scale(hsv->HUE, 192);
|
||||||
|
sat = hsv->Sat;
|
||||||
|
val = hsv->Value;
|
||||||
|
|
||||||
|
sector = hue / 64;
|
||||||
|
offset = hue % 64;
|
||||||
|
|
||||||
|
// get common white base level and remaining colour amplitude
|
||||||
|
base = 255 - sat;
|
||||||
|
|
||||||
|
rise = (offset * sat * 4) / 256;
|
||||||
|
fall = 255 - base - rise;
|
||||||
|
|
||||||
|
rise = (rise * val) / 256;
|
||||||
|
fall = (fall * val) / 256;
|
||||||
|
base = (base * val) / 256;
|
||||||
|
|
||||||
|
rgb->R = base;
|
||||||
|
rgb->G = base;
|
||||||
|
rgb->B = base;
|
||||||
|
|
||||||
|
switch (sector)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
rgb->R += fall;
|
||||||
|
rgb->G += rise;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rgb->G += fall;
|
||||||
|
rgb->B += rise;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rgb->R += rise;
|
||||||
|
rgb->B += fall;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert a RGB byte into SPI data stream with 2 bits per byte
|
||||||
|
static uint8_t *WS2812_RGB2PWM(uint8_t *dst, const uint8_t colour)
|
||||||
|
{
|
||||||
|
uint32_t cnt, data = colour;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < 4; ++cnt)
|
||||||
|
{
|
||||||
|
switch (data & 0xC0)
|
||||||
|
{
|
||||||
|
case 0x00:
|
||||||
|
*dst = WS2812_BITS_00;
|
||||||
|
break;
|
||||||
|
case 0x40:
|
||||||
|
*dst = WS2812_BITS_01;
|
||||||
|
break;
|
||||||
|
case 0x80:
|
||||||
|
*dst = WS2812_BITS_10;
|
||||||
|
break;
|
||||||
|
case 0xC0:
|
||||||
|
*dst = WS2812_BITS_11;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dst++;
|
||||||
|
data <<= 2;
|
||||||
|
}
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t WS2812_TX(WS2812_t *cfg, uint16_t delay)
|
||||||
|
{
|
||||||
|
int32_t result;
|
||||||
|
EventBits_t rcvd_events;
|
||||||
|
TickType_t timeout;
|
||||||
|
BaseType_t status;
|
||||||
|
|
||||||
|
// wait for any SPI transfer to finish
|
||||||
|
while(cfg->spi_master.state & SPI_STATE_TX_BUSY)
|
||||||
|
{
|
||||||
|
vTaskDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
// obey requested delay
|
||||||
|
if(delay > 0)
|
||||||
|
{
|
||||||
|
vTaskDelay(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lock the DMA buffer mutex while it is transferred
|
||||||
|
status = xSemaphoreTake(cfg->mutex, configTICK_RATE_HZ);
|
||||||
|
if(status != pdTRUE)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Timeout waiting for config mutex.\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cfg->dma_buff == NULL || cfg->buff_len == 0)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] DMA buffer invalid\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
xEventGroupClearBits(cfg->events, BIT_DONE);
|
||||||
|
spi_master_write_stream_dma(&cfg->spi_master, (char *)(cfg->dma_buff[0]), cfg->buff_len);
|
||||||
|
|
||||||
|
timeout = 1000 / portTICK_PERIOD_MS;
|
||||||
|
rcvd_events = xEventGroupWaitBits(
|
||||||
|
cfg->events,
|
||||||
|
BIT_DONE, // wait for DMA TX done
|
||||||
|
pdTRUE, // clear event bit
|
||||||
|
pdFALSE, // do not wait for all bits to be set
|
||||||
|
timeout );
|
||||||
|
|
||||||
|
if(!(rcvd_events & BIT_DONE))
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] DMA timeout\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
xSemaphoreGive(cfg->mutex);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t WS2812_Update(WS2812_t *cfg, WS2812_HSV_t hsv_values[], uint32_t strip_len, uint16_t delay)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
uint8_t *bufp;
|
||||||
|
uint16_t len;
|
||||||
|
BaseType_t status;
|
||||||
|
int32_t result;
|
||||||
|
WS2812_RGB_t rgb;
|
||||||
|
|
||||||
|
// make sure DMA buffer is not in use
|
||||||
|
while(cfg->spi_master.state & SPI_STATE_TX_BUSY)
|
||||||
|
{
|
||||||
|
vTaskDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lock the DMA buffer mutex while we fill it
|
||||||
|
status = xSemaphoreTake(cfg->mutex, configTICK_RATE_HZ);
|
||||||
|
if(status != pdTRUE)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Timeout waiting for config mutex.\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufp = &(cfg->dma_buff[0]);
|
||||||
|
|
||||||
|
// make sure that we do not exceed the buffer
|
||||||
|
len = min(strip_len, cfg->strip_len);
|
||||||
|
|
||||||
|
// copy pixel data into DMA buffer
|
||||||
|
for(i = 0; i < len; ++i) // ++i ??
|
||||||
|
{
|
||||||
|
WS2812_HSV2RGB(&hsv_values[i], &rgb);
|
||||||
|
bufp = WS2812_RGB2PWM(bufp, rgb.G);
|
||||||
|
bufp = WS2812_RGB2PWM(bufp, rgb.R);
|
||||||
|
bufp = WS2812_RGB2PWM(bufp, rgb.B);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* turn unused pixels at end of strip off */
|
||||||
|
if(cfg->strip_len > len)
|
||||||
|
{
|
||||||
|
memset(bufp, WS2812_BITS_00, cfg->strip_len - len);
|
||||||
|
bufp += cfg->strip_len - len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add reset pulse */
|
||||||
|
memset(bufp, 0x0, WS2812_RESET_LEN);
|
||||||
|
|
||||||
|
/* release buffer mutex */
|
||||||
|
xSemaphoreGive(cfg->mutex);
|
||||||
|
|
||||||
|
/* send it off to the strip */
|
||||||
|
result = WS2812_TX(cfg, delay);
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
WS2812_t *WS2812_Init(uint16_t strip_len)
|
||||||
|
{
|
||||||
|
int32_t result;
|
||||||
|
WS2812_t *cfg;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
cfg = malloc(sizeof(*cfg));
|
||||||
|
if(cfg == NULL)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] malloc for cfg failed\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(cfg, 0x0, sizeof(*cfg));
|
||||||
|
|
||||||
|
cfg->mutex = xSemaphoreCreateMutex();
|
||||||
|
if(cfg->mutex == NULL)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Mutex creation failed\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg->events = xEventGroupCreate();
|
||||||
|
if(cfg->events == NULL)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Creating event group failed\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
spi_init(&(cfg->spi_master), WS2812_SPI_MOSI, WS2812_SPI_MISO, WS2812_SPI_SCLK, WS2812_SPI_CS);
|
||||||
|
spi_format(&(cfg->spi_master), 8, 3, 0);
|
||||||
|
spi_frequency(&(cfg->spi_master), WS2812_SPI_FREQ);
|
||||||
|
spi_irq_hook(&(cfg->spi_master), master_tr_done_callback, (uint32_t)cfg);
|
||||||
|
|
||||||
|
result = WS2812_SetLen(cfg, strip_len);
|
||||||
|
if(result != 0)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] ws2812_set_len() failed\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
if(result != 0 && cfg != NULL)
|
||||||
|
{
|
||||||
|
if(cfg->mutex != NULL)
|
||||||
|
{
|
||||||
|
vQueueDelete(cfg->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cfg->events != NULL)
|
||||||
|
{
|
||||||
|
vEventGroupDelete(cfg->events);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cfg->dma_buff != NULL)
|
||||||
|
{
|
||||||
|
free(cfg->dma_buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(cfg);
|
||||||
|
cfg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t WS2812_SetLen(WS2812_t *cfg, uint16_t strip_len)
|
||||||
|
{
|
||||||
|
int32_t result;
|
||||||
|
BaseType_t status;
|
||||||
|
uint32_t reset_off;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
if(cfg == NULL)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] no config given\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lock the config mutex */
|
||||||
|
status = xSemaphoreTake(cfg->mutex, configTICK_RATE_HZ);
|
||||||
|
if(status != pdTRUE)
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Timeout waiting for config mutex.\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strip_len <= WS2812_LEDS_MAX)
|
||||||
|
{
|
||||||
|
/* TODO: use dynamically allocated buffer */
|
||||||
|
cfg->dma_buff = dma_buffer;
|
||||||
|
|
||||||
|
/* initialise LEDs to off and add reset pulse at end of strip */
|
||||||
|
reset_off = WS2812_DMABUF_LEN(strip_len) - WS2812_RESET_LEN;
|
||||||
|
memset(&(cfg->dma_buff[0]), WS2812_BITS_00, reset_off);
|
||||||
|
memset(&(cfg->dma_buff[reset_off]), 0x0, WS2812_RESET_LEN);
|
||||||
|
cfg->strip_len = strip_len;
|
||||||
|
cfg->buff_len = WS2812_DMABUF_LEN(strip_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("WS2812: [%s] Strip too long for DMA buffer\n", __func__);
|
||||||
|
result = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGive(cfg->mutex);
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
69
RTLGDB/Project/WS2812/WS2812.h
Normal file
69
RTLGDB/Project/WS2812/WS2812.h
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#ifndef _WS2812_H_
|
||||||
|
#define _WS2812_H_
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "event_groups.h"
|
||||||
|
#include <spi_api.h>
|
||||||
|
#include <spi_ex_api.h>
|
||||||
|
#include <autoconf.h>
|
||||||
|
#include <platform_stdlib.h>
|
||||||
|
#include "semphr.h"
|
||||||
|
#include "event_groups.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define WS2812_LEDS_MAX 500
|
||||||
|
#define WS2812_RESET_LEN (50 / 2)
|
||||||
|
#define WS2812_DMABUF_LEN(x) ((x) * 3 * 4 + WS2812_RESET_LEN)
|
||||||
|
|
||||||
|
#define WS2812_SPI_FREQ 3200000 // и делённое на 4 (4 бита SPI за 1 бит WS8212) = в итоге 800кГц
|
||||||
|
#define WS2812_SPI_MOSI PC_2 // SPI0
|
||||||
|
#define WS2812_SPI_MISO NC//PC_3
|
||||||
|
#define WS2812_SPI_SCLK NC//PC_1
|
||||||
|
#define WS2812_SPI_CS NC//PC_0
|
||||||
|
|
||||||
|
// Events to signal completion of DMA transfer
|
||||||
|
#define BIT_START (1 << 0)
|
||||||
|
#define BIT_DONE (1 << 1)
|
||||||
|
|
||||||
|
// посылается 2 бита протокола WS2812 за один байт SPI, один бит WS2812 за 4 бита SPI.
|
||||||
|
#define WS2812_BITS_00 0x88
|
||||||
|
#define WS2812_BITS_01 0x8e
|
||||||
|
#define WS2812_BITS_10 0xe8
|
||||||
|
#define WS2812_BITS_11 0xee
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t R;
|
||||||
|
uint8_t G;
|
||||||
|
uint8_t B;
|
||||||
|
} WS2812_RGB_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t HUE;
|
||||||
|
uint8_t Sat;
|
||||||
|
uint8_t Value;
|
||||||
|
} WS2812_HSV_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
spi_t spi_master;
|
||||||
|
EventGroupHandle_t *events;
|
||||||
|
SemaphoreHandle_t *mutex;
|
||||||
|
uint8_t *dma_buff;
|
||||||
|
size_t buff_len;
|
||||||
|
uint16_t strip_len;
|
||||||
|
} WS2812_t;
|
||||||
|
|
||||||
|
WS2812_t *WS2812_Init(uint16_t len);
|
||||||
|
int32_t WS2812_SetLen(WS2812_t *cfg, uint16_t len);
|
||||||
|
int32_t WS2812_DeInit(WS2812_t *cfg);
|
||||||
|
int32_t WS2812_Update(WS2812_t *cfg, WS2812_HSV_t hsv[], uint32_t len, uint16_t delay);
|
||||||
|
|
||||||
|
#define min(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define max(a,b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define scale_up(x) ((x) << 8)
|
||||||
|
#define scale_down(x) ((x) >> 8)
|
||||||
|
|
||||||
|
#endif // _WS2812_H_
|
234
RTLGDB/Project/adc_ws/adc_ws.c
Normal file
234
RTLGDB/Project/adc_ws/adc_ws.c
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
/*
|
||||||
|
* ADC + Websocket
|
||||||
|
*
|
||||||
|
* Created on: 18 июн. 2017 г.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
|
||||||
|
#include "basic_types.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "osdep_api.h"
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "diag.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
#include "objects.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
#include "hal_adc.h"
|
||||||
|
#include "analogin_api.h"
|
||||||
|
#include "timer_api.h"
|
||||||
|
|
||||||
|
#include "web_srv.h"
|
||||||
|
#include "websock.h"
|
||||||
|
#include "web_websocket.h"
|
||||||
|
#include "driver/adc_drv.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
//#define ADC_USE_TIMER TIMER3 // если назначено, то для чтения ADC используется таймер
|
||||||
|
// иначе ADC int
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CONFIG_MBED_ENABLED
|
||||||
|
extern void *pvPortZalloc(size_t xWantedSize);
|
||||||
|
extern void vPortFree(void *pv);
|
||||||
|
extern void *pvPortMalloc(size_t xWantedSize);
|
||||||
|
#undef malloc
|
||||||
|
#define malloc pvPortMalloc
|
||||||
|
#undef zalloc
|
||||||
|
#define zalloc pvPortZalloc
|
||||||
|
#undef free
|
||||||
|
#define free vPortFree
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
typedef union _adc_data
|
||||||
|
{
|
||||||
|
unsigned short us;
|
||||||
|
} ADC_DATA, *PADC_DATA;
|
||||||
|
|
||||||
|
typedef struct _adc_drv
|
||||||
|
{
|
||||||
|
signed char init; // флаг
|
||||||
|
unsigned char tmp;
|
||||||
|
|
||||||
|
unsigned short count; // счетчик считанных значений
|
||||||
|
unsigned short overrun; // счет переполнений буфера
|
||||||
|
|
||||||
|
unsigned short buf_idx; // объем буфера pbuf[buf_idx+1], максимальный индекс-номер замера
|
||||||
|
unsigned short buf_rx; // индекс-номер ещё не считанного замера
|
||||||
|
unsigned short buf_tx; // индекс-номер для записи следующего замера
|
||||||
|
PADC_DATA pbuf;
|
||||||
|
#ifdef ADC_USE_TIMER
|
||||||
|
gtimer_t timer;
|
||||||
|
#endif
|
||||||
|
} ADC_DRV, *PADC_DRV;
|
||||||
|
|
||||||
|
//#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
//#define mMAX(a, b) ((a>b)?a:b)
|
||||||
|
|
||||||
|
ADC_DRV adc_drv =
|
||||||
|
{
|
||||||
|
.buf_idx = (1460*2 - 80)/(sizeof(ADC_DATA)/2) // циклический буфер на ~1420 замеров (см. sizeof(ADC_DATA))
|
||||||
|
// Если шаг заполнения 1 ms -> буфер на 1.4 сек
|
||||||
|
// Оптимизация под TCP: (TCP_MSS*2 - 80)/2 = (1460*2 - 80)/2 = 1420
|
||||||
|
};
|
||||||
|
|
||||||
|
void adc_int_handler(void *par)
|
||||||
|
{
|
||||||
|
PADC_DRV p = par; // &adc_drv
|
||||||
|
if(p->pbuf)
|
||||||
|
{
|
||||||
|
#ifndef ADC_USE_TIMER
|
||||||
|
int i = 4;
|
||||||
|
while(i--)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
PADC_DATA pd = p->pbuf + p->buf_tx;
|
||||||
|
pd->us = HAL_ADC_READ32(REG_ADC_FIFO_READ); // 2 -> sample -> 24.4 kHz (if ADC irq!)
|
||||||
|
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 4 sample -> 12.2 kHz (if ADC irq!)
|
||||||
|
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 6 sample -> 8.133 kHz (if ADC irq!)
|
||||||
|
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 8 sample -> 6.1 kHz (if ADC irq!)
|
||||||
|
|
||||||
|
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
|
||||||
|
else p->buf_tx++;
|
||||||
|
if(p->buf_rx == p->buf_tx)
|
||||||
|
{
|
||||||
|
p->overrun++; // todo: if(p->overrun++ > 100000) deinit() ?
|
||||||
|
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
|
||||||
|
else p->buf_rx++;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Clear ADC Status
|
||||||
|
(void)HAL_ADC_READ32(REG_ADC_INTR_STS);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t adc_getdata(void *pd, uint16 cnt)
|
||||||
|
{
|
||||||
|
PADC_DRV p = &adc_drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
unsigned short *pus = (unsigned short *) pd;
|
||||||
|
taskDISABLE_INTERRUPTS();
|
||||||
|
uint16 buf_rx = p->buf_rx;
|
||||||
|
*pus++ = cnt; // кол-во замеров
|
||||||
|
*pus++ = p->count + p->overrun; // индекс замера для анализа пропусков на стороне приемника
|
||||||
|
// если не пропущено, то равен прошлому + кол-во считанных замеров в прошлом блоке
|
||||||
|
p->count += cnt; // p->overrun = 0;
|
||||||
|
unsigned char *puc = (unsigned char *) pus;
|
||||||
|
if(cnt)
|
||||||
|
{
|
||||||
|
uint16 lend = buf_rx + cnt;
|
||||||
|
if(lend > p->buf_idx)
|
||||||
|
{
|
||||||
|
lend -= p->buf_idx + 1;
|
||||||
|
p->buf_rx = lend;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->buf_rx = lend;
|
||||||
|
lend = 0;
|
||||||
|
};
|
||||||
|
size_t len = (cnt - lend) *sizeof(ADC_DATA);
|
||||||
|
if(len) memcpy(puc, (void *)(p->pbuf + buf_rx), len);
|
||||||
|
if(lend) memcpy(puc + len, (void *)p->pbuf, lend *sizeof(ADC_DATA));
|
||||||
|
}
|
||||||
|
taskENABLE_INTERRUPTS();
|
||||||
|
return cnt * sizeof(ADC_DATA) + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 adc_chkdata(uint16 cnt)
|
||||||
|
{
|
||||||
|
PADC_DRV p = &adc_drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
int len = p->buf_tx - p->buf_rx;
|
||||||
|
if(len < 0) len += p->buf_idx + 1;
|
||||||
|
if(cnt > (uint16)len) cnt = (uint16)len;
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
int adc_ws(TCP_SERV_CONN *ts_conn, char cmd)
|
||||||
|
{
|
||||||
|
PADC_DRV p = &adc_drv;
|
||||||
|
switch(cmd)
|
||||||
|
{
|
||||||
|
case 'd': // deinit
|
||||||
|
if(p->init > 0)
|
||||||
|
{
|
||||||
|
#ifdef ADC_USE_TIMER
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
ADCDisable();
|
||||||
|
#else
|
||||||
|
ADCDisable();
|
||||||
|
ADCIrqDeInit();
|
||||||
|
#endif
|
||||||
|
ADCDeInit();
|
||||||
|
if(p->pbuf)
|
||||||
|
{
|
||||||
|
free(p->pbuf);
|
||||||
|
p->pbuf = NULL;
|
||||||
|
}
|
||||||
|
p->init = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
case 'c': // get count
|
||||||
|
return adc_chkdata(p->buf_idx + 1);
|
||||||
|
case 'i': // init
|
||||||
|
return p->init;
|
||||||
|
default: // get_data
|
||||||
|
if(p->init <= 0)
|
||||||
|
{
|
||||||
|
p->count = 0;
|
||||||
|
p->overrun = 0;
|
||||||
|
// p->errs = 0;
|
||||||
|
if(!p->pbuf)
|
||||||
|
{
|
||||||
|
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(ADC_DATA));
|
||||||
|
if(!p->pbuf)
|
||||||
|
{
|
||||||
|
error_printf("Error create buffer!\n");
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
p->buf_tx = 0;
|
||||||
|
p->buf_rx = 0;
|
||||||
|
};
|
||||||
|
ADCInit(ADC2_SEL);
|
||||||
|
#ifdef ADC_USE_TIMER
|
||||||
|
// Initial a periodical timer
|
||||||
|
gtimer_init(&p->timer, ADC_USE_TIMER);
|
||||||
|
gtimer_start_periodical(&p->timer, 1000, (void*)adc_int_handler, (uint32_t)p);
|
||||||
|
rtl_printf("ADC Timer Period = %u us\n", &p->timer.hal_gtimer_adp.TimerLoadValueUs);
|
||||||
|
#else
|
||||||
|
ADCIrqInit(adc_int_handler,(uint32)p, BIT_ADC_FIFO_FULL_EN); // BIT_ADC_FIFO_RD_REQ_EN ?
|
||||||
|
#endif
|
||||||
|
ADCEnable();
|
||||||
|
p->init = 1;
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
case 'g': // get
|
||||||
|
{
|
||||||
|
uint32 i = adc_chkdata(p->buf_idx + 1);
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
i = mMIN((web_conn->msgbufsize / sizeof(ADC_DATA)), i);
|
||||||
|
if (websock_tx_frame(ts_conn, WS_OPCODE_BINARY | WS_FRAGMENT_FIN, web_conn->msgbuf, adc_getdata(web_conn->msgbuf, i)) != ERR_OK)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
7
RTLGDB/Project/build_info.h
Normal file
7
RTLGDB/Project/build_info.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#define UTS_VERSION "2017/11/28-22:25:03"
|
||||||
|
#define RTL8195AFW_COMPILE_TIME "2017/11/28-22:25:03"
|
||||||
|
#define RTL8195AFW_COMPILE_DATE "20171128"
|
||||||
|
#define RTL8195AFW_COMPILE_BY "Andrew"
|
||||||
|
#define RTL8195AFW_COMPILE_HOST ""
|
||||||
|
#define RTL8195AFW_COMPILE_DOMAIN
|
||||||
|
#define RTL195AFW_COMPILER "gcc 6.3.1"
|
291
RTLGDB/Project/console/adc_tst.c
Normal file
291
RTLGDB/Project/console/adc_tst.c
Normal file
|
@ -0,0 +1,291 @@
|
||||||
|
/*
|
||||||
|
* adc_tst.c
|
||||||
|
*
|
||||||
|
* Created on: 04/04/2017.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
#include "objects.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
#include "hal_adc.h"
|
||||||
|
#include "analogin_api.h"
|
||||||
|
#include "strproc.h"
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
analogin_t adc;
|
||||||
|
|
||||||
|
static void fATADI(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int count = 8;
|
||||||
|
int channel = 2;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
unsigned int ui[2];
|
||||||
|
unsigned short us[4];
|
||||||
|
} x;
|
||||||
|
|
||||||
|
uint16_t adcdat;
|
||||||
|
memset(&adc, 0, sizeof(adc));
|
||||||
|
|
||||||
|
|
||||||
|
// ConfigDebugErr |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
// ConfigDebugInfo |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
channel = atoi(argv[1]);
|
||||||
|
channel &= 0x03;
|
||||||
|
if(!channel) channel = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 2)
|
||||||
|
{
|
||||||
|
count = atoi(argv[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
analogin_init(&adc, (channel+1) | (PORT_V << 4));
|
||||||
|
|
||||||
|
PSAL_ADC_HND pSalADCHND = &((&(adc.SalADCMngtAdpt))->pSalHndPriv->SalADCHndPriv);
|
||||||
|
|
||||||
|
uint32_t sum = 0;
|
||||||
|
for (uint32_t i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
RtkADCReceiveBuf(pSalADCHND, &x.ui);
|
||||||
|
adcdat = x.us[channel];
|
||||||
|
if((i % 8) == 0 || (i == count))
|
||||||
|
{
|
||||||
|
printf("0x%04x\n", adcdat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("0x%04x, ", adcdat);
|
||||||
|
}
|
||||||
|
sum += adcdat;
|
||||||
|
}
|
||||||
|
analogin_deinit(&adc);
|
||||||
|
printf("ADC%d = 0x%04x\n", channel, sum / count);
|
||||||
|
// sys_adc_calibration(0, &channel, &count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fATADD(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int count = 64;
|
||||||
|
int channel = 2;
|
||||||
|
uint16_t adcdat;
|
||||||
|
memset(&adc, 0, sizeof(adc));
|
||||||
|
|
||||||
|
// ConfigDebugErr |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
// ConfigDebugInfo |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
channel = atoi(argv[1]);
|
||||||
|
channel &= 0x03;
|
||||||
|
if(!channel) channel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 2)
|
||||||
|
{
|
||||||
|
count = atoi(argv[2]);
|
||||||
|
if (count <= 2)
|
||||||
|
{
|
||||||
|
count = 64;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
analogin_init(&adc, (channel+1) | (PORT_V << 4));
|
||||||
|
SAL_ADC_TRANSFER_BUF trbuf;
|
||||||
|
trbuf.pDataBuf = zalloc(count*4);
|
||||||
|
if(trbuf.pDataBuf)
|
||||||
|
{
|
||||||
|
trbuf.DataLen = count/2; // x32 bit ?
|
||||||
|
trbuf.RSVD = 0;
|
||||||
|
adc.SalADCHndPriv.SalADCHndPriv.pRXBuf = &trbuf;
|
||||||
|
adc.SalADCHndPriv.SalADCHndPriv.OpType = ADC_DMA_TYPE;
|
||||||
|
|
||||||
|
adc.HalADCInitData.ADCEndian = ADC_DATA_ENDIAN_LITTLE; //ADC endian selection,
|
||||||
|
//but actually it's for 32-bit ADC data swap control
|
||||||
|
//1'b0: no swap,
|
||||||
|
//1'b1: swap the upper 16-bit and the lower 16-bit
|
||||||
|
// adc.HalADCInitData.ADCCompOnly = ADC_FEATURE_DISABLED; //ADC compare mode only enable (without FIFO enable)
|
||||||
|
// adc.HalADCInitData.ADCEnManul = ADC_FEATURE_ENABLED; // ADC_FEATURE_DISABLED; //ADC enable manually
|
||||||
|
// adc.HalADCInitData.ADCIdx = channel+1; //ADC index used (1..3 ?)
|
||||||
|
// adc.HalADCInitData.ADCBurstSz = 8; //ADC DMA operation threshold
|
||||||
|
// adc.HalADCInitData.ADCOneShotTD = 8; //ADC one shot mode threshold
|
||||||
|
// adc.HalADCInitData.ADCDataRate = 0; // 0xff; // ADC down sample data rate ??
|
||||||
|
adc.HalADCInitData.ADCAudioEn = ADC_FEATURE_ENABLED; //ADC audio mode enable // ADC_FEATURE_DISABLED
|
||||||
|
// adc.HalADCInitData.ADCOneShotEn = ADC_FEATURE_DISABLED; //ADC one shot mode threshold
|
||||||
|
adc.HalADCInitData.ADCInInput = ADC_FEATURE_ENABLED; //ADC Input is internal?
|
||||||
|
// adc.HalADCInitData.ADCEn = ADC_DISABLE; //ADC_ENABLE;
|
||||||
|
|
||||||
|
HalADCInit8195a(&adc.HalADCInitData);
|
||||||
|
/* Read Content */
|
||||||
|
HAL_ADC_READ32(REG_ADC_FIFO_READ);
|
||||||
|
HAL_ADC_READ32(REG_ADC_INTR_STS);
|
||||||
|
RtkADCReceive(&adc.SalADCHndPriv.SalADCHndPriv);
|
||||||
|
while(adc.SalADCHndPriv.SalADCHndPriv.DevSts != ADC_STS_IDLE);
|
||||||
|
uint16 * ptr = (uint16 *) trbuf.pDataBuf;
|
||||||
|
// RtkADCDMAInit(&adc.SalADCHndPriv.SalADCHndPriv);
|
||||||
|
for (uint32_t i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
if((i % 16) == 0 || (i == count))
|
||||||
|
{
|
||||||
|
printf("%04x\n", *ptr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%04x ", *ptr);
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
uint32_t sum = 0;
|
||||||
|
ptr = (uint16 *) trbuf.pDataBuf;
|
||||||
|
for (uint32_t i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
printf("%d\n", *ptr);
|
||||||
|
sum += *ptr;
|
||||||
|
ptr++;
|
||||||
|
if((i%512)==0) vTaskDelay(10);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
printf("OpType:\t\t%p\n", adc.SalADCHndPriv.SalADCHndPriv.OpType);
|
||||||
|
printf("pRXBuf:\t\t%p\n", adc.SalADCHndPriv.SalADCHndPriv.pRXBuf);
|
||||||
|
printf("pDataBuf:\t%p\n", adc.SalADCHndPriv.SalADCHndPriv.pRXBuf->pDataBuf);
|
||||||
|
printf("DataLen:\t%p\n", adc.SalADCHndPriv.SalADCHndPriv.pRXBuf->DataLen);
|
||||||
|
printf("ADCDataRate:\t%p\n", adc.HalADCInitData.ADCDataRate);
|
||||||
|
printf("ADCData:\t%p\n", adc.HalADCInitData.ADCData);
|
||||||
|
printf("ADCIdx:\t\t%p\n", adc.HalADCInitData.ADCIdx);
|
||||||
|
printf("ADCPWCtrl:\t%p\n", adc.HalADCInitData.ADCPWCtrl);
|
||||||
|
printf("ADCAnaParAd3:\t%p\n", adc.HalADCInitData.ADCAnaParAd3);
|
||||||
|
printf("ADC%d = 0x%04x\n", channel, analogin_read_u16(&adc));
|
||||||
|
printf("ADC%d = 0x%04x\n", channel, analogin_read_u16(&adc));
|
||||||
|
*/
|
||||||
|
analogin_deinit(&adc);
|
||||||
|
free(trbuf.pDataBuf);
|
||||||
|
printf("ADC%d = 0x%04x\n", channel, sum / count);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error_printf("%s: malloc failed!\n", __func__);
|
||||||
|
};
|
||||||
|
|
||||||
|
// sys_adc_calibration(0, &channel, &count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fATADC(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
int count = 8;
|
||||||
|
int channel = 2;
|
||||||
|
uint16_t adcdat;
|
||||||
|
memset(&adc, 0, sizeof(adc));
|
||||||
|
|
||||||
|
|
||||||
|
// ConfigDebugErr |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
// ConfigDebugInfo |= (_DBG_ADC_|_DBG_GDMA_);
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
channel = atoi(argv[1]);
|
||||||
|
channel &= 0x03;
|
||||||
|
if(!channel) channel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 2)
|
||||||
|
{
|
||||||
|
count = atoi(argv[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
analogin_init(&adc, (channel+1) | (PORT_V << 4));
|
||||||
|
|
||||||
|
uint32_t sum = 0;
|
||||||
|
for (uint32_t i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
adcdat = analogin_read_u16(&adc);
|
||||||
|
if((i % 8) == 0 || (i == count))
|
||||||
|
{
|
||||||
|
printf("0x%04x\n", adcdat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("0x%04x, ", adcdat);
|
||||||
|
}
|
||||||
|
sum += adcdat;
|
||||||
|
}
|
||||||
|
analogin_deinit(&adc);
|
||||||
|
printf("ADC%d = 0x%04x\n", channel, sum / count);
|
||||||
|
// sys_adc_calibration(0, &channel, &count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fATSA(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
// uint32_t tConfigDebugInfo = ConfigDebugInfo;
|
||||||
|
int channel;
|
||||||
|
char *ptmp;
|
||||||
|
uint16_t offset, gain, adcdat;
|
||||||
|
memset(&adc, 0, sizeof(adc));
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
{
|
||||||
|
printf("Usage: ATSA=CHANNEL(0~2)\n");
|
||||||
|
printf("Usage: ATSA=k_get\n");
|
||||||
|
printf("Usage: ATSA=k_set[offet(hex),gain(hex)]\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(argv[1], "k_get") == 0)
|
||||||
|
{
|
||||||
|
sys_adc_calibration(0, &offset, &gain);
|
||||||
|
// printf("[ATSA] offset = 0x%04X, gain = 0x%04X", offset, gain);
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[1], "k_set") == 0)
|
||||||
|
{
|
||||||
|
if (argc != 4)
|
||||||
|
{
|
||||||
|
printf("Usage: ATSA=k_set[offet(hex),gain(hex)]\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
offset = strtoul(argv[2], &ptmp, 16);
|
||||||
|
gain = strtoul(argv[3], &ptmp, 16);
|
||||||
|
sys_adc_calibration(1, &offset, &gain);
|
||||||
|
// printf("[ATSA] offset = 0x%04X, gain = 0x%04X", offset, gain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
channel = atoi(argv[1]);
|
||||||
|
if (channel < 0 || channel > 2)
|
||||||
|
{
|
||||||
|
printf("Usage: ATSA=CHANNEL(0~2)\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Remove debug info massage
|
||||||
|
// ConfigDebugInfo = 0;
|
||||||
|
if (channel == 0)
|
||||||
|
analogin_init(&adc, AD_1);
|
||||||
|
else if (channel == 1)
|
||||||
|
analogin_init(&adc, AD_2);
|
||||||
|
else
|
||||||
|
analogin_init(&adc, AD_3);
|
||||||
|
// analogin_read_u16(&adc);
|
||||||
|
adcdat = analogin_read_u16(&adc) >> 4;
|
||||||
|
analogin_deinit(&adc);
|
||||||
|
// Recover debug info massage
|
||||||
|
// ConfigDebugInfo = tConfigDebugInfo;
|
||||||
|
|
||||||
|
printf("A%d = 0x%04X\n", channel, adcdat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_adc[] =
|
||||||
|
{
|
||||||
|
{ "ATADC", 0, fATADC, ": ADC Test" },
|
||||||
|
{ "ATADD", 0, fATADD, ": ADC DMA Test" },
|
||||||
|
{ "ATADI", 0, fATADI, ": ADC Irq Test" },
|
||||||
|
{ "ATSA" , 0, fATSA , ": ADC at" }
|
||||||
|
};
|
390
RTLGDB/Project/console/atcmd_user.c
Normal file
390
RTLGDB/Project/console/atcmd_user.c
Normal file
|
@ -0,0 +1,390 @@
|
||||||
|
#include <platform_opts.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_AT_USR
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "semphr.h"
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
#include "at_cmd/log_service.h"
|
||||||
|
#include "at_cmd/atcmd_wifi.h"
|
||||||
|
#include <lwip_netconf.h>
|
||||||
|
#include "tcpip.h"
|
||||||
|
#include <dhcp/dhcps.h>
|
||||||
|
#include <wifi/wifi_conf.h>
|
||||||
|
#include <wifi/wifi_util.h>
|
||||||
|
#include "tcm_heap.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
#include "flash_api.h"
|
||||||
|
#include "sleep_ex_api.h"
|
||||||
|
|
||||||
|
#include "lwip/tcp_impl.h"
|
||||||
|
|
||||||
|
extern char str_rom_57ch3Dch0A[]; // "=========================================================\n" 57
|
||||||
|
|
||||||
|
#define printf rtl_printf // DiagPrintf
|
||||||
|
|
||||||
|
/* RAM/TCM/Heaps info */
|
||||||
|
extern void ShowMemInfo(void);
|
||||||
|
/*
|
||||||
|
void ShowMemInfo(void)
|
||||||
|
{
|
||||||
|
printf("\nCLK CPU\t\t%d Hz\nRAM heap\t%d bytes\nTCM heap\t%d bytes\n",
|
||||||
|
HalGetCpuClk(), xPortGetFreeHeapSize(), tcm_heap_freeSpace());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Mem, Tasks info
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void fATST(int argc, char *argv[]) {
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
ShowMemInfo();
|
||||||
|
#if CONFIG_DEBUG_LOG > 1
|
||||||
|
extern int min_free_heap_size;
|
||||||
|
printf("\nMin free heap size %d bytes\n", min_free_heap_size);
|
||||||
|
#endif
|
||||||
|
#if 0 //CONFIG_DEBUG_LOG > 1
|
||||||
|
dump_mem_block_list();
|
||||||
|
tcm_heap_dump();
|
||||||
|
#endif
|
||||||
|
printf("\n");
|
||||||
|
#if (configGENERATE_RUN_TIME_STATS == 1)
|
||||||
|
char *cBuffer = pvPortMalloc(512);
|
||||||
|
if(cBuffer != NULL) {
|
||||||
|
vTaskGetRunTimeStats((char *)cBuffer);
|
||||||
|
printf("%s", cBuffer);
|
||||||
|
}
|
||||||
|
vPortFree(cBuffer);
|
||||||
|
#endif
|
||||||
|
#if defined(configUSE_TRACE_FACILITY) && (configUSE_TRACE_FACILITY == 1) && (configUSE_STATS_FORMATTING_FUNCTIONS == 1)
|
||||||
|
{
|
||||||
|
char * pcWriteBuffer = malloc(1024);
|
||||||
|
if(pcWriteBuffer) {
|
||||||
|
vTaskList((char*)pcWriteBuffer);
|
||||||
|
printf("\nTask List:\n");
|
||||||
|
printf(&str_rom_57ch3Dch0A[7]); // "==========================================\n"
|
||||||
|
printf("Name\t Status Priority HighWaterMark TaskNumber\n%s\n", pcWriteBuffer);
|
||||||
|
free(pcWriteBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------------------------------------
|
||||||
|
Копирует данные из области align(4) (flash, registers, ...) в область align(1) (ram)
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
extern void copy_align4_to_align1(unsigned char * pd, void * ps, unsigned int len);
|
||||||
|
/*
|
||||||
|
static void copy_align4_to_align1(unsigned char * pd, void * ps, unsigned int len)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned int ud;
|
||||||
|
}tmp;
|
||||||
|
unsigned int *p = (unsigned int *)((unsigned int)ps & (~3));
|
||||||
|
unsigned int xlen = (unsigned int)ps & 3;
|
||||||
|
// unsigned int size = len;
|
||||||
|
|
||||||
|
if(xlen) {
|
||||||
|
tmp.ud = *p++;
|
||||||
|
while (len) {
|
||||||
|
len--;
|
||||||
|
*pd++ = tmp.uc[xlen++];
|
||||||
|
if(xlen & 4) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xlen = len >> 2;
|
||||||
|
while(xlen) {
|
||||||
|
tmp.ud = *p++;
|
||||||
|
*pd++ = tmp.uc[0];
|
||||||
|
*pd++ = tmp.uc[1];
|
||||||
|
*pd++ = tmp.uc[2];
|
||||||
|
*pd++ = tmp.uc[3];
|
||||||
|
xlen--;
|
||||||
|
}
|
||||||
|
if(len & 3) {
|
||||||
|
tmp.ud = *p;
|
||||||
|
pd[0] = tmp.uc[0];
|
||||||
|
if(len & 2) {
|
||||||
|
pd[1] = tmp.uc[1];
|
||||||
|
if(len & 1) {
|
||||||
|
pd[2] = tmp.uc[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return size;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* int print_hex_dump(uint8_t *buf, int len, unsigned char k)
|
||||||
|
*/
|
||||||
|
int print_hex_dump(uint8_t *buf, int len, unsigned char k) {
|
||||||
|
uint32_t ss[2];
|
||||||
|
ss[0] = 0x78323025; // "%02x"
|
||||||
|
ss[1] = k; // ","...'\0'
|
||||||
|
uint8_t * ptr = buf;
|
||||||
|
int result = 0;
|
||||||
|
while (len--) {
|
||||||
|
if (len == 0)
|
||||||
|
ss[1] = 0;
|
||||||
|
result += printf((uint8_t *) &ss, *ptr++);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern char str_rom_hex_addr[]; // in *.ld "[Addr] .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F\n"
|
||||||
|
void dump_bytes(uint32 addr, int size)
|
||||||
|
{
|
||||||
|
uint8 buf[17];
|
||||||
|
int symbs_line = sizeof(buf)-1;
|
||||||
|
printf(str_rom_hex_addr);
|
||||||
|
while (size) {
|
||||||
|
if (symbs_line > size) symbs_line = size;
|
||||||
|
printf("%08X ", addr);
|
||||||
|
copy_align4_to_align1(buf, (void *) addr, symbs_line);
|
||||||
|
print_hex_dump(buf, symbs_line, ' ');
|
||||||
|
int i;
|
||||||
|
for(i = 0 ; i < symbs_line ; i++) {
|
||||||
|
if(buf[i] < 0x20 || buf[i] > 0x7E) {
|
||||||
|
buf[i] = '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf[symbs_line] = 0;
|
||||||
|
i = (sizeof(buf)-1) - symbs_line;
|
||||||
|
while(i--) printf(" ");
|
||||||
|
printf(" %s\r\n", buf);
|
||||||
|
addr += symbs_line;
|
||||||
|
size -= symbs_line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Dump byte register
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
extern uint32_t Strtoul(
|
||||||
|
IN const uint8_t *nptr,
|
||||||
|
IN uint8_t **endptr,
|
||||||
|
IN uint32_t base
|
||||||
|
);
|
||||||
|
|
||||||
|
static void fATSB(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int size = 16;
|
||||||
|
uint32 addr = Strtoul(argv[1],0,16);
|
||||||
|
if (argc > 2) {
|
||||||
|
size = Strtoul(argv[2],0,10);
|
||||||
|
if (size <= 0 || size > 16384)
|
||||||
|
size = 16;
|
||||||
|
}
|
||||||
|
if(addr + size > SPI_FLASH_BASE) {
|
||||||
|
flash_turnon();
|
||||||
|
dump_bytes(addr, size);
|
||||||
|
SpicDisableRtl8195A();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dump_bytes(addr, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extern uint32_t CmdDumpWord(IN uint16_t argc, IN uint8_t *argv[]);
|
||||||
|
extern uint32_t CmdWriteWord(IN uint16_t argc, IN uint8_t *argv[]);
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Dump dword register
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
static void fATSD(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (argc > 2) {
|
||||||
|
int size = Strtoul(argv[2],0,10);
|
||||||
|
if (size <= 0 || size > 16384)
|
||||||
|
argv[2] = "16";
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
CmdDumpWord(argc-1, (unsigned char**)(argv+1));
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Write dword register
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
static void fATSW(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
CmdWriteWord(argc-1, (unsigned char**)(argv+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get one byte from the 4-byte address */
|
||||||
|
#define ip4_addr1(ipaddr) (((uint8_t*)(ipaddr))[0])
|
||||||
|
#define ip4_addr2(ipaddr) (((uint8_t*)(ipaddr))[1])
|
||||||
|
#define ip4_addr3(ipaddr) (((uint8_t*)(ipaddr))[2])
|
||||||
|
#define ip4_addr4(ipaddr) (((uint8_t*)(ipaddr))[3])
|
||||||
|
/* These are cast to uint16_t, with the intent that they are often arguments
|
||||||
|
* to printf using the U16_F format from cc.h. */
|
||||||
|
#define ip4_addr1_16(ipaddr) ((uint16_t)ip4_addr1(ipaddr))
|
||||||
|
#define ip4_addr2_16(ipaddr) ((uint16_t)ip4_addr2(ipaddr))
|
||||||
|
#define ip4_addr3_16(ipaddr) ((uint16_t)ip4_addr3(ipaddr))
|
||||||
|
#define ip4_addr4_16(ipaddr) ((uint16_t)ip4_addr4(ipaddr))
|
||||||
|
|
||||||
|
#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \
|
||||||
|
ip4_addr2_16(ipaddr), \
|
||||||
|
ip4_addr3_16(ipaddr), \
|
||||||
|
ip4_addr4_16(ipaddr)
|
||||||
|
|
||||||
|
#define IPSTR "%d.%d.%d.%d"
|
||||||
|
|
||||||
|
extern const char * const tcp_state_str[];
|
||||||
|
/*
|
||||||
|
static const char * const tcp_state_str[] = {
|
||||||
|
"CLOSED",
|
||||||
|
"LISTEN",
|
||||||
|
"SYN_SENT",
|
||||||
|
"SYN_RCVD",
|
||||||
|
"ESTABLISHED",
|
||||||
|
"FIN_WAIT_1",
|
||||||
|
"FIN_WAIT_2",
|
||||||
|
"CLOSE_WAIT",
|
||||||
|
"CLOSING",
|
||||||
|
"LAST_ACK",
|
||||||
|
"TIME_WAIT"
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : debug
|
||||||
|
* Parameters :
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
void print_udp_pcb(void)
|
||||||
|
{
|
||||||
|
struct udp_pcb *pcb;
|
||||||
|
bool prt_none = true;
|
||||||
|
rtl_printf("UDP pcbs:\n");
|
||||||
|
for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
|
rtl_printf("flg:%02x\t" IPSTR ":%d\t" IPSTR ":%d\trecv:%p\n", pcb->flags, IP2STR(&pcb->local_ip), pcb->local_port, IP2STR(&pcb->remote_ip), pcb->remote_port, pcb->recv );
|
||||||
|
prt_none = false;
|
||||||
|
};
|
||||||
|
if(prt_none) rtl_printf("none\n");
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : debug
|
||||||
|
* Parameters :
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
void print_tcp_pcb(void)
|
||||||
|
{
|
||||||
|
struct tcp_pcb *pcb;
|
||||||
|
rtl_printf("Active PCB states:\n");
|
||||||
|
bool prt_none = true;
|
||||||
|
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
|
rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p\t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
|
||||||
|
prt_none = false;
|
||||||
|
};
|
||||||
|
if(prt_none) rtl_printf("none\n");
|
||||||
|
rtl_printf("Listen PCB states:\n");
|
||||||
|
prt_none = true;
|
||||||
|
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
|
rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p\t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
|
||||||
|
prt_none = false;
|
||||||
|
};
|
||||||
|
if(prt_none) rtl_printf("none\n");
|
||||||
|
rtl_printf("TIME-WAIT PCB states:\n");
|
||||||
|
prt_none = true;
|
||||||
|
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
|
rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p \t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
|
||||||
|
prt_none = false;
|
||||||
|
};
|
||||||
|
if(prt_none) rtl_printf("none\n");
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : debug
|
||||||
|
* Parameters :
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
static void fATLW(int argc, char *argv[]) // Info Lwip
|
||||||
|
{
|
||||||
|
(void) argc; (void) argv;
|
||||||
|
print_udp_pcb();
|
||||||
|
print_tcp_pcb();
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// GPIO Info
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
static void fATGI(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void) argc; (void) argv;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < _PORT_MAX; i++)
|
||||||
|
printf("Port %c state: 0x%04x\n", i + 'A', GPIOState[i]);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Deep sleep
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
static void fATDS(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
uint32 sleep_ms = 10000;
|
||||||
|
if(argc > 1) sleep_ms = atoi(argv[1]);
|
||||||
|
#if 0 // WakeUp PB_1
|
||||||
|
if(argc > 2) {
|
||||||
|
printf("%u ms waiting low level on PB_1 before launching Deep-Sleep...\n", sleep_ms);
|
||||||
|
// turn off log uart
|
||||||
|
HalDeinitLogUart(); // sys_log_uart_off();
|
||||||
|
|
||||||
|
// initialize wakeup pin
|
||||||
|
gpio_t gpio_wake;
|
||||||
|
gpio_init(&gpio_wake, PB_1);
|
||||||
|
gpio_dir(&gpio_wake, PIN_INPUT);
|
||||||
|
gpio_mode(&gpio_wake, PullDown);
|
||||||
|
TickType_t sttime = xTaskGetTickCount();
|
||||||
|
|
||||||
|
do {
|
||||||
|
if(gpio_read(&gpio_wake) == 0) {
|
||||||
|
// Enter deep sleep... Wait give rising edge at PB_1 to wakeup system.
|
||||||
|
deepsleep_ex(DSLEEP_WAKEUP_BY_GPIO, 0);
|
||||||
|
};
|
||||||
|
vTaskDelay(1);
|
||||||
|
} while(xTaskGetTickCount() - sttime < sleep_ms);
|
||||||
|
HalInitLogUart(); // sys_log_uart_on();
|
||||||
|
printf("No set pin low in deep sleep!\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Deep-Sleep %u ms\n", sleep_ms);
|
||||||
|
HalLogUartWaitTxFifoEmpty();
|
||||||
|
// Enter deep sleep... Wait timer ms
|
||||||
|
deepsleep_ex(DSLEEP_WAKEUP_BY_TIMER, sleep_ms);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
HalLogUartWaitTxFifoEmpty();
|
||||||
|
deepsleep_ex(DSLEEP_WAKEUP_BY_TIMER, sleep_ms);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* power saving mode
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static void fATSP(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc > 2) {
|
||||||
|
switch (argv[1][0]) {
|
||||||
|
case 'a': // acquire
|
||||||
|
{
|
||||||
|
acquire_wakelock(atoi(argv[2]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'r': // release
|
||||||
|
{
|
||||||
|
release_wakelock(atoi(argv[2]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
printf("WakeLock Status %d\n", pmu_get_wakelock_status());
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_at[] = {
|
||||||
|
{"ATST", 0, fATST, ": Memory info"},
|
||||||
|
{"ATLW", 0, fATLW, ": LwIP Info"},
|
||||||
|
{"ATGI", 0, fATGI, ": GPIO Info"},
|
||||||
|
{"ATSB", 1, fATSB, "=<ADDRES(hex)>[,COUNT(dec)]: Dump byte register"},
|
||||||
|
{"ATSD", 1, fATSD, "=<ADDRES(hex)>[,COUNT(dec)]: Dump dword register"},
|
||||||
|
{"ATSW", 2, fATSW, "=<ADDRES(hex)>,<DATA(hex)>: Set register"},
|
||||||
|
{"ATDS", 0, fATDS, "=[TIME(ms)]: Deep sleep"},
|
||||||
|
{"ATSP", 0, fATSP, "=<a,r>,<wakelock_status:1|2|4|8>: Power"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //#ifdef CONFIG_AT_USR
|
38
RTLGDB/Project/console/flash_tst.c
Normal file
38
RTLGDB/Project/console/flash_tst.c
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* flash_tst.c
|
||||||
|
*
|
||||||
|
* Created on: 10/04/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "flash_api.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
extern void dump_bytes(uint32 addr, int size);
|
||||||
|
|
||||||
|
static void FlashDump(int argc, char *argv[]) {
|
||||||
|
if (argc > 1) {
|
||||||
|
int addr;
|
||||||
|
sscanf(argv[1], "%x", &addr);
|
||||||
|
int size = 16;
|
||||||
|
if (argc > 2) {
|
||||||
|
size = atoi(argv[2]);
|
||||||
|
if (size <= 0 || size > 16384) {
|
||||||
|
size = 16;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
flash_turnon();
|
||||||
|
dump_bytes(addr + SPI_FLASH_BASE, size);
|
||||||
|
SpicDisableRtl8195A();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_flash_tst[] = {
|
||||||
|
{"FLASHDB", 1, FlashDump, "=<faddr(HEX)>[,size]: Flash Dump"}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
99
RTLGDB/Project/console/gpio_irq_test.c
Normal file
99
RTLGDB/Project/console/gpio_irq_test.c
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* test.c
|
||||||
|
*
|
||||||
|
* Created on: 12 марта 2017 г.
|
||||||
|
* Author: PVV
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "device.h"
|
||||||
|
#include "gpio_api.h" // mbed
|
||||||
|
#include "gpio_irq_api.h" // mbed
|
||||||
|
#include "gpio_irq_ex_api.h" // mbed
|
||||||
|
#include "timer_api.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "hal_diag.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
#define GPIO_LED_PIN PA_4
|
||||||
|
#define GPIO_IRQ_PIN PC_4
|
||||||
|
|
||||||
|
gpio_irq_t gpio_btn;
|
||||||
|
gpio_t gpio_led;
|
||||||
|
gtimer_t my_timer;
|
||||||
|
|
||||||
|
uint32_t lo_time_us, hi_time_us;
|
||||||
|
uint32_t lo_time_cnt, hi_time_cnt;
|
||||||
|
uint32_t old_tsf;
|
||||||
|
uint32_t lo, hi, fr;
|
||||||
|
|
||||||
|
uint32_t io_irq_count;
|
||||||
|
|
||||||
|
static void gpio_demo_irq_handler(uint32_t id, gpio_irq_event event) {
|
||||||
|
|
||||||
|
// gpio_irq_disable(&gpio_btn);
|
||||||
|
io_irq_count++;
|
||||||
|
uint32_t new_tsf = get_tsf();
|
||||||
|
uint32_t delta_us = (uint32_t) new_tsf - (uint32_t) old_tsf;
|
||||||
|
if (event & 1) {
|
||||||
|
lo_time_us += delta_us;
|
||||||
|
lo_time_cnt++;
|
||||||
|
gpio_irq_set(&gpio_btn, IRQ_LOW, 1);
|
||||||
|
} else {
|
||||||
|
hi_time_us += delta_us;
|
||||||
|
hi_time_cnt++;
|
||||||
|
gpio_irq_set(&gpio_btn, IRQ_HIGH, 1);
|
||||||
|
}
|
||||||
|
old_tsf = new_tsf;
|
||||||
|
// gpio_irq_enable(&gpio_btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void timer1_timeout_handler(uint32_t id) {
|
||||||
|
|
||||||
|
if (lo_time_cnt && hi_time_cnt) {
|
||||||
|
lo = lo_time_us / lo_time_cnt;
|
||||||
|
hi = hi_time_us / hi_time_cnt;
|
||||||
|
fr = hi + lo;
|
||||||
|
lo_time_cnt = 0;
|
||||||
|
lo_time_us = 0;
|
||||||
|
hi_time_cnt = 0;
|
||||||
|
hi_time_us = 0;
|
||||||
|
printf("Period: %lu us, Lo: %lu us, Hi: %lu us\n", fr, lo, hi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Main program.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void fATTT(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
lo_time_cnt = 0;
|
||||||
|
lo_time_us = 0;
|
||||||
|
hi_time_cnt = 0;
|
||||||
|
hi_time_us = 0;
|
||||||
|
|
||||||
|
// Init LED control pin
|
||||||
|
gpio_init(&gpio_led, GPIO_LED_PIN);
|
||||||
|
gpio_dir(&gpio_led, PIN_OUTPUT); // Direction: Output
|
||||||
|
gpio_mode(&gpio_led, PullNone); // No pull
|
||||||
|
gpio_write(&gpio_led, 0);
|
||||||
|
|
||||||
|
// Initial Push Button pin as interrupt source
|
||||||
|
gpio_irq_init(&gpio_btn, GPIO_IRQ_PIN, gpio_demo_irq_handler,
|
||||||
|
(uint32_t) (&gpio_led));
|
||||||
|
gpio_irq_set(&gpio_btn, IRQ_FALL, 1); // Falling Edge Trigger
|
||||||
|
gpio_irq_enable(&gpio_btn);
|
||||||
|
|
||||||
|
// Initial a periodical timer
|
||||||
|
gtimer_init(&my_timer, TIMER1);
|
||||||
|
gtimer_start_periodical(&my_timer, 1000000, (void*) timer1_timeout_handler,
|
||||||
|
(uint32_t) &gpio_led);
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_test[] = { { "ATTT", 0,
|
||||||
|
fATTT, ": Test" } };
|
||||||
|
|
38
RTLGDB/Project/console/power_tst.c
Normal file
38
RTLGDB/Project/console/power_tst.c
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* power_tst.c
|
||||||
|
*
|
||||||
|
* Created on: 04 апр. 2017 г.
|
||||||
|
* Author: PVV
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* power saving mode
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void fATSP(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc > 2) {
|
||||||
|
switch (argv[1][0]) {
|
||||||
|
case 'a': // acquire
|
||||||
|
{
|
||||||
|
acquire_wakelock(atoi(argv[2]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'r': // release
|
||||||
|
{
|
||||||
|
release_wakelock(atoi(argv[2]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("WakeLock Status %d\n", pmu_get_wakelock_status());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_pwrs[] = {
|
||||||
|
{"ATSP", 0, fATSP, "=<a,r>,<wakelock_status:1|2|4|8>: Power"}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
54
RTLGDB/Project/console/pwm_tst.c
Normal file
54
RTLGDB/Project/console/pwm_tst.c
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* pwm_tst.c
|
||||||
|
*
|
||||||
|
* Created on: 19/04/2017.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
//#include "device.h"
|
||||||
|
#include "pwmout_api.h" // mbed
|
||||||
|
//#include "main.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "objects.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
|
||||||
|
extern const PinMap PinMap_PWM[];
|
||||||
|
extern uint32_t gTimerRecord;
|
||||||
|
|
||||||
|
HAL_PWM_ADAPTER pwm_hal_adp;
|
||||||
|
|
||||||
|
static void fATPWM(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
uint8_t pin = ahextoul(argv[1]);
|
||||||
|
uint32_t period = ahextoul(argv[2]);
|
||||||
|
uint32_t pulse = ahextoul(argv[3]);
|
||||||
|
|
||||||
|
uint32_t peripheral = pinmap_peripheral(pin, PinMap_PWM);
|
||||||
|
|
||||||
|
if(pwm_hal_adp.enable) {
|
||||||
|
HAL_Pwm_Disable(&pwm_hal_adp);
|
||||||
|
gTimerRecord &= ~(1 << pwm_hal_adp.gtimer_id);
|
||||||
|
rtl_memset((void *)&pwm_hal_adp, 0, sizeof(HAL_PWM_ADAPTER));
|
||||||
|
};
|
||||||
|
if((period) && (unlikely(peripheral != NC))
|
||||||
|
&& (HAL_Pwm_Init(&pwm_hal_adp, RTL_GET_PERI_IDX(peripheral), RTL_GET_PERI_SEL(peripheral)) == HAL_OK)) {
|
||||||
|
HAL_Pwm_SetDuty(&pwm_hal_adp, period, pulse);
|
||||||
|
HAL_Pwm_Enable(&pwm_hal_adp);
|
||||||
|
} else {
|
||||||
|
printf("Error parameters!");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// atpwm=34,1048575,524287
|
||||||
|
// atpwm=34,122,61 (8.187kHz)
|
||||||
|
// atsw 40000368 85001002 (8.187kHz)
|
||||||
|
// atsd 40000360 6
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_pwm[] = {
|
||||||
|
{ "ATPWM", 3, fATPWM, "=<pin>,<period>,<pulse>: PWM Test" }
|
||||||
|
};
|
383
RTLGDB/Project/console/sd_fat.c
Normal file
383
RTLGDB/Project/console/sd_fat.c
Normal file
|
@ -0,0 +1,383 @@
|
||||||
|
/*
|
||||||
|
* sd_fat.c
|
||||||
|
*
|
||||||
|
* Created on: 17 дек. 2016 г.
|
||||||
|
* Author: PVV
|
||||||
|
*/
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_SDIO_HOST_EN
|
||||||
|
|
||||||
|
#include "rtl8195a_sdio_host.h"
|
||||||
|
#include "hal_sdio_host.h"
|
||||||
|
#include "sd.h"
|
||||||
|
#include "sdio_host.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "sdcard.h"
|
||||||
|
//#include "ff.h"
|
||||||
|
//#include "fatfs_ext/inc/ff_driver.h"
|
||||||
|
#include "rtl8195a/os.h"
|
||||||
|
#include "at_cmd/log_service.h"
|
||||||
|
|
||||||
|
|
||||||
|
//extern ll_diskio_drv SD_disk_Driver;
|
||||||
|
|
||||||
|
char *logical_drv = "0:/";
|
||||||
|
|
||||||
|
#define START_CHAR_DISK '0'
|
||||||
|
|
||||||
|
typedef struct _msftm_td {
|
||||||
|
unsigned short day :5;
|
||||||
|
unsigned short month :4;
|
||||||
|
unsigned short year :7;
|
||||||
|
} msftm_d;
|
||||||
|
|
||||||
|
typedef struct _msftm_tt {
|
||||||
|
unsigned short sec :5;
|
||||||
|
unsigned short min :6;
|
||||||
|
unsigned short hour :5;
|
||||||
|
} msftm_t;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
unsigned short w;
|
||||||
|
msftm_d d;
|
||||||
|
} msftm_td;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
unsigned short w;
|
||||||
|
msftm_t t;
|
||||||
|
} msftm_tt;
|
||||||
|
uint8_t * month[12] = { "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
||||||
|
/*
|
||||||
|
* MS files times
|
||||||
|
*/
|
||||||
|
int ms_ftime(unsigned short td, unsigned short tt, struct os_tm *tm) {
|
||||||
|
msftm_td d;
|
||||||
|
msftm_tt t;
|
||||||
|
d.w = td;
|
||||||
|
t.w = tt;
|
||||||
|
tm->year = d.d.year + 1980;
|
||||||
|
tm->month = d.d.month;
|
||||||
|
tm->day = d.d.day;
|
||||||
|
tm->hour = t.t.hour;
|
||||||
|
tm->min = t.t.min;
|
||||||
|
tm->sec = t.t.sec << 1;
|
||||||
|
if (tm->month > 11 || tm->hour > 23 || tm->min > 59 || tm->sec > 59) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* MS files attr
|
||||||
|
*/
|
||||||
|
uint8_t * ms_fattr(uint8_t *s, uint8_t attr) {
|
||||||
|
memset(s, '-', 7);
|
||||||
|
if (attr & AM_ARC)
|
||||||
|
s[0] = 'a';
|
||||||
|
if (attr & AM_DIR)
|
||||||
|
s[1] = 'd';
|
||||||
|
if (attr & AM_LFN)
|
||||||
|
s[2] = 'l';
|
||||||
|
if (attr & AM_VOL)
|
||||||
|
s[3] = 'v';
|
||||||
|
if (attr & AM_SYS)
|
||||||
|
s[4] = 's';
|
||||||
|
if (attr & AM_HID)
|
||||||
|
s[5] = 'h';
|
||||||
|
if (attr & AM_RDO)
|
||||||
|
s[6] = 'r';
|
||||||
|
s[7] = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linux files attr
|
||||||
|
*/
|
||||||
|
uint8_t * ux_fattr(uint8_t *s, uint8_t attr) {
|
||||||
|
memset(s, '-', 10);
|
||||||
|
if (attr & AM_DIR) {
|
||||||
|
s[0] = 'd';
|
||||||
|
// s[3] = 'x';
|
||||||
|
// s[6] = 'x';
|
||||||
|
// s[9] = 'x';
|
||||||
|
}
|
||||||
|
if (!(attr & AM_VOL)) {
|
||||||
|
// {
|
||||||
|
s[1] = 'r';
|
||||||
|
s[4] = 'r';
|
||||||
|
s[7] = 'r';
|
||||||
|
if (!(attr & AM_RDO)) {
|
||||||
|
s[2] = 'w';
|
||||||
|
s[5] = 'w';
|
||||||
|
s[8] = 'w';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if(attr & AM_VOL) s[3] = 'x';
|
||||||
|
if (!(attr & AM_SYS))
|
||||||
|
s[3] = 'x';
|
||||||
|
if (!(attr & AM_HID))
|
||||||
|
s[6] = 'x';
|
||||||
|
if (!(attr & AM_ARC))
|
||||||
|
s[9] = 'x';
|
||||||
|
s[10] = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
FATFS * sd_mount(void) {
|
||||||
|
FATFS * m_fs = NULL;
|
||||||
|
// Инициализация I/O SDIOH
|
||||||
|
if (HalGetChipId() != CHIP_ID_8195AM) {
|
||||||
|
GPIOState[0] &= ~((1 << 8) - 1);
|
||||||
|
HAL_GPIO_PullCtrl(PA_0, PullUp); // D2
|
||||||
|
HAL_GPIO_PullCtrl(PA_1, PullUp); // D3
|
||||||
|
HAL_GPIO_PullCtrl(PA_2, PullUp); // CMD
|
||||||
|
HAL_GPIO_PullCtrl(PA_3, PullNone); // CLK
|
||||||
|
HAL_GPIO_PullCtrl(PA_4, PullUp); // D0
|
||||||
|
HAL_GPIO_PullCtrl(PA_5, PullUp); // D1
|
||||||
|
HAL_GPIO_PullCtrl(PA_6, PullDown); // SD card removed
|
||||||
|
HAL_GPIO_PullCtrl(PA_7, PullDown); // WP enable
|
||||||
|
vTaskDelay(1);
|
||||||
|
};
|
||||||
|
int8_t ret = SD_Init();
|
||||||
|
if (ret < SD_NODISK) { // sdio_sd_init();
|
||||||
|
if (sdio_sd_status() >= 0 && sdio_status == SDIO_SD_OK) {
|
||||||
|
sdio_sd_getProtection();
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
// чтение информации о SD карте
|
||||||
|
printf("\nSD CSD: ");
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
printf("%02x", SdioHostAdapter.Csd[i]);
|
||||||
|
uint32_t i = sdio_sd_getCapacity();
|
||||||
|
printf("\nSD Capacity: %d sectors (%d GB | %d MB | %d KB)\n", i,
|
||||||
|
i >> 21, i >> 11, i >> 1);
|
||||||
|
#endif
|
||||||
|
m_fs = (FATFS *) malloc(sizeof(FATFS));
|
||||||
|
if (m_fs != NULL) {
|
||||||
|
memset(m_fs, 0, sizeof(FATFS));
|
||||||
|
int drv_num = FATFS_RegisterDiskDriver(&SD_disk_Driver);
|
||||||
|
if (drv_num >= 0) {
|
||||||
|
*logical_drv = (char) drv_num + START_CHAR_DISK;
|
||||||
|
if (f_mount(m_fs, logical_drv, 1) == FR_OK) {
|
||||||
|
m_fs->drv = (BYTE) drv_num;
|
||||||
|
#if CONFIG_DEBUG_LOG > 3
|
||||||
|
printf("SD disk:%c mounted\n", logical_drv[0], m_fs);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("SD disk mount failed!\n");
|
||||||
|
#endif
|
||||||
|
FATFS_UnRegisterDiskDriver(drv_num);
|
||||||
|
free(m_fs);
|
||||||
|
m_fs = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("SD Register Disk Driver failed!\n");
|
||||||
|
#endif
|
||||||
|
free(m_fs);
|
||||||
|
m_fs = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("Malloc failed!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("SD Error (%d) get status!\n", sdio_status);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("SD Init Error (%d)!\n", ret);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return m_fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sd_unmount(FATFS *m_fs) {
|
||||||
|
if (m_fs != NULL) {
|
||||||
|
#if CONFIG_DEBUG_LOG > 2
|
||||||
|
printf("unmount (%d)\n", f_mount(NULL, logical_drv, 1));
|
||||||
|
#else
|
||||||
|
f_mount(NULL, logical_drv, 1);
|
||||||
|
#endif
|
||||||
|
FATFS_UnRegisterDiskDriver(m_fs->drv);
|
||||||
|
free(m_fs);
|
||||||
|
}
|
||||||
|
pin_mode(PA_6, PullUp); // SD card removed
|
||||||
|
pin_mode(PA_7, PullUp); // WP enable
|
||||||
|
vTaskDelay(1);
|
||||||
|
SD_DeInit(); // sdio_sd_deinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void read_file_test(char* file_name) {
|
||||||
|
FIL *f = malloc(sizeof(FIL));
|
||||||
|
if (f_open(f, file_name, FA_READ) == FR_OK) {
|
||||||
|
char * buf = malloc(2048);
|
||||||
|
unsigned int bytesread =0;
|
||||||
|
unsigned int totalread=0;
|
||||||
|
do {
|
||||||
|
if (f_read(f, buf, 2048, &bytesread) != FR_OK) {
|
||||||
|
totalread += bytesread;
|
||||||
|
printf("Read error!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
totalread += bytesread;
|
||||||
|
}
|
||||||
|
while (bytesread !=0);
|
||||||
|
free(buf);
|
||||||
|
f_close(f);
|
||||||
|
} else {
|
||||||
|
printf("No open file!");
|
||||||
|
}
|
||||||
|
free(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void fATHF(int argc, char *argv[]) {
|
||||||
|
uint8 buf[512];
|
||||||
|
FATFS * fs = sd_mount();
|
||||||
|
if (fs != NULL) {
|
||||||
|
uint8_t * pbuf = (uint8_t *) malloc(512); // char *lfn = malloc (_MAX_LFN + 1);
|
||||||
|
if (pbuf != NULL) {
|
||||||
|
DIR dir;
|
||||||
|
FILINFO fno;
|
||||||
|
fno.lfname = (TCHAR*) pbuf;
|
||||||
|
fno.lfsize = 512;
|
||||||
|
uint8_t * sdir;
|
||||||
|
if(argc > 1
|
||||||
|
&& argv[1] != NULL
|
||||||
|
&& (sdir = (uint8_t *) malloc(strlen(argv[1]) + 4)) != NULL )
|
||||||
|
strcpy(strcpy(sdir, logical_drv) + 3, argv[1]);
|
||||||
|
else sdir = logical_drv;
|
||||||
|
if (f_opendir(&dir, sdir) == FR_OK) {
|
||||||
|
while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0] != 0) {
|
||||||
|
if ((fno.fattrib & AM_VOL)==0 && fno.fsize > 0) {
|
||||||
|
if (*fno.lfname) {
|
||||||
|
strcpy(strcpy(buf, logical_drv) + 3, fno.lfname);
|
||||||
|
} else {
|
||||||
|
strcpy(strcpy(buf, logical_drv) + 3, fno.fname);
|
||||||
|
}
|
||||||
|
TickType_t t1 = xTaskGetTickCount();
|
||||||
|
read_file_test(buf);
|
||||||
|
t1 = xTaskGetTickCount() - t1;
|
||||||
|
if(t1 == 0) t1 = 1;
|
||||||
|
printf("%u kbytes/sec\t%s\n", t1, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
printf("FATFS: Open dir fail!\n");
|
||||||
|
free(pbuf);
|
||||||
|
if((void *)sdir != (void *)logical_drv) free(sdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sd_unmount(fs);
|
||||||
|
|
||||||
|
}
|
||||||
|
/* Test SD */
|
||||||
|
static void fATHS(int argc, char *argv[]) {
|
||||||
|
// HalPinCtrlRtl8195A(UART0,0,0);
|
||||||
|
// HalPinCtrlRtl8195A(UART1,0,0);
|
||||||
|
#if CONFIG_DEBUG_LOG > 4
|
||||||
|
ConfigDebugErr = -1;
|
||||||
|
ConfigDebugInfo = -1;
|
||||||
|
ConfigDebugWarn = -1;
|
||||||
|
CfgSysDebugErr = -1;
|
||||||
|
CfgSysDebugInfo = -1;
|
||||||
|
CfgSysDebugWarn = -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if DEBUG_AT_USER_LEVEL > 3
|
||||||
|
printf("ATHS: dir\n");
|
||||||
|
#endif
|
||||||
|
FATFS * fs = sd_mount();
|
||||||
|
if (fs != NULL) {
|
||||||
|
uint8_t * pbuf = (uint8_t *) malloc(512); // char *lfn = malloc (_MAX_LFN + 1);
|
||||||
|
if (pbuf != NULL) {
|
||||||
|
DIR dir;
|
||||||
|
FILINFO fno;
|
||||||
|
struct os_tm tm;
|
||||||
|
fno.lfname = (TCHAR*) pbuf;
|
||||||
|
fno.lfsize = 512;
|
||||||
|
uint8_t * sdir;
|
||||||
|
if(argc > 1
|
||||||
|
&& argv[1] != NULL
|
||||||
|
&& (sdir = (uint8_t *) malloc(strlen(argv[1]) + 4)) != NULL )
|
||||||
|
strcpy(strcpy(sdir, logical_drv) + 3, argv[1]);
|
||||||
|
else sdir = logical_drv;
|
||||||
|
printf("\ndir %s\n", sdir);
|
||||||
|
if (f_opendir(&dir, sdir) == FR_OK) {
|
||||||
|
while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0] != 0) {
|
||||||
|
int srtlen = 0;
|
||||||
|
{
|
||||||
|
uint8_t buf[12];
|
||||||
|
srtlen += printf(ux_fattr(buf, fno.fattrib));
|
||||||
|
}
|
||||||
|
srtlen += printf(" 0");
|
||||||
|
if (fno.fattrib & AM_VOL)
|
||||||
|
printf(" volume");
|
||||||
|
else if (fno.fattrib & AM_SYS)
|
||||||
|
printf(" system");
|
||||||
|
else
|
||||||
|
printf(" none ");
|
||||||
|
srtlen += 7;
|
||||||
|
if (fno.fattrib & AM_HID)
|
||||||
|
printf(" hidden");
|
||||||
|
else
|
||||||
|
printf(" none ");
|
||||||
|
srtlen += 7;
|
||||||
|
srtlen += printf(" %d", fno.fsize);
|
||||||
|
while (srtlen < 37)
|
||||||
|
srtlen += printf(" ");
|
||||||
|
ms_ftime(fno.fdate, fno.ftime, &tm);
|
||||||
|
srtlen += printf(" %04d-%02d-%02d %02d:%02d:%02d ", tm.year,
|
||||||
|
tm.month, tm.day, tm.hour, tm.min, tm.sec);
|
||||||
|
if (*fno.lfname) {
|
||||||
|
srtlen += printf(fno.lfname);
|
||||||
|
//fnlen = fno.lfsize;
|
||||||
|
} else {
|
||||||
|
srtlen += printf(fno.fname);
|
||||||
|
//fnlen = fno.fsize;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
};
|
||||||
|
printf("\n");
|
||||||
|
f_closedir(&dir);
|
||||||
|
} else
|
||||||
|
printf("FATFS: Open dir fail!\n");
|
||||||
|
free(pbuf);
|
||||||
|
if((void *)sdir != (void *)logical_drv) free(sdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sd_unmount(fs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
} else
|
||||||
|
printf("FATFS: Malloc fail!\n");
|
||||||
|
f_mount(NULL, logical_drv, 1);
|
||||||
|
} else
|
||||||
|
printf("FATFS mount logical drive fail!\n");
|
||||||
|
FATFS_UnRegisterDiskDriver(drv_num);
|
||||||
|
} else
|
||||||
|
printf("Register disk driver to FATFS fail.\n");
|
||||||
|
free(m_fs);
|
||||||
|
} else
|
||||||
|
printf("FATFS: Malloc fail!\n");
|
||||||
|
} else
|
||||||
|
printf("SD Init fail!\n");
|
||||||
|
pin_mode(PA_6, PullUp); // SD card removed
|
||||||
|
pin_mode(PA_7, PullUp); // WP enable
|
||||||
|
vTaskDelay(5);
|
||||||
|
|
||||||
|
SD_DeInit(); // sdio_sd_deinit();
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_dscard[] = {
|
||||||
|
{"ATHS", 0, fATHS, "=[dir]: SD test"},
|
||||||
|
{"ATHF", 0, fATHF, "=[dir]: SD file read"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CONFIG_SDIO_HOST_EN
|
83
RTLGDB/Project/console/spi_tst.c
Normal file
83
RTLGDB/Project/console/spi_tst.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* spi_test.c
|
||||||
|
*/
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "spi_api.h"
|
||||||
|
#include "spi_ex_api.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
#define SPI0_MOSI PC_2
|
||||||
|
#define SPI0_MISO PC_3
|
||||||
|
#define SPI0_SCLK PC_1
|
||||||
|
#define SPI0_CS PC_0
|
||||||
|
|
||||||
|
spi_t spi_master;
|
||||||
|
|
||||||
|
static void show_reg_spi(int i) {
|
||||||
|
rtl_printf("Regs SPI:\n");
|
||||||
|
for(int x = 0; x < 64 ; x += 4) {
|
||||||
|
rtl_printf("0x%08x ", HAL_SSI_READ32(i, x));
|
||||||
|
if((x & 0x0F) == 0x0C) rtl_printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void fATSSI(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int len = 128;
|
||||||
|
int count = 32;
|
||||||
|
int clk = 1000000;
|
||||||
|
int ssn = 0;
|
||||||
|
if(argc > 1) {
|
||||||
|
len = atoi(argv[1]);
|
||||||
|
if(len > 32768 || len <= 0) {
|
||||||
|
len = 128;
|
||||||
|
error_printf("%s: len = %u!\n", __func__, len);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(argc > 2) {
|
||||||
|
count = atoi(argv[2]);
|
||||||
|
if(count > 10000 || count <= 0) {
|
||||||
|
count = 32;
|
||||||
|
error_printf("%s: count = %u!\n", __func__, count);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(argc > 3) {
|
||||||
|
clk = atoi(argv[3]);
|
||||||
|
if(clk <= 0) {
|
||||||
|
clk = 1000000;
|
||||||
|
error_printf("%s: clk = %u!\n", __func__, clk);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(argc > 4) {
|
||||||
|
ssn = atoi(argv[4]);
|
||||||
|
if(ssn > 7 || ssn < 0) {
|
||||||
|
ssn = 0;
|
||||||
|
error_printf("%s: ssn = %u!\n", __func__, ssn);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
char* buff = pvPortMalloc(len);
|
||||||
|
if(buff) {
|
||||||
|
spi_init(&spi_master, SPI0_MOSI, SPI0_MISO, SPI0_SCLK, SPI0_CS); // CS заданный тут нигде не используется
|
||||||
|
spi_format(&spi_master, 16, 3, 0);
|
||||||
|
spi_frequency(&spi_master, clk);
|
||||||
|
spi_slave_select(&spi_master, ssn); // выбор CS
|
||||||
|
for(int i = 0; i < len; i++) buff[i] = (char)i;
|
||||||
|
while(count--) {
|
||||||
|
spi_master_write_stream(&spi_master, buff, len);
|
||||||
|
while(spi_busy(&spi_master));
|
||||||
|
rtl_printf("Master write: %d\n", count);
|
||||||
|
};
|
||||||
|
// show_reg_spi(spi_master.spi_adp.Index);
|
||||||
|
spi_free(&spi_master);
|
||||||
|
free(buff);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error_printf("%s: error malloc!\n", __func__);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_spitst[] = {
|
||||||
|
{"ATSSI", 0, fATSSI, "=[len[,count[,clk[,ssn]]]]: Spi test"}
|
||||||
|
};
|
353
RTLGDB/Project/console/wifi_console.c
Normal file
353
RTLGDB/Project/console/wifi_console.c
Normal file
|
@ -0,0 +1,353 @@
|
||||||
|
/*
|
||||||
|
* wifi_console.c
|
||||||
|
*
|
||||||
|
* Created on: 03/04/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <autoconf.h>
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
#include "wifi_conf.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "hal_platform.h"
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
|
||||||
|
#include "section_config.h"
|
||||||
|
#include "hal_diag.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern struct netif xnetif[NET_IF_NUM];
|
||||||
|
|
||||||
|
//==========================================================
|
||||||
|
//--- CONSOLE --------------------------
|
||||||
|
|
||||||
|
// ATPN=<SSID>[,password[,encryption[,auto reconnect[,reconnect pause]]]: WIFI Connect to AP
|
||||||
|
static void fATPN(int argc, char *argv[]){
|
||||||
|
if(argc > 1) {
|
||||||
|
if(argv[1][0] == '?') {
|
||||||
|
show_wifi_st_cfg();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strncpy(wifi_st_cfg.ssid, argv[1], NDIS_802_11_LENGTH_SSID);
|
||||||
|
int pswlen;
|
||||||
|
if(argc > 2) {
|
||||||
|
pswlen = strlen(wifi_st_cfg.password);
|
||||||
|
strncpy(wifi_st_cfg.password, argv[2], NDIS_802_11_LENGTH_SSID);
|
||||||
|
if(pswlen > 7) {
|
||||||
|
wifi_st_cfg.security = IDX_SECURITY_WPA2_AES_PSK;
|
||||||
|
}
|
||||||
|
else if(!pswlen) {
|
||||||
|
wifi_st_cfg.security = IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("password len < 8!\n");
|
||||||
|
wifi_st_cfg.security = IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// default
|
||||||
|
wifi_st_cfg.password[0] = 0;
|
||||||
|
wifi_st_cfg.security = IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
if(argc > 3) {
|
||||||
|
if(pswlen > 7) {
|
||||||
|
wifi_st_cfg.security = atoi(argv[3]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("password len < 8!\n");
|
||||||
|
wifi_st_cfg.security = IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(argc > 4) {
|
||||||
|
wifi_st_cfg.autoreconnect = atoi(argv[4]);
|
||||||
|
}
|
||||||
|
else wifi_st_cfg.autoreconnect = 0;
|
||||||
|
if(argc > 5) {
|
||||||
|
wifi_st_cfg.reconnect_pause = atoi(argv[5]);
|
||||||
|
}
|
||||||
|
else wifi_st_cfg.reconnect_pause = 5;
|
||||||
|
show_wifi_st_cfg();
|
||||||
|
#if CONFIG_WLAN_CONNECT_CB
|
||||||
|
connect_close();
|
||||||
|
#endif
|
||||||
|
wifi_run(wifi_run_mode | RTW_MODE_STA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ATPA=<SSID>[,password[,encryption[,channel[,hidden[,max connections]]]]]: Start WIFI AP
|
||||||
|
static void fATPA(int argc, char *argv[]){
|
||||||
|
if(argc > 1) {
|
||||||
|
if(argv[1][0] == '?') {
|
||||||
|
show_wifi_ap_cfg();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strncpy(wifi_ap_cfg.ssid, argv[1], NDIS_802_11_LENGTH_SSID);
|
||||||
|
if(argc > 2) {
|
||||||
|
strncpy(wifi_ap_cfg.password, argv[2], NDIS_802_11_LENGTH_SSID);
|
||||||
|
int i = strlen(wifi_ap_cfg.password);
|
||||||
|
if(i > 7) {
|
||||||
|
wifi_ap_cfg.security = 1; // IDX_SECURITY_WPA2_AES_PSK;
|
||||||
|
}
|
||||||
|
else if(i == 0) {
|
||||||
|
wifi_ap_cfg.security = 0; // IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("password len < 8!\n");
|
||||||
|
wifi_ap_cfg.security = 0; // IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wifi_ap_cfg.password[0] = 0;
|
||||||
|
wifi_ap_cfg.security = 0; // IDX_SECURITY_OPEN;
|
||||||
|
}
|
||||||
|
if(argc > 3) {
|
||||||
|
wifi_ap_cfg.security = (argv[3][0] == '0')? 0 : 1; //RTW_SECURITY_OPEN : RTW_SECURITY_WPA2_AES_PSK;
|
||||||
|
}
|
||||||
|
if(argc > 4) {
|
||||||
|
wifi_ap_cfg.channel = atoi(argv[4]);
|
||||||
|
}
|
||||||
|
else wifi_ap_cfg.channel = 1;
|
||||||
|
if(argc > 5) {
|
||||||
|
wifi_ap_cfg.ssid_hidden = atoi(argv[5]);
|
||||||
|
}
|
||||||
|
else wifi_ap_cfg.ssid_hidden = 0;
|
||||||
|
|
||||||
|
if(argc > 6) {
|
||||||
|
wifi_ap_cfg.max_sta = atoi(argv[6]);
|
||||||
|
}
|
||||||
|
else wifi_ap_cfg.max_sta = 3;
|
||||||
|
|
||||||
|
show_wifi_ap_cfg();
|
||||||
|
#if CONFIG_WLAN_CONNECT_CB
|
||||||
|
connect_close();
|
||||||
|
#endif
|
||||||
|
wifi_run(wifi_run_mode | RTW_MODE_AP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WIFI Connect, Disconnect
|
||||||
|
static void fATWR(int argc, char *argv[]){
|
||||||
|
rtw_mode_t mode = RTW_MODE_NONE;
|
||||||
|
if(argc > 1) mode = atoi(argv[1]);
|
||||||
|
#if CONFIG_WLAN_CONNECT_CB
|
||||||
|
connect_close();
|
||||||
|
#endif
|
||||||
|
wifi_run(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_WLAN_CONNECT_CB
|
||||||
|
// Close connections
|
||||||
|
static void fATOF(int argc, char *argv[]){
|
||||||
|
connect_close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open connections
|
||||||
|
static void fATON(int argc, char *argv[]){
|
||||||
|
connect_start();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void fATWI(int argc, char *argv[]) {
|
||||||
|
#if 1
|
||||||
|
if(argc > 2) {
|
||||||
|
uint8_t c = argv[1][0] | 0x20;
|
||||||
|
if(c == 's') {
|
||||||
|
int i = atoi(argv[2]);
|
||||||
|
printf("Save configs(%d)..\n", i);
|
||||||
|
write_wifi_cfg(atoi(argv[2]));
|
||||||
|
}
|
||||||
|
else if(c == 'l') {
|
||||||
|
wifi_cfg.load_flg = atoi(argv[2]);
|
||||||
|
}
|
||||||
|
else if(c == 'm') {
|
||||||
|
wifi_cfg.mode = atoi(argv[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
rtw_wifi_setting_t Setting;
|
||||||
|
if((wifi_run_mode & RTW_MODE_AP)
|
||||||
|
&& wifi_get_setting(wlan_ap_name, &Setting) == 0) {
|
||||||
|
wifi_show_setting(wlan_ap_name, &Setting);
|
||||||
|
// show_wifi_ap_ip();
|
||||||
|
printf("\tIP: " IPSTR "\n\n", IP2STR(&xnetif[WLAN_AP_NETIF_NUM].ip_addr));
|
||||||
|
//#if CONFIG_DEBUG_LOG > 1
|
||||||
|
show_wlan_info(WLAN_AP_NETIF_NUM);
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
if((wifi_run_mode & RTW_MODE_STA)
|
||||||
|
&& wifi_get_setting(wlan_st_name, &Setting) == 0) {
|
||||||
|
wifi_show_setting(wlan_st_name, &Setting);
|
||||||
|
// show_wifi_st_ip();
|
||||||
|
printf("\tIP: " IPSTR "\n\n", IP2STR(&xnetif[WLAN_ST_NETIF_NUM].ip_addr));
|
||||||
|
//#if CONFIG_DEBUG_LOG > 1
|
||||||
|
show_wlan_info(WLAN_ST_NETIF_NUM);
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
printf("\nWIFI config:\n");
|
||||||
|
printf(&str_rom_57ch3Dch0A[25]); // "================================\n"
|
||||||
|
show_wifi_cfg();
|
||||||
|
printf("\nWIFI AP config:\n");
|
||||||
|
printf(&str_rom_57ch3Dch0A[25]); // "================================\n"
|
||||||
|
show_wifi_ap_cfg();
|
||||||
|
printf("\nWIFI ST config:\n");
|
||||||
|
printf(&str_rom_57ch3Dch0A[25]); // "================================\n"
|
||||||
|
show_wifi_st_cfg();
|
||||||
|
#if SDK_VER_NUM > 0x4000
|
||||||
|
if(wifi_mode & RTW_MODE_AP) {
|
||||||
|
printf("\nWIFI AP clients:\n");
|
||||||
|
printf(&str_rom_57ch3Dch0A[25]); // "================================\n"
|
||||||
|
show_wifi_ap_clients();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
extern uint8_t rtw_power_percentage_idx;
|
||||||
|
extern int rltk_set_tx_power_percentage(rtw_tx_pwr_percentage_t power_percentage_idx);
|
||||||
|
|
||||||
|
void fATWT(int argc, char *argv[]) {
|
||||||
|
(void) argc; (void) argv;
|
||||||
|
if(argc > 1) {
|
||||||
|
int txpwr = atoi(argv[1]);
|
||||||
|
debug_printf("set tx power (%d)...\n", txpwr);
|
||||||
|
if(rltk_set_tx_power_percentage(txpwr) != RTW_SUCCESS) {
|
||||||
|
error_printf("Error set tx power (%d)!", wifi_cfg.tx_pwr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("TX power = %d\n", rtw_power_percentage_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-- Test tsf (64-bits counts, 1 us step) ---
|
||||||
|
|
||||||
|
//#include "hal_com_reg.h"
|
||||||
|
#define WIFI_REG_BASE 0x40080000
|
||||||
|
#define REG_TSFTR 0x0560
|
||||||
|
#define REG_TSFTR1 0x0568 // HW Port 1 TSF Register
|
||||||
|
|
||||||
|
#define ReadTSF_Lo32() (*((volatile unsigned int *)(WIFI_REG_BASE + REG_TSFTR)))
|
||||||
|
#define ReadTSF_Hi32() (*((volatile unsigned int *)(WIFI_REG_BASE + REG_TSFTR1)))
|
||||||
|
|
||||||
|
static uint64_t get_tsf(void)
|
||||||
|
{
|
||||||
|
return *((uint64_t *)(WIFI_REG_BASE + REG_TSFTR));
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATSF(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void) argc; (void) argv;
|
||||||
|
uint64_t tsf = get_tsf();
|
||||||
|
printf("\nTSF: %08x%08x\n", (uint32_t)(tsf>>32), (uint32_t)(tsf));
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATWP(int argc, char *argv[]) {
|
||||||
|
(void) argc; (void) argv;
|
||||||
|
int x = 0;
|
||||||
|
if(argc > 1) {
|
||||||
|
x = atoi(argv[1]);
|
||||||
|
if(x == 0) {
|
||||||
|
acquire_wakelock(~WAKELOCK_WLAN);
|
||||||
|
release_wakelock(0xffff);
|
||||||
|
_wext_enable_powersave(0, 0, 0);
|
||||||
|
_wext_set_lps_dtim(0, 1);
|
||||||
|
} else {
|
||||||
|
release_wakelock(~WAKELOCK_WLAN);
|
||||||
|
_wext_enable_powersave(0, 1, 1);
|
||||||
|
_wext_set_lps_dtim(0, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("DTIM: %d\n", _wext_get_lps_dtim(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* -------- WiFi Scan ------------------------------- */
|
||||||
|
static rtw_result_t scan_result_handler(internal_scan_handler_t* ap_scan_result)
|
||||||
|
{
|
||||||
|
if (ap_scan_result) {
|
||||||
|
if(ap_scan_result->scan_cnt) {
|
||||||
|
printf("\nScan networks:\n\n");
|
||||||
|
printf("N\tType\tMAC\t\t\tSignal\tCh\tWPS\tSecyrity\tSSID\n\n");
|
||||||
|
for(int i = 0 ; i < ap_scan_result->scan_cnt; i++) {
|
||||||
|
rtw_scan_result_t* record = &ap_scan_result->ap_details[i];
|
||||||
|
printf("%d\t", i+1);
|
||||||
|
printf("%s\t", (record->bss_type == RTW_BSS_TYPE_ADHOC)? "Adhoc": "Infra");
|
||||||
|
printf(MAC_FMT, MAC_ARG(record->BSSID.octet));
|
||||||
|
printf("\t%d\t", record->signal_strength);
|
||||||
|
printf("%d\t", record->channel);
|
||||||
|
printf("%d\t", record->wps_type);
|
||||||
|
{
|
||||||
|
uint8 * s = rtw_security_to_str(record->security);
|
||||||
|
printf("%s\t", s);
|
||||||
|
if(strlen(s) < 8) printf("\t");
|
||||||
|
}
|
||||||
|
record->SSID.val[record->SSID.len] = '\0';
|
||||||
|
printf("%s\n", record->SSID.val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("Scan networks: None!\n");
|
||||||
|
}
|
||||||
|
return RTW_SUCCESS;
|
||||||
|
}
|
||||||
|
/* -------- WiFi Scan ------------------------------- */
|
||||||
|
void fATSN(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
api_wifi_scan(scan_result_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
|
||||||
|
extern void cmd_ap_wps(int argc, char **argv);
|
||||||
|
extern void cmd_wps(int argc, char **argv);
|
||||||
|
//extern void cmd_wifi_on(int argc, char **argv);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ENABLE_P2P
|
||||||
|
extern void cmd_wifi_p2p_start(int argc, char **argv);
|
||||||
|
extern void cmd_wifi_p2p_stop(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_listen(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_find(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_peers(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_info(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_disconnect(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_connect(int argc, char **argv);
|
||||||
|
extern void cmd_wifi_p2p_auto_go_start(int argc, char **argv);
|
||||||
|
extern void cmd_p2p_peers(int argc, char **argv);
|
||||||
|
#endif //CONFIG_ENABLE_P2P
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_cmd_wifi_api[] = {
|
||||||
|
{"ATPN", 1, fATPN, "=<SSID>[,password[,encryption[,auto-reconnect[,reconnect pause]]]: WIFI Connect to AP"},
|
||||||
|
{"ATPA", 1, fATPA, "=<SSID>[,password[,encryption[,channel[,hidden[,max connections]]]]]: Start WIFI AP"},
|
||||||
|
#if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
|
||||||
|
{"WPS_AP", 1, cmd_ap_wps, "=<pbc/pin>[,pin]: WiFi AP WPS"},
|
||||||
|
{"WPS_ST", 1, cmd_wps, "=<pbc/pin>[,pin]: WiFi Station WPS"},
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ENABLE_P2P
|
||||||
|
{"P2P_START", 0, cmd_wifi_p2p_start, ": p2p start" },
|
||||||
|
{"P2P_ASTART", 0, cmd_wifi_p2p_auto_go_start, ": p2p auto go start" },
|
||||||
|
{"P2P_STOP", 0, cmd_wifi_p2p_stop, ": p2p stop"},
|
||||||
|
{"P2P_PEERS", 0, cmd_p2p_peers, ": p2p peers" },
|
||||||
|
{"P2P_FIND", 0, cmd_p2p_find, ": p2p find"},
|
||||||
|
{"P2P_INFO", 0, cmd_p2p_info, ": p2p info"},
|
||||||
|
{"P2P_DISCCONNECT", 0, cmd_p2p_disconnect, ": p2p disconnect"},
|
||||||
|
{"P2P_CONNECT", 0, cmd_p2p_connect, ": p2p connect"},
|
||||||
|
#endif
|
||||||
|
{"ATWR", 0, fATWR, "=[mode]: WIFI Mode: 0 - off, 1 - ST, 2 - AP, 3 - ST+AP"},
|
||||||
|
#if CONFIG_WLAN_CONNECT_CB
|
||||||
|
{"ATON", 0, fATON, ": Open connections"},
|
||||||
|
{"ATOFF", 0, fATOF, ": Close connections"},
|
||||||
|
#endif
|
||||||
|
{"ATWI", 0, fATWI, ": WiFi Info"},
|
||||||
|
#if CONFIG_DEBUG_LOG > 3
|
||||||
|
{"ATWT", 1, fATWT, "=<tx_power>: WiFi tx power: 0 - 100%, 1 - 75%, 2 - 50%, 3 - 25%, 4 - 12.5%"},
|
||||||
|
{"ATSF", 0, fATSF, ": Get TSF value"},
|
||||||
|
#endif
|
||||||
|
// {"ATWP", 0, fATWP, "=[dtim]: 0 - WiFi ipc/lpc off, 1..10 - on + dtim"},
|
||||||
|
{"ATSN", 0, fATSN, ": Scan networks"}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
75
RTLGDB/Project/console/wlan_tst.c
Normal file
75
RTLGDB/Project/console/wlan_tst.c
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* wlan_tst.c
|
||||||
|
*
|
||||||
|
* Created on: 10 апр. 2017 г.
|
||||||
|
* Author: PVV
|
||||||
|
*/
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#if 1
|
||||||
|
#include "drv_types.h" // or #include "wlan_lib.h"
|
||||||
|
#else
|
||||||
|
#include "wifi_constants.h"
|
||||||
|
#include "wifi_structures.h"
|
||||||
|
#include "wlan_lib.h" // or #include "drv_types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#include "section_config.h"
|
||||||
|
//#include "hal_diag.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
|
||||||
|
extern void dump_bytes(uint32 addr, int size);
|
||||||
|
extern Rltk_wlan_t rltk_wlan_info[2]; // in wrapper.h
|
||||||
|
|
||||||
|
static void tst_wlan_struct(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void)argc; (void)argv;
|
||||||
|
printf("Test: sizeof(struct _ADAPTER) = %d\n", sizeof(struct _ADAPTER)); //6088
|
||||||
|
printf("mlmeextpriv\t+%d\n", offsetof(struct _ADAPTER, mlmeextpriv)); //+1256
|
||||||
|
printf("TSFValue\t+%d\n", offsetof(struct _ADAPTER, mlmeextpriv.TSFValue)); //+1992
|
||||||
|
printf("stapriv\t\t+%d\n", offsetof(struct _ADAPTER, stapriv)); //+3024 [164]
|
||||||
|
printf("pwrctrlpriv.bInternalAutoSuspend +%d\n", offsetof(struct _ADAPTER, pwrctrlpriv.bInternalAutoSuspend)); //+5061
|
||||||
|
printf("eeprompriv\t+%d\n", offsetof(struct _ADAPTER, eeprompriv)); // +5128
|
||||||
|
printf("HalData\t\t+%d\n", offsetof(struct _ADAPTER, HalData)); //+5656
|
||||||
|
printf("HalFunc\t\t+%d\n", offsetof(struct _ADAPTER, HalFunc)); //+5664
|
||||||
|
printf("bDriverStopped\t+%d\n", offsetof(struct _ADAPTER, bDriverStopped)); //+5880
|
||||||
|
printf("hw_init_completed +%d\n", offsetof(struct _ADAPTER, hw_init_completed)); //+5905
|
||||||
|
printf("stats\t\t+%d\n", offsetof(struct _ADAPTER, stats)); //+6024
|
||||||
|
printf("hw_init_mutex\t+%d\n", offsetof(struct _ADAPTER, hw_init_mutex)); //+6060
|
||||||
|
printf("fix_rate\t+%d\n", offsetof(struct _ADAPTER, fix_rate)); //+6084
|
||||||
|
|
||||||
|
printf("rltk_wlan_info = %p\n", &rltk_wlan_info);
|
||||||
|
dump_bytes((uint32_t)&rltk_wlan_info, sizeof(rltk_wlan_info));
|
||||||
|
_adapter * ad = *(_adapter **)((rltk_wlan_info[0].dev)->priv);
|
||||||
|
printf("adapter0 = %p, %p\n", ad, ad->pbuddy_adapter);
|
||||||
|
ad = *(_adapter **)((rltk_wlan_info[1].dev)->priv);
|
||||||
|
printf("adapter1 = %p, %p\n", ad, ad->pbuddy_adapter);
|
||||||
|
vTaskDelay(5);
|
||||||
|
dump_bytes((uint32_t)ad,sizeof(struct _ADAPTER));
|
||||||
|
vTaskDelay(5);
|
||||||
|
|
||||||
|
if (sizeof(struct _ADAPTER) != 6088) {
|
||||||
|
printf("Error: Check WiFi adapter struct!\n");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_wlan_param(int argc, char *argv[]) {
|
||||||
|
(void)argc; (void)argv;
|
||||||
|
_adapter * ad = *(_adapter **)((rltk_wlan_info[0].dev)->priv);
|
||||||
|
#if 1
|
||||||
|
printf("reconnect_deauth_filtered\t%u\n", ad->mlmeextpriv.reconnect_deauth_filtered);
|
||||||
|
printf("reconnect_times\t%u\n", ad->mlmeextpriv.reconnect_times);
|
||||||
|
printf("reconnect_cnt\t%u\n", ad->mlmeextpriv.reconnect_cnt);
|
||||||
|
printf("reconnect_timeout\t%u\n", ad->mlmeextpriv.reconnect_timeout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_wlan_tst[] = {
|
||||||
|
{"CHKWL", 0, tst_wlan_struct, ": Chk wlan struct"},
|
||||||
|
{"CHKAP", 0, show_wlan_param, ": Chow wlan parm"}
|
||||||
|
};
|
196
RTLGDB/Project/driver/adc_drv.c
Normal file
196
RTLGDB/Project/driver/adc_drv.c
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
/*
|
||||||
|
* Simple ADC DRV (adc_drv.c)
|
||||||
|
* Created on: 18 июн. 2017 г.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
|
||||||
|
#include "platform_autoconf.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "rtl8195a_adc.h"
|
||||||
|
#include "hal_adc.h"
|
||||||
|
#include "driver/adc_drv.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void ADCIrqInit(IRQ_FUN IrqFunc, uint32_t IrqData, uint32_t intr_enable)
|
||||||
|
{
|
||||||
|
IRQ_HANDLE IrqHandle = {
|
||||||
|
.IrqNum = ADC_IRQ,
|
||||||
|
.Priority = 5
|
||||||
|
};
|
||||||
|
IrqHandle.Data = IrqData;
|
||||||
|
IrqHandle.IrqFun = IrqFunc;
|
||||||
|
InterruptRegister(&IrqHandle);
|
||||||
|
InterruptEn(&IrqHandle);
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_INTR_EN, intr_enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADCIrqDeInit(void)
|
||||||
|
{
|
||||||
|
IRQ_HANDLE IrqHandle = {
|
||||||
|
.IrqNum = ADC_IRQ,
|
||||||
|
.Priority = 5,
|
||||||
|
.Data = (uint32_t)NULL,
|
||||||
|
.IrqFun = (IRQ_FUN) NULL
|
||||||
|
};
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_INTR_EN, 0);
|
||||||
|
InterruptUnRegister(&IrqHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADCEnable(void)
|
||||||
|
{
|
||||||
|
// Clear ADC Status
|
||||||
|
(void)HAL_ADC_READ32(REG_ADC_INTR_STS);
|
||||||
|
uint32_t AdcTempDat = HAL_ADC_READ32(REG_ADC_POWER);
|
||||||
|
AdcTempDat &= (~BIT_ADC_PWR_AUTO);
|
||||||
|
AdcTempDat |= 0x02;
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat);
|
||||||
|
AdcTempDat |= 0x04;
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat);
|
||||||
|
AdcTempDat &= (~0x08);
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat);
|
||||||
|
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, HAL_ADC_READ32(REG_ADC_ANAPAR_AD0) | BIT_ADC_EN_MANUAL);
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, HAL_ADC_READ32(REG_ADC_ANAPAR_AD1) | BIT_ADC_EN_MANUAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADCDisable(void)
|
||||||
|
{
|
||||||
|
#if ADC_USE_IRQ
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_INTR_EN, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, HAL_ADC_READ32(REG_ADC_ANAPAR_AD0) & (~BIT_ADC_EN_MANUAL));
|
||||||
|
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, HAL_ADC_READ32(REG_ADC_ANAPAR_AD1) & (~BIT_ADC_EN_MANUAL));
|
||||||
|
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_POWER, HAL_ADC_READ32(REG_ADC_POWER) & (~(BIT_ADC_PWR_AUTO)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOC_PS_MODULE
|
||||||
|
static void ADCEnablePS(void)
|
||||||
|
{
|
||||||
|
REG_POWER_STATE adcPwrState;
|
||||||
|
// To register a new peripheral device power state
|
||||||
|
adcPwrState.FuncIdx = ADC0;
|
||||||
|
adcPwrState.PwrState = ACT;
|
||||||
|
RegPowerState(adcPwrState);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ADCInit(ADC_MODULE_SEL adc_idx)
|
||||||
|
{
|
||||||
|
// ADC Function and Clock Enable
|
||||||
|
// To release DAC delta sigma clock gating
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2) | BIT25);
|
||||||
|
// Turn on DAC active clock
|
||||||
|
ACTCK_ADC_CCTRL(ON);
|
||||||
|
// Enable DAC0 module
|
||||||
|
ADC0_FCTRL(ON);
|
||||||
|
// Enable ADC power cut ?
|
||||||
|
// ADCEnablePW();
|
||||||
|
// ADC Control register set-up
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_CONTROL,
|
||||||
|
BIT_CTRL_ADC_COMP_ONLY(ADC_FEATURE_DISABLED) // compare mode only enable (without FIFO enable)
|
||||||
|
| BIT_CTRL_ADC_ONESHOT(ADC_FEATURE_DISABLED) // one-shot mode enable
|
||||||
|
| BIT_CTRL_ADC_OVERWRITE(ADC_FEATURE_DISABLED) // overwrite mode enable
|
||||||
|
| BIT_CTRL_ADC_ENDIAN(ADC_DATA_ENDIAN_LITTLE) // endian selection
|
||||||
|
| BIT_CTRL_ADC_BURST_SIZE(8) // DMA operation threshold
|
||||||
|
| BIT_CTRL_ADC_THRESHOLD(8) // one shot mode threshold
|
||||||
|
| BIT_CTRL_ADC_DBG_SEL(ADC_DBG_SEL_DISABLE));
|
||||||
|
#if 0
|
||||||
|
/* ADC compare value and compare method setting*/
|
||||||
|
switch (adc_idx)
|
||||||
|
{
|
||||||
|
case ADC0_SEL:
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_L,
|
||||||
|
(HAL_ADC_READ32(REG_ADC_COMP_VALUE_L)
|
||||||
|
& (~(BIT_ADC_COMP_TH_0(0xFFFF))))
|
||||||
|
| BIT_CTRL_ADC_COMP_TH_0(0) // ADC compare mode threshold
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case ADC1_SEL:
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_L,
|
||||||
|
(HAL_ADC_READ32(REG_ADC_COMP_VALUE_L)
|
||||||
|
& (~(BIT_ADC_COMP_TH_1(0xFFFF))))
|
||||||
|
| BIT_CTRL_ADC_COMP_TH_1(0) // ADC compare mode threshold
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case ADC2_SEL:
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_H,
|
||||||
|
(HAL_ADC_READ32(REG_ADC_COMP_VALUE_H)
|
||||||
|
& (~(BIT_ADC_COMP_TH_2(0xFFFF))))
|
||||||
|
| BIT_CTRL_ADC_COMP_TH_2(0) // ADC compare mode threshold
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADC3_SEL:
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_H,
|
||||||
|
(HAL_ADC_READ32(REG_ADC_COMP_VALUE_H)
|
||||||
|
& (~(BIT_ADC_COMP_TH_3(0xFFFF))))
|
||||||
|
| BIT_CTRL_ADC_COMP_TH_3(0) // ADC compare mode threshold
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* ADC compare mode setting */
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_COMP_SET,
|
||||||
|
HAL_ADC_READ32(REG_ADC_COMP_SET)
|
||||||
|
& (~(1 << adc_idx))); // compare mode control : less than the compare threshold
|
||||||
|
#endif
|
||||||
|
// ADC audio mode set-up
|
||||||
|
// ADC enable manually setting
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, HAL_ADC_READ32(REG_ADC_ANAPAR_AD0)
|
||||||
|
// & (~(BIT_ADC_AUDIO_EN)))
|
||||||
|
// & (~(BIT_ADC_EN_MANUAL))
|
||||||
|
| BIT_ADC_AUDIO_EN // ADC audio mode enable
|
||||||
|
| BIT_ADC_EN_MANUAL // ADC enable manually
|
||||||
|
);
|
||||||
|
// ADC analog parameter 0
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, (HAL_ADC_READ32(REG_ADC_ANAPAR_AD0)
|
||||||
|
// & (~BIT14) //ADC Input is internal?
|
||||||
|
| (BIT14))
|
||||||
|
& (~(BIT3|BIT2)));
|
||||||
|
// ADC analog parameter 1
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, (HAL_ADC_READ32(REG_ADC_ANAPAR_AD1) & (~BIT1)) | (BIT2|BIT0));
|
||||||
|
// ADC analog parameter 2
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD2, 0x67884400);
|
||||||
|
// ADC analog parameter 3
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD3, 0x77780039);
|
||||||
|
// ADC analog parameter 4
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD4, 0x0004d501);
|
||||||
|
// ADC analog parameter 5
|
||||||
|
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD5, 0x1E010800);
|
||||||
|
#ifdef CONFIG_SOC_PS_MODULE
|
||||||
|
ADCEnablePS();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADCDeInit(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SOC_PS_MODULE
|
||||||
|
REG_POWER_STATE adcPwrState;
|
||||||
|
uint8_t HwState;
|
||||||
|
adcPwrState.FuncIdx = ADC0;
|
||||||
|
QueryRegPwrState(adcPwrState.FuncIdx, &(adcPwrState.PwrState), &HwState);
|
||||||
|
// if the power state isn't ACT, then switch the power state back to ACT first
|
||||||
|
if ((adcPwrState.PwrState != ACT) && (adcPwrState.PwrState != INACT))
|
||||||
|
{
|
||||||
|
ADCEnablePS();
|
||||||
|
QueryRegPwrState(adcPwrState.FuncIdx, &(adcPwrState.PwrState), &HwState);
|
||||||
|
}
|
||||||
|
if (adcPwrState.PwrState == ACT)
|
||||||
|
{
|
||||||
|
adcPwrState.PwrState = INACT;
|
||||||
|
RegPowerState(adcPwrState);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// Turn on DAC active clock
|
||||||
|
ACTCK_ADC_CCTRL(OFF);
|
||||||
|
// Enable DAC1 module
|
||||||
|
ADC0_FCTRL(OFF);
|
||||||
|
// To release DAC delta sigma clock gating
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2) & (~(BIT25)));
|
||||||
|
}
|
||||||
|
|
23
RTLGDB/Project/driver/adc_drv.h
Normal file
23
RTLGDB/Project/driver/adc_drv.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Simple ADC DRV (adc_drv.h)
|
||||||
|
*
|
||||||
|
* Created on: 19 июн. 2017 г.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRIVER_ADC_DRV_H_
|
||||||
|
#define _DRIVER_ADC_DRV_H_
|
||||||
|
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "rtl8195a_adc.h"
|
||||||
|
|
||||||
|
void ADCIrqInit(IRQ_FUN IrqFunc, uint32_t IrqData, uint32_t intr_enable); // intr_enable = bits: REG_ADC_INTR_EN - BIT_ADC_FIFO_RD_ERROR_EN | BIT_ADC_FIFO_RD_REQ_EN | BIT_ADC_FIFO_FULL_EN ...
|
||||||
|
void ADCIrqDeInit(void);
|
||||||
|
|
||||||
|
void ADCInit(ADC_MODULE_SEL adc_idx); // RTL8711AM: adc_idx = ADC2_SEL = 2
|
||||||
|
void ADCDeInit(void);
|
||||||
|
void ADCEnable(void); // ADC Start
|
||||||
|
void ADCDisable(void); // ADC Stop
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _DRIVER_ADC_DRV_H_ */
|
570
RTLGDB/Project/driver/i2c_drv.c
Normal file
570
RTLGDB/Project/driver/i2c_drv.c
Normal file
|
@ -0,0 +1,570 @@
|
||||||
|
/*
|
||||||
|
* i2c_drv.c
|
||||||
|
*
|
||||||
|
* Created on: 02/05/2017.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
#include "rtl_lib.h"
|
||||||
|
|
||||||
|
#if CONFIG_I2C_EN
|
||||||
|
|
||||||
|
#include "pinmap.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char sda;
|
||||||
|
unsigned char scl;
|
||||||
|
unsigned char sel;
|
||||||
|
unsigned char id;
|
||||||
|
} PinMapI2C;
|
||||||
|
|
||||||
|
#define I2C_SEL(idx, ps) ((idx<<4) | ps)
|
||||||
|
|
||||||
|
static const PinMapI2C PinMap_I2C[] = {
|
||||||
|
// sda, scl, sel, id
|
||||||
|
// I2C0
|
||||||
|
{PD_4, PD_5, I2C_SEL(0, S0), I2C0},
|
||||||
|
{PH_1, PH_0, I2C_SEL(0, S1), I2C0},
|
||||||
|
{PC_8, PC_9, I2C_SEL(0, S2), I2C0},
|
||||||
|
{PE_7, PE_6, I2C_SEL(0, S3), I2C0},
|
||||||
|
// I2C1
|
||||||
|
{PC_4, PC_5, I2C_SEL(1, S0), I2C1},
|
||||||
|
{PH_3, PH_2, I2C_SEL(1, S1), I2C1},
|
||||||
|
{PD_7, PD_6, I2C_SEL(1, S2), I2C1},
|
||||||
|
// I2C2
|
||||||
|
{PB_7, PB_6, I2C_SEL(2, S0), I2C2},
|
||||||
|
{PE_1, PE_0, I2C_SEL(2, S1), I2C2},
|
||||||
|
{PC_7, PC_6, I2C_SEL(2, S2), I2C2},
|
||||||
|
// I2C3
|
||||||
|
{PB_3, PB_2, I2C_SEL(3, S0), I2C3},
|
||||||
|
{PE_3, PE_2, I2C_SEL(3, S1), I2C3},
|
||||||
|
{PE_5, PE_4, I2C_SEL(3, S2), I2C3},
|
||||||
|
{PD_9, PD_8, I2C_SEL(3, S3), I2C3},
|
||||||
|
|
||||||
|
{0xff, 0xff, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void * i2c_base_reg[4] = {
|
||||||
|
(void *)I2C0_REG_BASE,
|
||||||
|
(void *)I2C1_REG_BASE,
|
||||||
|
(void *)I2C2_REG_BASE,
|
||||||
|
(void *)I2C3_REG_BASE
|
||||||
|
};
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
#define test_printf(...)
|
||||||
|
#define i2c_dump_regs(p)
|
||||||
|
#else
|
||||||
|
#define test_printf rtl_printf
|
||||||
|
static int i2c_dump_regs(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
uint32 *ptr = pi2c->base_regs;
|
||||||
|
test_printf("%s:", __func__);
|
||||||
|
for(int i = 0; i < (0xA0>>2); i++) {
|
||||||
|
if(!(i%4)) {
|
||||||
|
test_printf("\n%08x:", &ptr[i]);
|
||||||
|
}
|
||||||
|
test_printf("\t%08x", ptr[i]);
|
||||||
|
}
|
||||||
|
test_printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define i2c_reg(r) *((volatile uint32 *)(pi2c->base_regs + r))
|
||||||
|
|
||||||
|
// flg =0 write, =1 Read
|
||||||
|
static int i2c_ready(i2c_drv_t *pi2c, unsigned char flg)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
// Test enable i2c
|
||||||
|
if(!(i2c_reg(REG_DW_I2C_IC_ENABLE) & BIT_IC_ENABLE)) {
|
||||||
|
error_printf("I2C%d disable!\n", pi2c->idx);
|
||||||
|
pi2c->status = DRV_I2C_IC_OFF;
|
||||||
|
return DRV_I2C_IC_OFF;
|
||||||
|
}
|
||||||
|
// Wait Receive FIFO is empty & Transmit FIFO Completely Empty
|
||||||
|
int poll_count = DRV_I2C_POOL_TIMEOUT;
|
||||||
|
do {
|
||||||
|
if(i2c_reg(REG_DW_I2C_IC_RAW_INTR_STAT) & BIT_IC_RAW_INTR_STAT_TX_ABRT) {
|
||||||
|
error_printf("I2C%d Abort!\n", pi2c->idx);
|
||||||
|
// Clear abort status.
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_CLR_TX_ABRT);
|
||||||
|
// Be sure that all interrupts flag are cleared.
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
pi2c->status = DRV_I2C_ABORT;
|
||||||
|
return DRV_I2C_ABORT;
|
||||||
|
}
|
||||||
|
if(flg) {
|
||||||
|
// Receive FIFO ready ?
|
||||||
|
if(i2c_reg(REG_DW_I2C_IC_STATUS) & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) {
|
||||||
|
// pi2c->status = DRV_I2C_IC_ENABLE;
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Transmit FIFO is not full ?
|
||||||
|
if(i2c_reg(REG_DW_I2C_IC_STATUS) & BIT_IC_STATUS_TFNF) {
|
||||||
|
// pi2c->status = DRV_I2C_IC_ENABLE;
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while(poll_count--);
|
||||||
|
error_printf("I2C%d Timeout!\n", pi2c->idx);
|
||||||
|
pi2c->status = DRV_I2C_TIMEOUT;
|
||||||
|
return DRV_I2C_TIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _i2c_break(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s\n", __func__);
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
// ABORT operation
|
||||||
|
int poll_count = DRV_I2C_POOL_TIMEOUT;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) |= 2;
|
||||||
|
// Wait until controller is disabled.
|
||||||
|
while(i2c_reg(REG_DW_I2C_IC_ENABLE) & 2) {
|
||||||
|
if(poll_count-- <= 0) {
|
||||||
|
error_printf("Error abort i2c%d\n", pi2c->idx);
|
||||||
|
pi2c->status = DRV_I2C_TIMEOUT;
|
||||||
|
return DRV_I2C_TIMEOUT;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pi2c->status = DRV_I2C_OFF;
|
||||||
|
// All interrupts flag are cleared.
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (!) вызывать после _i2c_init */
|
||||||
|
int _i2c_set_speed(i2c_drv_t *pi2c, uint32 clk_hz)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
if(clk_hz < 10000 || clk_hz > HalGetCpuClk()/16) {
|
||||||
|
error_printf("I2C%d Error clk!\n", pi2c->idx);
|
||||||
|
return DRV_I2C_ERR;
|
||||||
|
}
|
||||||
|
uint32 tmp;
|
||||||
|
uint32 CpuClkTmp = HalGetCpuClk()/clk_hz;
|
||||||
|
switch(pi2c->mode) {
|
||||||
|
case I2C_SS_MODE:
|
||||||
|
// Standard Speed Clock SCL High Count
|
||||||
|
tmp = (CpuClkTmp * I2C_SS_MIN_SCL_HTIME)/(I2C_SS_MIN_SCL_HTIME + I2C_SS_MIN_SCL_LTIME);
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_HCNT) = BIT_CTRL_IC_SS_SCL_HCNT(tmp);
|
||||||
|
// Standard Speed Clock SCL Low Count
|
||||||
|
tmp = (CpuClkTmp * I2C_SS_MIN_SCL_LTIME)/(I2C_SS_MIN_SCL_HTIME + I2C_SS_MIN_SCL_LTIME);
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_LCNT) = BIT_CTRL_IC_SS_SCL_LCNT(tmp);
|
||||||
|
break;
|
||||||
|
case I2C_HS_MODE:
|
||||||
|
// Standard Speed Clock SCL High Count
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_HCNT) = BIT_CTRL_IC_SS_SCL_HCNT(400);
|
||||||
|
// Standard Speed Clock SCL Low Count
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_LCNT) = BIT_CTRL_IC_SS_SCL_LCNT(470);
|
||||||
|
// Fast Speed Clock SCL High Count
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_HCNT) = BIT_CTRL_IC_FS_SCL_HCNT(85);
|
||||||
|
// Fast Speed I2C Clock SCL Low Count
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_LCNT) = BIT_CTRL_IC_FS_SCL_LCNT(105);
|
||||||
|
// High Speed I2C Clock SCL High Count
|
||||||
|
tmp = (CpuClkTmp * I2C_HS_MIN_SCL_HTIME_100)/(I2C_HS_MIN_SCL_HTIME_100 + I2C_HS_MIN_SCL_LTIME_100);
|
||||||
|
if (tmp > 8) tmp -= 3;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_HS_SCL_HCNT) = BIT_CTRL_IC_HS_SCL_HCNT(tmp);
|
||||||
|
// High Speed I2C Clock SCL Low Count
|
||||||
|
tmp = (CpuClkTmp * I2C_HS_MIN_SCL_LTIME_100)/(I2C_HS_MIN_SCL_HTIME_100 + I2C_HS_MIN_SCL_LTIME_100);
|
||||||
|
if (tmp > 6) tmp -= 6;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_HS_SCL_LCNT) = BIT_CTRL_IC_FS_SCL_LCNT(tmp);
|
||||||
|
break;
|
||||||
|
// case I2C_FS_MODE:
|
||||||
|
default:
|
||||||
|
pi2c->mode = I2C_FS_MODE;
|
||||||
|
// Fast Speed Clock SCL High Count
|
||||||
|
tmp = (CpuClkTmp * I2C_FS_MIN_SCL_HTIME)/(I2C_FS_MIN_SCL_HTIME + I2C_FS_MIN_SCL_LTIME);
|
||||||
|
if (tmp > 4) tmp -= 4;// this part is according to the fine-tune result
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_HCNT) = BIT_CTRL_IC_FS_SCL_HCNT(tmp);
|
||||||
|
// Fast Speed I2C Clock SCL Low Count
|
||||||
|
tmp = (CpuClkTmp * I2C_FS_MIN_SCL_LTIME)/(I2C_FS_MIN_SCL_HTIME + I2C_FS_MIN_SCL_LTIME);
|
||||||
|
if (tmp > 3) tmp -= 3; // this part is according to the fine-tune result
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_LCNT) = BIT_CTRL_IC_FS_SCL_LCNT(tmp);
|
||||||
|
}
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int i2c_disable(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
pi2c->status = DRV_I2C_IC_OFF;
|
||||||
|
if(i2c_reg(REG_DW_I2C_IC_ENABLE_STATUS) & BIT_IC_ENABLE_STATUS_IC_EN) {
|
||||||
|
test_printf("I2C%d Already disable!\n", pi2c->idx);
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
// Disable controller.
|
||||||
|
int poll_count = DRV_I2C_POOL_TIMEOUT;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) &= ~BIT_IC_ENABLE;
|
||||||
|
// Wait until controller is disabled.
|
||||||
|
while(i2c_reg(REG_DW_I2C_IC_ENABLE_STATUS) & BIT_IC_ENABLE_STATUS_IC_EN) {
|
||||||
|
if(poll_count-- <= 0) {
|
||||||
|
error_printf("I2C%d Error disable!\n", pi2c->idx);
|
||||||
|
pi2c->status = DRV_I2C_TIMEOUT;
|
||||||
|
return DRV_I2C_TIMEOUT;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int i2c_enable(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
int poll_count = DRV_I2C_POOL_TIMEOUT;
|
||||||
|
if(!(i2c_reg(REG_DW_I2C_IC_ENABLE_STATUS) & BIT_IC_ENABLE_STATUS_IC_EN)) {
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
// Wait until controller is enabled
|
||||||
|
while(!(i2c_reg(REG_DW_I2C_IC_ENABLE_STATUS) & BIT_IC_ENABLE_STATUS_IC_EN)) {
|
||||||
|
if(poll_count-- <= 0) {
|
||||||
|
error_printf("I2C%d Error enable\n", pi2c->idx);
|
||||||
|
pi2c->status = DRV_I2C_TIMEOUT;
|
||||||
|
return DRV_I2C_TIMEOUT;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
// Be sure that all interrupts flag are cleared.
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
pi2c->status = DRV_I2C_IC_ENABLE;
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// IC On & Enable CLK
|
||||||
|
static void _i2c_ic_on(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
uint32 tmp = 1 << (pi2c->idx << 1);
|
||||||
|
HAL_PERI_ON_WRITE32(REG_PESOC_PERI_CLK_CTRL1,
|
||||||
|
HAL_PERI_ON_READ32(REG_PESOC_PERI_CLK_CTRL1) | tmp);
|
||||||
|
HAL_PERI_ON_WRITE32(REG_PESOC_PERI_CLK_CTRL1,
|
||||||
|
HAL_PERI_ON_READ32(REG_PESOC_PERI_CLK_CTRL1) | (tmp << 1));
|
||||||
|
tmp = BIT_PERI_I2C0_EN << pi2c->idx;
|
||||||
|
HAL_PERI_ON_WRITE32(REG_SOC_PERI_FUNC0_EN,
|
||||||
|
HAL_PERI_ON_READ32(REG_SOC_PERI_FUNC0_EN) & (~tmp));
|
||||||
|
HAL_PERI_ON_WRITE32(REG_SOC_PERI_FUNC0_EN,
|
||||||
|
HAL_PERI_ON_READ32(REG_SOC_PERI_FUNC0_EN) | tmp);
|
||||||
|
|
||||||
|
tmp = HAL_READ32(PERI_ON_BASE, REG_PESOC_CLK_SEL);
|
||||||
|
tmp &= (~(BIT_PESOC_PERI_SCLK_SEL(3)));
|
||||||
|
HAL_WRITE32(PERI_ON_BASE, REG_PESOC_CLK_SEL, tmp);
|
||||||
|
|
||||||
|
HalPinCtrlRtl8195A(I2C0 + pi2c->idx, pi2c->io_sel, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// IC Off & Disable CLK
|
||||||
|
void _i2c_ic_off(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
if(pi2c->status) {
|
||||||
|
// mask all interrupts
|
||||||
|
i2c_reg(REG_DW_I2C_IC_INTR_MASK) = 0;
|
||||||
|
// Disable (Abort I2C Controller)
|
||||||
|
_i2c_break(pi2c);
|
||||||
|
i2c_disable(pi2c);
|
||||||
|
uint32 mask = BIT_PERI_I2C0_EN << pi2c->idx;
|
||||||
|
HAL_PERI_ON_WRITE32(REG_SOC_PERI_FUNC0_EN,
|
||||||
|
HAL_PERI_ON_READ32(REG_SOC_PERI_FUNC0_EN) & (~mask));
|
||||||
|
HalPinCtrlRtl8195A(I2C0 + pi2c->idx, pi2c->io_sel, 0);
|
||||||
|
#ifdef CONFIG_SOC_PS_MODULE
|
||||||
|
REG_POWER_STATE i2cPwrState;
|
||||||
|
// To register a new peripheral device power state
|
||||||
|
i2cPwrState.FuncIdx = I2C0 + pi2c->idx;
|
||||||
|
i2cPwrState.PwrState = INACT;
|
||||||
|
RegPowerState(i2cPwrState);
|
||||||
|
#endif
|
||||||
|
pi2c->status = DRV_I2C_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (!) вызывать до _i2c_init, если параметрв драйвера не заданы в i2c_drv_t */
|
||||||
|
int _i2c_setup(i2c_drv_t *pi2c, PinName sda, PinName scl, unsigned char mode)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
if(mode < DRV_I2C_SS_MODE || mode > DRV_I2C_HS_MODE) {
|
||||||
|
error_printf("I2C Error mode!\n");
|
||||||
|
return DRV_I2C_ERR;
|
||||||
|
}
|
||||||
|
// Pins -> index
|
||||||
|
PinMapI2C *p = (PinMapI2C *)PinMap_I2C;
|
||||||
|
while(p->sda != 0xFF) {
|
||||||
|
if(p->sda == sda && p->scl == scl) {
|
||||||
|
pi2c->io_sel = RTL_GET_PERI_SEL(p->sel);
|
||||||
|
pi2c->idx = RTL_GET_PERI_IDX(p->sel);
|
||||||
|
pi2c->mode = mode;
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
error_printf("I2C Error pins!\n");
|
||||||
|
return DRV_I2C_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (!) Использует заполненную структуру i2c_drv_t */
|
||||||
|
int _i2c_init(i2c_drv_t *pi2c)
|
||||||
|
{
|
||||||
|
test_printf("%s:\n", __func__);
|
||||||
|
// Set base address regs i2c
|
||||||
|
pi2c->base_regs = i2c_base_reg[pi2c->idx];
|
||||||
|
// IC On & Enable CLK
|
||||||
|
if(pi2c->status == DRV_I2C_OFF) _i2c_ic_on(pi2c);
|
||||||
|
// mask all interrupts
|
||||||
|
i2c_reg(REG_DW_I2C_IC_INTR_MASK) = 0;
|
||||||
|
// disable i2c
|
||||||
|
if(i2c_disable(pi2c)) return pi2c->status;
|
||||||
|
// Set Control Register:
|
||||||
|
// bit0: master enabled,
|
||||||
|
// bit1..2: fast mode (400 kbit/s), ...
|
||||||
|
// bit2: Slave Addressing Mode 7-bit
|
||||||
|
// bit4: Master Addressing Mode 7-bit
|
||||||
|
// bit5: Restart disable
|
||||||
|
// bit6: Slave Mode Disable
|
||||||
|
// bit7: STOP_DET_IFADDRESSED
|
||||||
|
// bit8: TX_EMPTY_CTRL
|
||||||
|
// bit9: RX_FIFO_FULL_HLD_CTRL
|
||||||
|
// Set MASTER_MODE
|
||||||
|
i2c_reg(REG_DW_I2C_IC_CON) =
|
||||||
|
BIT_CTRL_IC_CON_MASTER_MODE(1)
|
||||||
|
| BIT_IC_CON_SPEED(pi2c->mode)
|
||||||
|
| BIT_CTRL_IC_CON_IC_10BITADDR_SLAVE(0)
|
||||||
|
| BIT_CTRL_IC_CON_IC_10BITADDR_MASTER(0)
|
||||||
|
| BIT_CTRL_IC_CON_IC_RESTART_EN(1)
|
||||||
|
| BIT_CTRL_IC_CON_IC_SLAVE_DISABLE(1);
|
||||||
|
// Master Target Address
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_TAR) = 0x40;
|
||||||
|
// Slave Address
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_SAR) = 0x55;
|
||||||
|
// High Speed Master ID (00001xxx) bit0..2
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_HS_MADDR) = BIT_CTRL_IC_HS_MADDR(0x4);
|
||||||
|
// Standard Speed Clock SCL High Count (100kHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_HCNT) = BIT_CTRL_IC_SS_SCL_HCNT(400);
|
||||||
|
// Standard Speed Clock SCL Low Count (100kHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SS_SCL_LCNT) = BIT_CTRL_IC_SS_SCL_LCNT(470);
|
||||||
|
// Fast Speed Clock SCL High Count (400kHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_HCNT) = BIT_CTRL_IC_FS_SCL_HCNT(80);
|
||||||
|
// Fast Speed I2C Clock SCL Low Count (400kHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_FS_SCL_LCNT) = BIT_CTRL_IC_FS_SCL_LCNT(100);
|
||||||
|
// High Speed I2C Clock SCL High Count (1MHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_HS_SCL_HCNT) = BIT_CTRL_IC_HS_SCL_HCNT(30);
|
||||||
|
// High Speed I2C Clock SCL Low Count (1MHz)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_HS_SCL_LCNT) = BIT_CTRL_IC_FS_SCL_LCNT(40);
|
||||||
|
// SDA Hold (IC_CLK period, when I2C controller acts as a transmitter/receiver)
|
||||||
|
i2c_reg(REG_DW_I2C_IC_SDA_HOLD) = BIT_CTRL_IC_SDA_HOLD(10);
|
||||||
|
// General Call Ack
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ACK_GENERAL_CALL) = BIT_CTRL_IC_ACK_GENERAL_CALL(1);
|
||||||
|
// Receive FIFO Threshold Level
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_RX_TL) = 0x0;
|
||||||
|
// Transmit FIFO Threshold Level
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_TX_TL) = 0x0;
|
||||||
|
// Transmit Abort Source
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_TX_ABRT_SOURCE) = 0x0;
|
||||||
|
// DMA Transmit Data Level Register
|
||||||
|
// i2c_reg(REG_DW_I2C_IC_DMA_TDLR) = 0x09;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOC_PS_MODULE
|
||||||
|
REG_POWER_STATE i2cPwrState;
|
||||||
|
// To register a new peripheral device power state
|
||||||
|
i2cPwrState.FuncIdx = I2C0 + pi2c->idx;
|
||||||
|
i2cPwrState.PwrState = ACT;
|
||||||
|
RegPowerState(i2cPwrState);
|
||||||
|
#endif
|
||||||
|
i2c_dump_regs(pi2c);
|
||||||
|
// pi2c->status = DRV_I2C_IC_OFF;
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _i2c_write(i2c_drv_t *pi2c, uint32 address, const char *data, int length, int stop)
|
||||||
|
{
|
||||||
|
test_printf("%s: [%d]%d\n", __func__, length, stop);
|
||||||
|
uint8_t *d = (uint8_t *)data;
|
||||||
|
// Write slave address to TAR.
|
||||||
|
// bit12: = 1 - 10-bit addressing mode when acting as a master
|
||||||
|
// bit11: = 1 - Special Command Enable
|
||||||
|
// bit10: = 1 - Special Command Type START BYTE
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = address;
|
||||||
|
// Enable controller
|
||||||
|
if(i2c_enable(pi2c)) return pi2c->status;
|
||||||
|
while (length--) {
|
||||||
|
// Transmit FIFO is not full
|
||||||
|
if(i2c_ready(pi2c, 0)) return pi2c->status; // BIT_IC_STATUS_TFNF
|
||||||
|
// Fill IC_DATA_CMD[7:0] with the data.
|
||||||
|
// Send stop after last byte ?
|
||||||
|
if(length == 0 && stop) i2c_reg(REG_DW_I2C_IC_DATA_CMD) = *d | BIT_IC_DATA_CMD_STOP;
|
||||||
|
else i2c_reg(REG_DW_I2C_IC_DATA_CMD) = *d;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
// Disable controller.
|
||||||
|
if(stop) {
|
||||||
|
if(i2c_disable(pi2c)) return pi2c->status;
|
||||||
|
}
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _i2c_read(i2c_drv_t *pi2c, uint32 address, const char *data, int length, int stop)
|
||||||
|
{
|
||||||
|
test_printf("%s: [%d]%d\n", __func__, length, stop);
|
||||||
|
uint8_t *d = (uint8_t *)data;
|
||||||
|
int len = length;
|
||||||
|
// Write slave address to TAR.
|
||||||
|
// bit12: = 1 - 10-bit addressing mode when acting as a master
|
||||||
|
// bit11: = 1 - Special Command Enable
|
||||||
|
// bit10: = 1 - Special Command Type START BYTE
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = address;
|
||||||
|
// Enable controller.
|
||||||
|
if(i2c_enable(pi2c)) return pi2c->status;
|
||||||
|
while (len--) {
|
||||||
|
// Transmit FIFO is not full
|
||||||
|
if(i2c_ready(pi2c, 0)) return pi2c->status; // BIT_IC_STATUS_TFE
|
||||||
|
// Send stop after last byte ?
|
||||||
|
if (len == 0 && stop) {
|
||||||
|
// bit10: = 1 - Restart Bit Control
|
||||||
|
// bit9: = 1 - Stop Bit Control
|
||||||
|
// bit8: = 1 - Command read / = 0 Command write
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
} else {
|
||||||
|
// Read command -IC_DATA_CMD[8] = 1.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
}
|
||||||
|
// Receive FIFO ready?
|
||||||
|
if(i2c_reg(REG_DW_I2C_IC_STATUS) & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) {
|
||||||
|
// IC_DATA_CMD[7:0] contains received data.
|
||||||
|
if(length) {
|
||||||
|
*d++ = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
else (volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
while(length) {
|
||||||
|
// Receive FIFO ready?
|
||||||
|
if(i2c_ready(pi2c, 1)) return pi2c->status; // BIT_IC_STATUS_TFE
|
||||||
|
// IC_DATA_CMD[7:0] contains received data.
|
||||||
|
*d++ = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
length--;
|
||||||
|
};
|
||||||
|
// Disable controller.
|
||||||
|
if(stop) {
|
||||||
|
if(i2c_disable(pi2c)) return pi2c->status;
|
||||||
|
}
|
||||||
|
return DRV_I2C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(USE_I2C_CONSOLE) && USE_I2C_CONSOLE
|
||||||
|
//extern void dump_bytes(uint32 addr, int size);
|
||||||
|
extern int print_hex_dump(uint8_t *buf, int len, unsigned char k);
|
||||||
|
extern uint32 hextoul(uint8 *s);
|
||||||
|
|
||||||
|
i2c_drv_t ti2c;
|
||||||
|
/* I2C Init:
|
||||||
|
* ati2c i [sda_pin [scl_pin [mode [speed]]]]
|
||||||
|
* I2C Deinit:
|
||||||
|
* ati2c d
|
||||||
|
* I2C Write:
|
||||||
|
* iati2c W address data1 [data2 ... [data8]...]
|
||||||
|
* I2C write + stop:
|
||||||
|
* iati2c w address data1 [data2 ... [data8]...]
|
||||||
|
* I2C Read:
|
||||||
|
* ati2c R address count
|
||||||
|
* I2C read + stop:
|
||||||
|
* ati2c r address count
|
||||||
|
*/
|
||||||
|
static void fATI2C(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
i2c_drv_t *pi2c = &ti2c;
|
||||||
|
uint8 buf[32];
|
||||||
|
if(argc > 1) {
|
||||||
|
if(argv[1][0] == 'i') {
|
||||||
|
//
|
||||||
|
if(!pi2c->status) {
|
||||||
|
uint8 sda = 0;
|
||||||
|
uint8 scl = 0;
|
||||||
|
uint8 mode = 0;
|
||||||
|
uint32 speed = 0;
|
||||||
|
if(argc > 2) sda = hextoul(argv[2]);
|
||||||
|
else if(argc > 3) scl = hextoul(argv[3]);
|
||||||
|
else if(argc > 4) mode = hextoul(argv[4]);
|
||||||
|
else if(argc > 5) speed = hextoul(argv[5]);
|
||||||
|
if(!sda) sda = PC_4;
|
||||||
|
if(!scl) scl = PC_5;
|
||||||
|
if(!mode) mode = DRV_I2C_FS_MODE;
|
||||||
|
if(!speed) speed = 50000;
|
||||||
|
if(_i2c_setup(pi2c, sda, scl, mode) == DRV_I2C_OK
|
||||||
|
&& _i2c_init(pi2c) == DRV_I2C_OK
|
||||||
|
&& _i2c_set_speed(pi2c, speed) == DRV_I2C_OK) {
|
||||||
|
rtl_printf("I2C%d Init: %02x %02x %02x %08x\n", pi2c->idx, sda, scl, mode, speed);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
rtl_printf("Already init!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
} else if(argv[1][0] == '?') {
|
||||||
|
rtl_printf("I2C Init:\n\tati2c i [sda_pin [scl_pin [mode [speed]]]]\n");
|
||||||
|
rtl_printf("I2C Deinit:\n\tati2c d\n");
|
||||||
|
rtl_printf("I2C Write:\n\tati2c W address data1 [data2 ... [data8]...]\n");
|
||||||
|
rtl_printf("I2C write + stop:\n\tati2c w address data1 [data2 ... [data8]...]\n");
|
||||||
|
rtl_printf("I2C Read:\n\tati2c R address count\n");
|
||||||
|
rtl_printf("I2C read + stop:\n\tati2c r address count\n");
|
||||||
|
rtl_printf("I2C get:\n\tati2c g address wrcount wrdata1 [..wrdata6] rdcount\n");
|
||||||
|
} else {
|
||||||
|
if(pi2c->status) {
|
||||||
|
if(argv[1][0] == 'd') {
|
||||||
|
_i2c_ic_off(pi2c);
|
||||||
|
rtl_printf("I2C%d DeInit\n", pi2c->idx);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
for(i = 0; i + 2 < argc; i++) {
|
||||||
|
buf[i] = hextoul(argv[i+2]);
|
||||||
|
};
|
||||||
|
if(i) {
|
||||||
|
if(argv[1][0] == 'w' || argv[1][0] == 'W') {
|
||||||
|
// >ati2c w 40 2
|
||||||
|
// I2C1 write[1]: 40 02 00
|
||||||
|
// I2C1 drvStatus = 1
|
||||||
|
_i2c_write(pi2c, buf[0], &buf[1], i-1, argv[1][0] == 'w');
|
||||||
|
rtl_printf("I2C%d write[%d]: ", pi2c->idx, i-1);
|
||||||
|
print_hex_dump(buf, i, ' ');
|
||||||
|
rtl_printf("\n");
|
||||||
|
} else if(argv[1][0] == 'r' || argv[1][0] == 'R') {
|
||||||
|
// >ati2c r 40 2
|
||||||
|
// I2C1 read[2]: 40 07 d8
|
||||||
|
// I2C1 drvStatus = 1
|
||||||
|
i = buf[1];
|
||||||
|
if(i > sizeof(buf) - 1) i = sizeof(buf) - 1;
|
||||||
|
_i2c_read(pi2c, buf[0], &buf[1], i, argv[1][0] == 'r');
|
||||||
|
rtl_printf("I2C%d read[%d]: ", pi2c->idx, i);
|
||||||
|
print_hex_dump(buf, i+1, ' ');
|
||||||
|
rtl_printf("\n");
|
||||||
|
} else if(argv[1][0] == 'g') {
|
||||||
|
// >ati2c g 5a 1 6 3
|
||||||
|
// I2C1 get[3]: 5a 5e 3a 6c
|
||||||
|
// I2C1 drvStatus = 1
|
||||||
|
if (argc < 5 || buf[1] == 0 || buf[1] > sizeof(buf) - 2) {
|
||||||
|
rtl_printf("Error command string!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(_i2c_write(pi2c, buf[0], &buf[2], buf[1], 0) >= 0) {
|
||||||
|
i = buf[buf[1] + 2]; // кол-во байт чтения
|
||||||
|
if(i == 0 || i > sizeof(buf) - 1) i = sizeof(buf) - 1;
|
||||||
|
_i2c_read(pi2c, buf[0], &buf[1], i, 1);
|
||||||
|
rtl_printf("I2C%d get[%d]: ", pi2c->idx, i);
|
||||||
|
print_hex_dump(buf, i+1, ' ');
|
||||||
|
}
|
||||||
|
rtl_printf("\n");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rtl_printf("I2C%d Status = %d\n", pi2c->idx, pi2c->status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_i2c[] = {
|
||||||
|
{"ATI2C", 0, fATI2C, ": Test I2C, <i>nit, <d>einit, <w/W>rite, <r/R>ead"},
|
||||||
|
};
|
||||||
|
#endif // USE_I2C_CONSOLE
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CONFIG_I2C_EN
|
55
RTLGDB/Project/driver/i2c_drv.h
Normal file
55
RTLGDB/Project/driver/i2c_drv.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* i2c_drv.h
|
||||||
|
*
|
||||||
|
* Created on: 02/05/2017.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PROJECT_INC_DRIVER_I2C_DRV_H_
|
||||||
|
#define PROJECT_INC_DRIVER_I2C_DRV_H_
|
||||||
|
|
||||||
|
#include "device.h"
|
||||||
|
|
||||||
|
typedef struct _I2C_HND_ {
|
||||||
|
signed char status; // _i2c_status_e
|
||||||
|
unsigned char idx; // Номер контроллера I2C
|
||||||
|
unsigned char io_sel; // Location Index(Pin Mux Selection): S0 -> PC_4, PC_5
|
||||||
|
unsigned char mode; // _i2c_mode_e, if(I2C_FIXED_SPEED_MODE != 0) user set -> i2c_mode_e
|
||||||
|
void * base_regs;
|
||||||
|
} i2c_drv_t, *i2c_drv_p;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DRV_I2C_OFF = 0, // IC I2C DeInit
|
||||||
|
DRV_I2C_OK = 0, // DRV ret Ok
|
||||||
|
DRV_I2C_IC_OFF = 1, // IC I2C Off
|
||||||
|
DRV_I2C_IC_ENABLE = 2, // IC I2C On
|
||||||
|
DRV_I2C_ERR = -1, // DRV ret err
|
||||||
|
DRV_I2C_ABORT = -1, // IC I2C Abort
|
||||||
|
DRV_I2C_TIMEOUT = -3 // IC I2C / DRV ret Timeout
|
||||||
|
} _i2c_status_e;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DRV_I2C_SS_MODE = 1, // Standard Mode (100 Kbps)
|
||||||
|
DRV_I2C_FS_MODE = 2, // Fast Mode (400 Kbps)
|
||||||
|
DRV_I2C_HS_MODE = 3 // Fast Mode Plus (1 Mbps)
|
||||||
|
} _i2c_mode_e;
|
||||||
|
|
||||||
|
#define DRV_I2C_POOL_TIMEOUT 16384
|
||||||
|
#define _i2c_deinit(p) _i2c_ic_off(p)
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
int _i2c_setup(i2c_drv_t *pi2c, PinName sda, PinName scl, unsigned char mode); // _i2c_mode_e
|
||||||
|
int _i2c_set_speed(i2c_drv_t *pi2c, uint32 clk_hz);
|
||||||
|
// Work
|
||||||
|
int _i2c_init(i2c_drv_t *pi2c);
|
||||||
|
int _i2c_write(i2c_drv_t *pi2c, uint32 address, const char *data, int length, int stop);
|
||||||
|
int _i2c_read(i2c_drv_t *pi2c, uint32 address, const char *data, int length, int stop);
|
||||||
|
// Utils
|
||||||
|
int _i2c_break(i2c_drv_t *pi2c);
|
||||||
|
void _i2c_ic_off(i2c_drv_t *pi2c);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PROJECT_INC_DRIVER_I2C_DRV_H_ */
|
374
RTLGDB/Project/efuse_tst.c
Normal file
374
RTLGDB/Project/efuse_tst.c
Normal file
|
@ -0,0 +1,374 @@
|
||||||
|
#include "efuse_tst.h"
|
||||||
|
|
||||||
|
_LONG_CALL_ROM_ extern uint32_t HALEFUSEOneByteReadROM(IN uint32_t CtrlSetting, IN uint16_t Addr, OUT uint8_t *Data, IN uint8_t L25OutVoltage);
|
||||||
|
_LONG_CALL_ROM_ extern uint32_t HALEFUSEOneByteWriteROM(IN uint32_t CtrlSetting, IN uint16_t Addr, IN uint8_t Data, IN uint8_t L25OutVoltage);
|
||||||
|
|
||||||
|
|
||||||
|
//====================================================== Start libs
|
||||||
|
//-----
|
||||||
|
int _HalEFUSEPowerSwitch8195AROM(uint8_t bWrite, uint8_t PwrState, uint8_t L25OutVoltage)
|
||||||
|
{
|
||||||
|
if (PwrState == 1)
|
||||||
|
{
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_EEPROM_CTRL0, (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EEPROM_CTRL0) & 0xFFFFFF) | 0x69000000); // EFUSE_UNLOCK
|
||||||
|
if (!(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN) & BIT_SYS_FEN_EELDR)) // REG_SYS_FUNC_EN BIT_SYS_FEN_EELDR ?
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN) | BIT_SYS_FEN_EELDR);
|
||||||
|
if (!(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL0) & BIT_SYSON_CK_EELDR_EN)) // REG_SYS_CLK_CTRL0 BIT_SYSON_CK_EELDR_EN ?
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL0, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL0) | BIT_SYSON_CK_EELDR_EN);
|
||||||
|
if (!(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) & BIT_PESOC_EELDR_CK_SEL)) // REG_SYS_CLK_CTRL1 BIT_PESOC_EELDR_CK_SEL ?
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) | BIT_PESOC_EELDR_CK_SEL);
|
||||||
|
if (bWrite == 1)
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_REGU_CTRL0, (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_REGU_CTRL0) & 0xFFFFF0FF) | BIT_SYS_REGU_LDO25E_EN | BIT_SYS_REGU_LDO25E_ADJ(L25OutVoltage));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_EEPROM_CTRL0, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EEPROM_CTRL0) & 0xFFFFFF); // EFUSE_UNLOCK
|
||||||
|
if ( bWrite == 1 )
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_REGU_CTRL0, (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_REGU_CTRL0) & (~BIT_SYS_REGU_LDO25E_EN)));
|
||||||
|
}
|
||||||
|
return bWrite;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
int _HALEFUSEOneByteReadROM(uint32_t CtrlSetting, uint16_t Addr, uint8_t *Data, uint8_t L25OutVoltage)
|
||||||
|
{
|
||||||
|
int i = 0, ret = 0;
|
||||||
|
if ( (Addr <= 0xFF) || ((CtrlSetting & 0xFFFF) == 0x26AE) )
|
||||||
|
{
|
||||||
|
_HalEFUSEPowerSwitch8195AROM(1, 1, L25OutVoltage);
|
||||||
|
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_TEST, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_TEST) & (~BIT_SYS_EF_FORCE_PGMEN));
|
||||||
|
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL,
|
||||||
|
(CtrlSetting & (~(BIT_SYS_EF_RWFLAG | (BIT_MASK_SYS_EF_ADDR << BIT_SHIFT_SYS_EF_ADDR) | (BIT_MASK_SYS_EF_DATA << BIT_SHIFT_SYS_EF_DATA))))
|
||||||
|
| BIT_SYS_EF_ADDR(Addr));
|
||||||
|
if(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL) & BIT_SYS_EF_RWFLAG)
|
||||||
|
{
|
||||||
|
*Data = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
else for(;;)
|
||||||
|
{
|
||||||
|
HalDelayUs(1000);
|
||||||
|
if(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL) & BIT_SYS_EF_RWFLAG)
|
||||||
|
{
|
||||||
|
*Data = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL);
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i++ >= 100)
|
||||||
|
{
|
||||||
|
*Data = -1;
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
_HalEFUSEPowerSwitch8195AROM(1, 0, L25OutVoltage);
|
||||||
|
}
|
||||||
|
else *Data = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
int _HALOTPOneByteReadRAM(uint32_t CtrlSetting, int Addr, uint8_t *Data, uint8_t L25OutVoltage)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
if ( (unsigned int)(Addr - 128) > 0x1F )
|
||||||
|
result = 1;
|
||||||
|
else
|
||||||
|
result = _HALEFUSEOneByteReadROM(CtrlSetting, Addr, Data, L25OutVoltage);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
int _HALEFUSEOneByteReadRAM(uint32_t CtrlSetting, int Addr, uint8_t *Data, uint8_t L25OutVoltage)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if ( (unsigned int)(Addr - 160) > 0x33 )
|
||||||
|
{
|
||||||
|
result = _HALEFUSEOneByteReadROM(CtrlSetting, Addr, Data, L25OutVoltage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*Data = -1;
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
//-----
|
||||||
|
void _ReadEOTPContant(uint8_t *pContant)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < 32; i++ )
|
||||||
|
_HALOTPOneByteRead(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), i+128, &pContant[i], L25EOUTVOLTAGE);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//-----
|
||||||
|
void _ReadEfuseContant(int UserCode, uint8_t *pContant)
|
||||||
|
{
|
||||||
|
#define EFUSE_SECTION 11
|
||||||
|
uint8_t *pbuf;
|
||||||
|
int eFuse_Addr;
|
||||||
|
int offset;
|
||||||
|
int bcnt;
|
||||||
|
int i, j;
|
||||||
|
uint8_t DataTemp0;
|
||||||
|
uint8_t DataTemp1;
|
||||||
|
|
||||||
|
pbuf = pContant;
|
||||||
|
eFuse_Addr = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
_HALEFUSEOneByteReadRAM(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), eFuse_Addr, &DataTemp0, L25EOUTVOLTAGE);
|
||||||
|
if ( DataTemp0 == 0x0FF ) break;
|
||||||
|
if ( (DataTemp0 & 0x0F) == 0x0F )
|
||||||
|
{
|
||||||
|
_HALEFUSEOneByteReadRAM(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), ++eFuse_Addr, &DataTemp1, L25EOUTVOLTAGE);
|
||||||
|
offset = ((DataTemp1 & 0x0F0) | (DataTemp0 >> 4)) >> 1;
|
||||||
|
bcnt = (~DataTemp1) & 0x0F;
|
||||||
|
if (((UserCode + EFUSE_SECTION) << 2) > offset || offset >= ((UserCode + EFUSE_SECTION + 1) << 2))
|
||||||
|
{
|
||||||
|
while (bcnt)
|
||||||
|
{
|
||||||
|
if (bcnt & 1) eFuse_Addr += 2;
|
||||||
|
bcnt >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int base = (offset - ((EFUSE_SECTION + UserCode) << 2)) << 3;
|
||||||
|
j = 0;
|
||||||
|
while ( bcnt )
|
||||||
|
{
|
||||||
|
if ( bcnt & 1 )
|
||||||
|
{
|
||||||
|
_HALEFUSEOneByteReadRAM(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), ++eFuse_Addr, &pbuf[base + j], L25EOUTVOLTAGE);
|
||||||
|
_HALEFUSEOneByteReadRAM(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), ++eFuse_Addr, &pbuf[base + j + 1], L25EOUTVOLTAGE);
|
||||||
|
}
|
||||||
|
bcnt >>= 1;
|
||||||
|
j += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = (~DataTemp0) & 0x0F; i; i >>= 1 )
|
||||||
|
{
|
||||||
|
if (i & 1) eFuse_Addr += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eFuse_Addr++;
|
||||||
|
}
|
||||||
|
while (eFuse_Addr <= 0x7E);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
void _ReadEfuseContant1(uint8_t *pContant)
|
||||||
|
{
|
||||||
|
_ReadEfuseContant(0, pContant);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
void _ReadEfuseContant2(uint8_t *pContant)
|
||||||
|
{
|
||||||
|
_ReadEfuseContant(1, pContant);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----
|
||||||
|
void _ReadEfuseContant3(uint8_t *pContant)
|
||||||
|
{
|
||||||
|
_ReadEfuseContant(2, pContant);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int _efuse_otp_read(uint8_t address, uint8_t len, uint8_t *buf)
|
||||||
|
{
|
||||||
|
uint8_t content[32]; // the OTP max length is 32
|
||||||
|
|
||||||
|
if((address + len) > 32) return -1;
|
||||||
|
_ReadEOTPContant(content);
|
||||||
|
_memcpy(buf, content + address, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//====================================================== end libs
|
||||||
|
|
||||||
|
//======================================================
|
||||||
|
// OTP : one time programming
|
||||||
|
//======================================================
|
||||||
|
|
||||||
|
uint8_t buf[128];
|
||||||
|
|
||||||
|
#define OTP_MAX_LEN 32 // The OTP max length is 32 bytes
|
||||||
|
static void efuse_otp_task(void *param)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
DBG_8195A("\nefuse OTP block: Test Start\n");
|
||||||
|
// read OTP content
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
ret = efuse_otp_read(0, OTP_MAX_LEN, buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
DBG_8195A("efuse OTP block: read address and length error\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
for(i=0; i<OTP_MAX_LEN; i+=8)
|
||||||
|
{
|
||||||
|
DBG_8195A("[%d]\t%02X %02X %02X %02X %02X %02X %02X %02X\n", i, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
int x = 0;
|
||||||
|
while(x < 1024)
|
||||||
|
{
|
||||||
|
DBG_8195A("efuse OTP block at %d:\n", x);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
for(i = 0; i < sizeof(buf); i++ )
|
||||||
|
// _HALEFUSEOneByteReadROM(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL), i+x, &buf[i], L25EOUTVOLTAGE);
|
||||||
|
_HALEFUSEOneByteReadROM(0x26AF, i+x, &buf[i], L25EOUTVOLTAGE);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
for(i = 0; i < sizeof(buf); i+=8)
|
||||||
|
{
|
||||||
|
DBG_8195A("[%04x]\t%02X %02X %02X %02X %02X %02X %02X %02X\n", i+x, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
x+=sizeof(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// write OTP content
|
||||||
|
_memset(buf, 0xFF, OTP_MAX_LEN);
|
||||||
|
if(0){ // fill your data
|
||||||
|
for(i=0; i<OTP_MAX_LEN; i++)
|
||||||
|
buf[i] = i;
|
||||||
|
}
|
||||||
|
if(0){ // write
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
ret = efuse_otp_write(0, OTP_MAX_LEN, buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
if(ret < 0){
|
||||||
|
DBG_8195A("efuse OTP block: write address and length error\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
DBG_8195A("\nWrite Done.\n");
|
||||||
|
}
|
||||||
|
DBG_8195A("\n");
|
||||||
|
|
||||||
|
// read OTP content
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
ret = efuse_otp_read(0, OTP_MAX_LEN, buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
if(ret < 0){
|
||||||
|
DBG_8195A("efuse OTP block: read address and length error\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
for(i=0; i<OTP_MAX_LEN; i+=8){
|
||||||
|
DBG_8195A("[%d]\t%02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||||
|
i, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
DBG_8195A("efuse OTP block: Test Done\n");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
DBG_8195A("efuse OTP block: Test Fail!\n");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//======================================================
|
||||||
|
// MTP : M? time programming
|
||||||
|
//======================================================
|
||||||
|
|
||||||
|
#define FCONF_MAX_LEN 32 // The MTP max length is 32 bytes
|
||||||
|
static void fconf_read_task(void *param)
|
||||||
|
{
|
||||||
|
//int ret;
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
DBG_8195A("\nefuse MTP block: Test Start\n");
|
||||||
|
// read MTP content
|
||||||
|
_memset(buf, 0xFF, FCONF_MAX_LEN);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
efuse_mtp_read(buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
for(i=0; i<FCONF_MAX_LEN; i+=8)
|
||||||
|
{
|
||||||
|
DBG_8195A("[%d]\t%02X %02X %02X %02X %02X %02X %02X %02X\n", i, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
DBG_8195A("\nefuse MTP block: Test Start\n");
|
||||||
|
// read MTP content
|
||||||
|
_memset(buf, 0xFF, FCONF_MAX_LEN);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
_ReadEfuseContant1(buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
for(i=0; i<FCONF_MAX_LEN; i+=8)
|
||||||
|
{
|
||||||
|
DBG_8195A("[%d]\t%02X %02X %02X %02X %02X %02X %02X %02X\n", i, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
// write MTP content
|
||||||
|
_memset(buf, 0xFF, MTP_MAX_LEN);
|
||||||
|
if(0){ // fill your data
|
||||||
|
for(i=0; i<MTP_MAX_LEN; i++)
|
||||||
|
buf[i] = i;
|
||||||
|
}
|
||||||
|
if(0){ // write
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
ret = efuse_mtp_write(buf, MTP_MAX_LEN);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
if(ret < 0){
|
||||||
|
DBG_8195A("efuse MTP block: write length error\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
DBG_8195A("\nWrite Done\n");
|
||||||
|
DBG_8195A("Remain %d\n", efuse_get_remaining_length());
|
||||||
|
}
|
||||||
|
DBG_8195A("\n");
|
||||||
|
|
||||||
|
// read MTP content
|
||||||
|
_memset(buf, 0xFF, MTP_MAX_LEN);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_EFUSE);
|
||||||
|
efuse_mtp_read(buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_EFUSE);
|
||||||
|
for(i=0; i<MTP_MAX_LEN; i+=8){
|
||||||
|
DBG_8195A("[%d]\t%02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||||
|
i, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
DBG_8195A("efuse MTP block: Test Done\n");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
//exit:
|
||||||
|
DBG_8195A("efuse MTP block: Test Fail!\n");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void efuse_main(void)
|
||||||
|
{
|
||||||
|
#if EFUSE_SHOW > 0
|
||||||
|
|
||||||
|
ConfigDebugErr = -1; // ~_DBG_GDMA_;
|
||||||
|
ConfigDebugInfo = -1; // ~_DBG_GDMA_;
|
||||||
|
ConfigDebugWarn = -1; // ~_DBG_GDMA_;
|
||||||
|
|
||||||
|
DBG_8195A("EFUSE_CTRL=%08x\n", HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_EFUSE_CTRL));
|
||||||
|
|
||||||
|
if(xTaskCreate(fconf_read_task, ((const char*)"efuse_mtp_task"), 512, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS)
|
||||||
|
printf("\n\r%s xTaskCreate(efuse_mtp_task) failed", __FUNCTION__);
|
||||||
|
|
||||||
|
if(xTaskCreate(efuse_otp_task, ((const char*)"efuse_otp_task"), 512, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)
|
||||||
|
printf("\n\r%s xTaskCreate(efuse_otp_task) failed", __FUNCTION__);
|
||||||
|
|
||||||
|
// Enable Schedule, Start Kernel
|
||||||
|
//if(rtw_get_scheduler_state() == OS_SCHEDULER_NOT_STARTED)
|
||||||
|
// vTaskStartScheduler();
|
||||||
|
//else
|
||||||
|
// vTaskDelete(NULL);
|
||||||
|
|
||||||
|
//for (;;) {}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
13
RTLGDB/Project/efuse_tst.h
Normal file
13
RTLGDB/Project/efuse_tst.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "hal_efuse.h"
|
||||||
|
#include "efuse_api.h"
|
||||||
|
#include "osdep_service.h"
|
||||||
|
#include "device_lock.h"
|
||||||
|
|
||||||
|
#define EFUSE_SHOW 1
|
||||||
|
|
||||||
|
// https://esp8266.ru/forum/threads/calibration-data.1631/
|
||||||
|
|
||||||
|
void efuse_main(void);
|
30
RTLGDB/Project/feep_config.h
Normal file
30
RTLGDB/Project/feep_config.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* feep_config.h
|
||||||
|
*
|
||||||
|
* Created on: 06 нояб. 2016 г.
|
||||||
|
* Author: PVV
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INC_FEEP_CONFIG_H_
|
||||||
|
#define _INC_FEEP_CONFIG_H_
|
||||||
|
|
||||||
|
//#define FEEP_ID_WIFI_CFG 0x4347 // id:'0W', type: struct wlan_fast_reconnect
|
||||||
|
//#define FEEP_ID_WIFI_AP_CFG 0x5041 // id:'1W', type: struct rtw_wifi_config_t
|
||||||
|
#define FEEP_ID_UART_CFG 0x5530 // id:'0U', type: UART_LOG_CONF
|
||||||
|
#define FEEP_ID_LWIP_CFG 0x4C30 // id:'0L', type: struct atcmd_lwip_conf
|
||||||
|
#define FEEP_ID_DHCP_CFG 0x4430 // id:'0D', type: struct _sdhcp_cfg
|
||||||
|
|
||||||
|
typedef struct _sdhcp_cfg {
|
||||||
|
uint8_t mode; // =0 dhcp off, =1 - dhcp on, =2 Static ip, =3 - auto
|
||||||
|
uint32_t ip;
|
||||||
|
uint32_t mask;
|
||||||
|
uint32_t gw;
|
||||||
|
}dhcp_cfg;
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define FEEP_WRITE_WIFI_CFG(x) flash_write_cfg(x, FEEP_ID_WIFI_CFG, sizeof(struct wlan_fast_reconnect))
|
||||||
|
#define FEEP_READ_WIFI_CFG(x) flash_read_cfg(x, FEEP_ID_WIFI_CFG, sizeof(struct wlan_fast_reconnect))
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _INC_FEEP_CONFIG_H_ */
|
46
RTLGDB/Project/flashconf_tst.c
Normal file
46
RTLGDB/Project/flashconf_tst.c
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include "flashconf_tst.h"
|
||||||
|
|
||||||
|
#define FCONF_MAX_LEN 0x2000
|
||||||
|
#define FCONF_ADDR_SHIFT 0x9000
|
||||||
|
|
||||||
|
static void fconf_read_task(void *param)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
uint8_t buf[FCONF_MAX_LEN];
|
||||||
|
flash_t flash;
|
||||||
|
|
||||||
|
DBG_8195A("\nFlash conf block: Test Start\n");
|
||||||
|
_memset(buf, 0xFF, FCONF_MAX_LEN);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_FLASH);
|
||||||
|
flash_stream_read(&flash, FCONF_ADDR_SHIFT, FCONF_MAX_LEN, &buf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_FLASH);
|
||||||
|
for(i=0; i < FCONF_MAX_LEN; i+=8)
|
||||||
|
{
|
||||||
|
DBG_8195A("[%x]\t%02X %02X %02X %02X %02X %02X %02X %02X\n", i + FCONF_ADDR_SHIFT, buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG_8195A("Flash conf block: Test Done\n");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flashconf_main(void)
|
||||||
|
{
|
||||||
|
#if FLASHCONF_SHOW > 0
|
||||||
|
|
||||||
|
ConfigDebugErr = -1; // ~_DBG_GDMA_;
|
||||||
|
ConfigDebugInfo = -1; // ~_DBG_GDMA_;
|
||||||
|
ConfigDebugWarn = -1; // ~_DBG_GDMA_;
|
||||||
|
|
||||||
|
if(xTaskCreate(fconf_read_task, ((const char*)"fconf_read_task"), 512, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS)
|
||||||
|
printf("\n\r%s xTaskCreate(fconf_read_task) failed", __FUNCTION__);
|
||||||
|
|
||||||
|
// Enable Schedule, Start Kernel
|
||||||
|
if(rtw_get_scheduler_state() == OS_SCHEDULER_NOT_STARTED)
|
||||||
|
vTaskStartScheduler();
|
||||||
|
else
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
|
||||||
|
//for (;;) {}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
11
RTLGDB/Project/flashconf_tst.h
Normal file
11
RTLGDB/Project/flashconf_tst.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "hal_efuse.h"
|
||||||
|
#include "flash_api.h"
|
||||||
|
#include "osdep_service.h"
|
||||||
|
#include "device_lock.h"
|
||||||
|
|
||||||
|
#define FLASHCONF_SHOW 1
|
||||||
|
|
||||||
|
void flashconf_main(void);
|
91
RTLGDB/Project/ina219/ina219.h
Normal file
91
RTLGDB/Project/ina219/ina219.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/**************************************************************************/
|
||||||
|
/**************************************************************************/
|
||||||
|
#ifndef _INA219_H_
|
||||||
|
#define _INA219_H_
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
I2C ADDRESS/BITS
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_ADDRESS (0x80) // 1000000r (A0+A1=GND)
|
||||||
|
#define INA219_READ (0x01)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
CONFIG REGISTER (R/W)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_CONFIG (0x00)
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
#define INA219_CONFIG_RESET (0x8000) // Reset Bit
|
||||||
|
|
||||||
|
#define INA219_CONFIG_BVOLTAGERANGE_MASK (0x2000) // Bus Voltage Range Mask
|
||||||
|
#define INA219_CONFIG_BVOLTAGERANGE_16V (0x0000) // 0-16V Range
|
||||||
|
#define INA219_CONFIG_BVOLTAGERANGE_32V (0x2000) // 0-32V Range
|
||||||
|
|
||||||
|
#define INA219_CONFIG_GAIN_MASK (0x1800) // Gain Mask
|
||||||
|
#define INA219_CONFIG_GAIN_1_40MV (0x0000) // Gain 1, 40mV Range
|
||||||
|
#define INA219_CONFIG_GAIN_2_80MV (0x0800) // Gain 2, 80mV Range
|
||||||
|
#define INA219_CONFIG_GAIN_4_160MV (0x1000) // Gain 4, 160mV Range
|
||||||
|
#define INA219_CONFIG_GAIN_8_320MV (0x1800) // Gain 8, 320mV Range
|
||||||
|
|
||||||
|
#define INA219_CONFIG_BADCRES_MASK (0x0780) // Bus ADC Resolution Mask
|
||||||
|
#define INA219_CONFIG_BADCRES_9BIT (0x0080) // 9-bit bus res = 0..511
|
||||||
|
#define INA219_CONFIG_BADCRES_10BIT (0x0100) // 10-bit bus res = 0..1023
|
||||||
|
#define INA219_CONFIG_BADCRES_11BIT (0x0200) // 11-bit bus res = 0..2047
|
||||||
|
#define INA219_CONFIG_BADCRES_12BIT (0x0400) // 12-bit bus res = 0..4097
|
||||||
|
|
||||||
|
#define INA219_CONFIG_SADCRES_MASK (0x0078) // Shunt ADC Resolution and Averaging Mask
|
||||||
|
#define INA219_CONFIG_SADCRES_9BIT_1S_84US (0x0000) // 1 x 9-bit shunt sample
|
||||||
|
#define INA219_CONFIG_SADCRES_10BIT_1S_148US (0x0008) // 1 x 10-bit shunt sample
|
||||||
|
#define INA219_CONFIG_SADCRES_11BIT_1S_276US (0x0010) // 1 x 11-bit shunt sample
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_1S_532US (0x0018) // 1 x 12-bit shunt sample
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_1S_532US_ (0x0040) // 1 x 12-bit shunt sample
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_2S_1060US (0x0048) // 2 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_4S_2130US (0x0050) // 4 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_8S_4260US (0x0058) // 8 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060) // 16 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_32S_17MS (0x0068) // 32 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_64S_34MS (0x0070) // 64 x 12-bit shunt samples averaged together
|
||||||
|
#define INA219_CONFIG_SADCRES_12BIT_128S_69MS (0x0078) // 128 x 12-bit shunt samples averaged together
|
||||||
|
|
||||||
|
#define INA219_CONFIG_MODE_MASK (0x0007) // Operating Mode Mask
|
||||||
|
#define INA219_CONFIG_MODE_POWERDOWN (0x0000)
|
||||||
|
#define INA219_CONFIG_MODE_SVOLT_TRIGGERED (0x0001)
|
||||||
|
#define INA219_CONFIG_MODE_BVOLT_TRIGGERED (0x0002)
|
||||||
|
#define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003)
|
||||||
|
#define INA219_CONFIG_MODE_ADCOFF (0x0004)
|
||||||
|
#define INA219_CONFIG_MODE_SVOLT_CONTINUOUS (0x0005)
|
||||||
|
#define INA219_CONFIG_MODE_BVOLT_CONTINUOUS (0x0006)
|
||||||
|
#define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
SHUNT VOLTAGE REGISTER (R)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_SHUNTVOLTAGE (0x01)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
BUS VOLTAGE REGISTER (R)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_BUSVOLTAGE (0x02)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
POWER REGISTER (R)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_POWER (0x03)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
CURRENT REGISTER (R)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_CURRENT (0x04)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*=========================================================================
|
||||||
|
CALIBRATION REGISTER (R/W)
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
#define INA219_REG_CALIBRATION (0x05)
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
#endif // _INA219_H_
|
275
RTLGDB/Project/ina219/ina219buf.c
Normal file
275
RTLGDB/Project/ina219/ina219buf.c
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
/*
|
||||||
|
* ina219buf.c
|
||||||
|
*
|
||||||
|
* Created on: 02/05/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
|
||||||
|
#include "basic_types.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "osdep_api.h"
|
||||||
|
|
||||||
|
//#include "i2c_api.h"
|
||||||
|
//#include "i2c_ex_api.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "rtl_lib.h"
|
||||||
|
#include "ina219/ina219buf.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
|
||||||
|
INA219DRV ina219drv = {
|
||||||
|
.addr = INA219_ADDRESS>>1,
|
||||||
|
.config =
|
||||||
|
INA219_CONFIG_BVOLTAGERANGE_16V | // INA219_CONFIG_BVOLTAGERANGE_32V
|
||||||
|
INA219_CONFIG_GAIN_8_320MV | // INA219_CONFIG_GAIN_1_40MV |
|
||||||
|
INA219_CONFIG_BADCRES_12BIT |
|
||||||
|
INA219_CONFIG_SADCRES_12BIT_2S_1060US | // INA219_CONFIG_SADCRES_12BIT_128S_69MS |
|
||||||
|
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS,
|
||||||
|
.calibration = 8192,
|
||||||
|
.i2c.status = DRV_I2C_OFF,
|
||||||
|
.i2c.idx = 1, // I2C1
|
||||||
|
.i2c.io_sel = S0, // PC_4, PC_5
|
||||||
|
.i2c.mode = DRV_I2C_FS_MODE // DRV_I2C_HS_MODE
|
||||||
|
};
|
||||||
|
|
||||||
|
void ina219_write(unsigned char reg, unsigned short data)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
p->buf_i2c.uc[0] = reg;
|
||||||
|
p->buf_i2c.uc[1] = (unsigned char)((unsigned short)(data >> 8));
|
||||||
|
p->buf_i2c.uc[2] = (unsigned char)data;
|
||||||
|
_i2c_write(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 3, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ina219_read(unsigned char reg)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
p->buf_i2c.uc[0] = reg;
|
||||||
|
_i2c_write(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 1, 1);
|
||||||
|
p->buf_i2c.ui = 0;
|
||||||
|
_i2c_read(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 2, 1);
|
||||||
|
return (p->buf_i2c.uc[0] << 8) | p->buf_i2c.uc[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define i2c_reg(r) *((volatile uint32 *)(pi2c->base_regs + r))
|
||||||
|
|
||||||
|
/* Пример непрерывного чтения регистров
|
||||||
|
* тока и напряжения IN219 по прерыванию таймера */
|
||||||
|
void ina_tick_handler(void *par) {
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
switch(p->status) {
|
||||||
|
default:
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
p->status = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
p->status = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// Заполним FIFO ic I2C командами инициализации INA219
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CONFIG;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = p->config >> 8;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (p->config & 0x0FF) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CALIBRATION;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = p->calibration >> 8;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (p->calibration & 0x0FF) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
//
|
||||||
|
p->status = 3;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (i2c_reg(REG_DW_I2C_IC_RAW_INTR_STAT) & BIT_IC_RAW_INTR_STAT_TX_ABRT) {
|
||||||
|
uint32 tmp = i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
p->errs++;
|
||||||
|
p->status = 0;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// Считаем готовые значения из FIFO ic I2C
|
||||||
|
p->buf_i2c.uc[1] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
p->buf_i2c.uc[0] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
p->buf_i2c.uc[3] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
p->buf_i2c.uc[2] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
p->count++;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
// Заполним FIFO ic I2C командами чтения
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_BUSVOLTAGE | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Read command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_SHUNTVOLTAGE | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Read command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
p->status = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ina219_init(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
if(p->init <= 0) {
|
||||||
|
rtl_printf("Init INA219\n");
|
||||||
|
p->status = 0;
|
||||||
|
p->count = 0;
|
||||||
|
p->errs = 0;
|
||||||
|
// (!) Установки драйвера I2C заданы в структуре ina219drv
|
||||||
|
// rtl_printf("INA219 control reg = 0x%04x\n", p->config);
|
||||||
|
// _i2c_setup(&p->i2c, INA219_I2C_PIN_SDA , INA219_I2C_PIN_SCL, DRV_I2C_FS_MODE); // == DRV_I2C_OK?
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
// _i2c_set_speed(&p->i2c, INA219_I2C_BUS_CLK);
|
||||||
|
rtl_printf("I2C%d mode = %d, drvStatus = %d\n", p->i2c.idx, p->i2c.mode, p->i2c.status);
|
||||||
|
// (!) Инициализация INA219 перенесена в прерывание таймера
|
||||||
|
// ina219_write(INA219_REG_CONFIG, p->config);
|
||||||
|
// ina219_write(INA219_REG_CALIBRATION, p->calibration);
|
||||||
|
// Initial a periodical timer
|
||||||
|
gtimer_init(&p->timer, INA219_TIMER);
|
||||||
|
// Tick every 0.000532 sec (N*532 μs)
|
||||||
|
uint32 tus = 1 << ((p->config >> 3) & 7);
|
||||||
|
tus *= 532;
|
||||||
|
rtl_printf("INA219 Read Period = %u us\n", tus);
|
||||||
|
gtimer_start_periodical(&p->timer, tus, (void*)ina_tick_handler, (uint32_t)&ina219drv);
|
||||||
|
p->init = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ina219_deinit(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
if(p->init > 0) {
|
||||||
|
rtl_printf("Deinit INA219\n");
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
// (!) Не используется ina219_write / ina219_read для сокращения кода
|
||||||
|
// ina219_write(INA219_REG_CONFIG, INA219_CONFIG_MODE_POWERDOWN);
|
||||||
|
// Break controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) |= 2;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
// Заполним FIFO ic I2C командой отключения INA219
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Write addr reg. INA219 POWER_DOWN
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CONFIG;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (INA219_CONFIG_MODE_POWERDOWN >> 8);
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (INA219_CONFIG_MODE_POWERDOWN & 0x0F) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
_i2c_deinit(&p->i2c);
|
||||||
|
}
|
||||||
|
p->init = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ShowIna(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
rtl_printf("INA219: %d, %d\n", p->buf_i2c.us[0], p->buf_i2c.ss[1]);
|
||||||
|
rtl_printf("INA219: Cnt = %u, Err = %u\n", p->count, p->errs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fATINA(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc > 1) {
|
||||||
|
if(atoi(argv[1])) {
|
||||||
|
ina219_init();
|
||||||
|
vTaskDelay(10); // +WDT
|
||||||
|
}
|
||||||
|
else ina219_deinit();
|
||||||
|
}
|
||||||
|
ShowIna();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern void dump_bytes(uint32 addr, int size);
|
||||||
|
extern uint32 hextoul(uint8 *s);
|
||||||
|
|
||||||
|
i2c_drv_t ti2c;
|
||||||
|
/* Sample:
|
||||||
|
* ati2c i
|
||||||
|
* ati2c w 40 5
|
||||||
|
* ati2c r 40 2
|
||||||
|
*/
|
||||||
|
static void fATI2C(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
i2c_drv_t *pi2c = &ti2c;
|
||||||
|
uint8 buf[32];
|
||||||
|
if(argc > 1) {
|
||||||
|
if(argv[1][0] == 'i') {
|
||||||
|
if(!pi2c->status) {
|
||||||
|
uint8 sda = 0;
|
||||||
|
uint8 scl = 0;
|
||||||
|
uint8 mode = 0;
|
||||||
|
uint32 speed = 0;
|
||||||
|
if(argc > 2) sda = hextoul(argv[2]);
|
||||||
|
else if(argc > 3) scl = hextoul(argv[3]);
|
||||||
|
else if(argc > 4) mode = hextoul(argv[4]);
|
||||||
|
else if(argc > 5) speed = hextoul(argv[5]);
|
||||||
|
if(!sda) sda = PC_4;
|
||||||
|
if(!scl) scl = PC_5;
|
||||||
|
if(!mode) mode = DRV_I2C_FS_MODE;
|
||||||
|
if(!speed) speed = 400000;
|
||||||
|
if(_i2c_setup(pi2c, sda, scl, mode) == DRV_I2C_OK
|
||||||
|
&& _i2c_init(pi2c) == DRV_I2C_OK
|
||||||
|
&& _i2c_set_speed(pi2c, speed) == DRV_I2C_OK) {
|
||||||
|
rtl_printf("I2C%d Init\n", pi2c->idx);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
rtl_printf("Already init!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
if(pi2c->status) {
|
||||||
|
if(argv[1][0] == 'd') {
|
||||||
|
_i2c_ic_off(pi2c);
|
||||||
|
rtl_printf("I2C%d DeInit\n", pi2c->idx);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
for(i = 0; i + 2 < argc; i++) {
|
||||||
|
buf[i] = hextoul(argv[i+2]);
|
||||||
|
};
|
||||||
|
if(i) {
|
||||||
|
if(argv[1][0] == 'w') {
|
||||||
|
_i2c_write(pi2c, buf[0], &buf[1], i-1, 1);
|
||||||
|
rtl_printf("I2C%d write[%d]:\n", pi2c->idx, i-1);
|
||||||
|
dump_bytes(&buf[0], i);
|
||||||
|
}
|
||||||
|
else if(argv[1][0] == 'r') {
|
||||||
|
i = buf[1];
|
||||||
|
if(i > sizeof(buf) - 1) i = sizeof(buf) - 1;
|
||||||
|
_i2c_read(pi2c, buf[0], &buf[1], i, 1);
|
||||||
|
rtl_printf("I2C%d read[%d]:\n", pi2c->idx, i);
|
||||||
|
dump_bytes(&buf[0], i+1);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rtl_printf("I2C%d drvStatus = %d\n", pi2c->idx, pi2c->status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_ina219[] = {
|
||||||
|
{"ATI2C", 0, fATI2C, ": Test I2C, <i>nit, <d>einit, <w>rite, <r>ead"},
|
||||||
|
{"ATINA", 0, fATINA, "=[0/1]: INA219 =1 start, =0 stop"}
|
||||||
|
};
|
||||||
|
|
43
RTLGDB/Project/ina219/ina219buf.h
Normal file
43
RTLGDB/Project/ina219/ina219buf.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/**************************************************************************
|
||||||
|
* Драйвер для INA219
|
||||||
|
**************************************************************************/
|
||||||
|
#ifndef _INA219DRV_H_
|
||||||
|
#define _INA219DRV_H_
|
||||||
|
#include "ina219/ina219.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "timer_api.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
|
||||||
|
typedef struct _ina219data {
|
||||||
|
signed short voltage; // Voltage, 1mV
|
||||||
|
signed short current; // Current, 50uA?
|
||||||
|
signed short power; // Power, 1mW
|
||||||
|
unsigned short shunt; // 10uV
|
||||||
|
} INA219DATA, *PINA219DATA;
|
||||||
|
|
||||||
|
typedef struct _ina219drv {
|
||||||
|
unsigned char status;
|
||||||
|
unsigned char addr;
|
||||||
|
signed char init;
|
||||||
|
unsigned char tmp;
|
||||||
|
unsigned short config; // регистр конфигурации INA219
|
||||||
|
unsigned short calibration; // коэф. шунта для INA219
|
||||||
|
unsigned int count;
|
||||||
|
unsigned int errs;
|
||||||
|
gtimer_t timer;
|
||||||
|
union { // буфер
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned short us[2];
|
||||||
|
signed short ss[2];
|
||||||
|
unsigned int ui;
|
||||||
|
} buf_i2c;
|
||||||
|
i2c_drv_t i2c;
|
||||||
|
} INA219DRV, *PINA219DRV;
|
||||||
|
|
||||||
|
|
||||||
|
#define INA219_I2C_PIN_SDA PC_4
|
||||||
|
#define INA219_I2C_PIN_SCL PC_5
|
||||||
|
#define INA219_I2C_BUS_CLK 300000 //hz
|
||||||
|
#define INA219_TIMER TIMER3 // используемый таймер
|
||||||
|
|
||||||
|
#endif // _INA219DRV_H_
|
347
RTLGDB/Project/ina219/ina219drv.c
Normal file
347
RTLGDB/Project/ina219/ina219drv.c
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* ina219drv.c
|
||||||
|
*
|
||||||
|
* Created on: 02/05/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "rtl8195a.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "PinNames.h"
|
||||||
|
|
||||||
|
#include "basic_types.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "osdep_api.h"
|
||||||
|
|
||||||
|
//#include "i2c_api.h"
|
||||||
|
//#include "i2c_ex_api.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "rtl_lib.h"
|
||||||
|
#include "ina219/ina219drv.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
#include "platform_stdlib.h"
|
||||||
|
#include "web_websocket.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
|
||||||
|
#include "hal_com_reg.h"
|
||||||
|
|
||||||
|
//#define ReadTSF_Lo32() (*((volatile unsigned int *)(WIFI_REG_BASE + REG_TSFTR)))
|
||||||
|
//#define ReadTSF_Hi32() (*((volatile unsigned int *)(WIFI_REG_BASE + REG_TSFTR1)))
|
||||||
|
|
||||||
|
INA219DRV ina219drv = {
|
||||||
|
.addr = INA219_ADDRESS>>1,
|
||||||
|
.config =
|
||||||
|
INA219_CONFIG_BVOLTAGERANGE_16V | // INA219_CONFIG_BVOLTAGERANGE_32V
|
||||||
|
INA219_CONFIG_GAIN_8_320MV | // INA219_CONFIG_GAIN_1_40MV |
|
||||||
|
INA219_CONFIG_BADCRES_12BIT |
|
||||||
|
INA219_CONFIG_SADCRES_12BIT_1S_532US | //INA219_CONFIG_SADCRES_12BIT_2S_1060US | // INA219_CONFIG_SADCRES_12BIT_1S_532US | //
|
||||||
|
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS,
|
||||||
|
.calibration = 8192, // при шунте 0.1 Ом
|
||||||
|
.buf_idx = 709, // циклический буфер на 710 замеров (по 4 байт -> sizeof(INA219DATA))
|
||||||
|
// Если шаг заполнения 1 ms -> буфер на 0.71 сек
|
||||||
|
// Оптимизация под TCP: (TCP_MSS*2 - 80)/4 = (1460*2 - 80)/4 = 710
|
||||||
|
.i2c.status = DRV_I2C_OFF,
|
||||||
|
.i2c.idx = 1, // I2C1
|
||||||
|
.i2c.io_sel = S0, // PC_4, PC_5
|
||||||
|
.i2c.mode = DRV_I2C_FS_MODE // DRV_I2C_HS_MODE
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
void ina219_write(unsigned char reg, unsigned short data)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
p->buf_i2c.uc[0] = reg;
|
||||||
|
p->buf_i2c.uc[1] = (unsigned char)((unsigned short)(data >> 8));
|
||||||
|
p->buf_i2c.uc[2] = (unsigned char)data;
|
||||||
|
_i2c_write(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 3, 1);
|
||||||
|
UBaseType_t f;
|
||||||
|
portBASE_TYPE d;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ina219_read(unsigned char reg)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
p->buf_i2c.uc[0] = reg;
|
||||||
|
_i2c_write(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 1, 1);
|
||||||
|
p->buf_i2c.ui = 0;
|
||||||
|
_i2c_read(&p->i2c, p->addr, (const char *)p->buf_i2c.uc, 2, 1);
|
||||||
|
return (p->buf_i2c.uc[0] << 8) | p->buf_i2c.uc[1];
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define i2c_reg(r) *((volatile uint32 *)(pi2c->base_regs + r))
|
||||||
|
|
||||||
|
/* Пример непрерывного чтения регистров
|
||||||
|
* тока и напряжения IN219 по прерыванию таймера */
|
||||||
|
void ina_tick_handler(void *par) {
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
switch(p->status) {
|
||||||
|
default:
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
p->status = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
p->status = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// Заполним FIFO ic I2C командами инициализации INA219
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CONFIG;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = p->config >> 8;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (p->config & 0x0FF) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CALIBRATION;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = p->calibration >> 8;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (p->calibration & 0x0FF) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
//
|
||||||
|
p->status = 3;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (i2c_reg(REG_DW_I2C_IC_RAW_INTR_STAT) & BIT_IC_RAW_INTR_STAT_TX_ABRT) {
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_CLR_INTR);
|
||||||
|
p->errs++;
|
||||||
|
p->status = 0;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if(p->pbuf) {
|
||||||
|
PINA219DATA pd = p->pbuf + p->buf_tx;
|
||||||
|
// Считаем готовые значения из FIFO ic I2C
|
||||||
|
pd->v.vuc[1] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
pd->v.vuc[0] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
pd->i.iuc[1] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
pd->i.iuc[0] = i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
|
||||||
|
else p->buf_tx++;
|
||||||
|
if(p->buf_rx == p->buf_tx) {
|
||||||
|
p->overrun++; // todo: if(p->overrun++ > 100000) deinit() ?
|
||||||
|
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
|
||||||
|
else p->buf_rx++;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
(volatile uint32)i2c_reg(REG_DW_I2C_IC_DATA_CMD);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
// Заполним FIFO ic I2C командами чтения
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_BUSVOLTAGE | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Read command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Write addr reg.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_SHUNTVOLTAGE | BIT_IC_DATA_CMD_STOP;
|
||||||
|
// Read command.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = BIT_IC_DATA_CMD_CMD | BIT_IC_DATA_CMD_STOP;
|
||||||
|
p->status = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 ina219_chkdata(uint16 cnt)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
int len = p->buf_tx - p->buf_rx;
|
||||||
|
if(len < 0) len += p->buf_idx + 1;
|
||||||
|
if(cnt > (uint16)len) cnt = (uint16)len;
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ina219_getdata(void *pd, uint16 cnt)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
if(p->init <= 0) return 0;
|
||||||
|
// cnt = ina219_chkdata(cnt);
|
||||||
|
unsigned short *pus = (unsigned short *) pd;
|
||||||
|
taskDISABLE_INTERRUPTS();
|
||||||
|
uint16 buf_rx = p->buf_rx;
|
||||||
|
*pus++ = cnt; // кол-во замеров
|
||||||
|
*pus++ = p->count + p->overrun; // индекс замера для анализа пропусков на стороне приемника
|
||||||
|
// если не пропущено, то равен прошлому + кол-во считанных замеров в прошлом блоке
|
||||||
|
p->count += cnt; // p->overrun = 0;
|
||||||
|
unsigned char *puc = (unsigned char *) pus;
|
||||||
|
if(cnt) {
|
||||||
|
uint16 lend = buf_rx + cnt;
|
||||||
|
if(lend > p->buf_idx) {
|
||||||
|
lend -= p->buf_idx + 1;
|
||||||
|
p->buf_rx = lend;
|
||||||
|
} else {
|
||||||
|
p->buf_rx = lend;
|
||||||
|
lend = 0;
|
||||||
|
};
|
||||||
|
size_t len = (cnt - lend) *sizeof(INA219DATA);
|
||||||
|
if(len) memcpy(puc, (void *)(p->pbuf + buf_rx), len);
|
||||||
|
if(lend) memcpy(puc + len, (void *)p->pbuf, lend *sizeof(INA219DATA));
|
||||||
|
}
|
||||||
|
taskENABLE_INTERRUPTS();
|
||||||
|
return cnt * sizeof(INA219DATA) + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
#define mMAX(a, b) ((a>b)?a:b)
|
||||||
|
|
||||||
|
#include "web_srv.h"
|
||||||
|
#include "websock.h"
|
||||||
|
|
||||||
|
int ina219_ws(TCP_SERV_CONN *ts_conn, char cmd)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
switch(cmd) {
|
||||||
|
case 'd': // deinit
|
||||||
|
if(p->init > 0) {
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
_i2c_deinit(&p->i2c);
|
||||||
|
if(p->pbuf) {
|
||||||
|
free(p->pbuf);
|
||||||
|
p->pbuf = NULL;
|
||||||
|
}
|
||||||
|
p->init = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
case 'c': // get count
|
||||||
|
return ina219_chkdata(p->buf_idx + 1);
|
||||||
|
case 'i': // init
|
||||||
|
return p->init;
|
||||||
|
default: // get_data
|
||||||
|
if(p->init <= 0) {
|
||||||
|
p->status = 0;
|
||||||
|
p->count = 0;
|
||||||
|
p->overrun = 0;
|
||||||
|
p->errs = 0;
|
||||||
|
if(!p->pbuf) {
|
||||||
|
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(INA219DATA));
|
||||||
|
if(!p->pbuf) {
|
||||||
|
error_printf("Error create buffer!\n");
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
p->buf_tx = 0;
|
||||||
|
p->buf_rx = 0;
|
||||||
|
};
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
gtimer_init(&p->timer, INA219_TIMER);
|
||||||
|
gtimer_start_periodical(&p->timer, 532*2, (void*)ina_tick_handler, (uint32_t)&ina219drv);
|
||||||
|
p->init = 1;
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
case 'g': // get
|
||||||
|
{
|
||||||
|
uint32 i = ina219_chkdata(p->buf_idx + 1);
|
||||||
|
if(i) {
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
i = mMIN((web_conn->msgbufsize / sizeof(INA219DATA)), i);
|
||||||
|
if(websock_tx_frame(ts_conn, WS_OPCODE_BINARY | WS_FRAGMENT_FIN, web_conn->msgbuf, ina219_getdata(web_conn->msgbuf, i)) != ERR_OK)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ina219_init(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
if(p->init <= 0) {
|
||||||
|
rtl_printf("Init INA219\n");
|
||||||
|
p->status = 0;
|
||||||
|
p->count = 0;
|
||||||
|
p->errs = 0;
|
||||||
|
if(!p->pbuf) {
|
||||||
|
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(INA219DATA));
|
||||||
|
if(!p->pbuf) {
|
||||||
|
error_printf("Error create buffer!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
p->buf_tx = 0;
|
||||||
|
p->buf_rx = 0;
|
||||||
|
};
|
||||||
|
// (!) Установки драйвера I2C заданы в структуре ina219drv
|
||||||
|
// _i2c_setup(&p->i2c, INA219_I2C_PIN_SDA , INA219_I2C_PIN_SCL, DRV_I2C_FS_MODE); // == DRV_I2C_OK?
|
||||||
|
_i2c_init(&p->i2c);
|
||||||
|
// _i2c_set_speed(&p->i2c, INA219_I2C_BUS_CLK);
|
||||||
|
rtl_printf("I2C%d mode = %d, drvStatus = %d\n", p->i2c.idx, p->i2c.mode, p->i2c.status);
|
||||||
|
// (!) Инициализация INA219 перенесена в прерывание таймера
|
||||||
|
// ina219_write(INA219_REG_CONFIG, p->config);
|
||||||
|
// ina219_write(INA219_REG_CALIBRATION, p->calibration);
|
||||||
|
// Initial a periodical timer
|
||||||
|
gtimer_init(&p->timer, INA219_TIMER);
|
||||||
|
// Tick every 0.000532 sec (N*532 μs)
|
||||||
|
// uint32 tus = (1 << ((p->config >> 3) & 7));
|
||||||
|
// tus *= 532;
|
||||||
|
uint32 tus = 532*2;
|
||||||
|
gtimer_start_periodical(&p->timer, tus, (void*)ina_tick_handler, (uint32_t)&ina219drv);
|
||||||
|
rtl_printf("INA219 Timer Period = %u us\n", tus);
|
||||||
|
p->init = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ina219_deinit(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
i2c_drv_t *pi2c = &p->i2c;
|
||||||
|
if(p->init > 0) {
|
||||||
|
rtl_printf("Deinit INA219\n");
|
||||||
|
gtimer_stop(&p->timer);
|
||||||
|
gtimer_deinit(&p->timer);
|
||||||
|
// (!) Не используется ina219_write / ina219_read для сокращения кода
|
||||||
|
// ina219_write(INA219_REG_CONFIG, INA219_CONFIG_MODE_POWERDOWN);
|
||||||
|
// Break controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) |= 2;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Disable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = 0;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Master Target Address
|
||||||
|
i2c_reg(REG_DW_I2C_IC_TAR) = p->addr;
|
||||||
|
// Enable controller.
|
||||||
|
i2c_reg(REG_DW_I2C_IC_ENABLE) = BIT_IC_ENABLE;
|
||||||
|
// Заполним FIFO ic I2C командой отключения INA219
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
// Write addr reg. INA219 POWER_DOWN
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = INA219_REG_CONFIG;
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (INA219_CONFIG_MODE_POWERDOWN >> 8);
|
||||||
|
i2c_reg(REG_DW_I2C_IC_DATA_CMD) = (INA219_CONFIG_MODE_POWERDOWN & 0x0F) | BIT_IC_DATA_CMD_STOP;
|
||||||
|
vTaskDelay(2); // +WDT
|
||||||
|
_i2c_deinit(&p->i2c);
|
||||||
|
if(p->pbuf) {
|
||||||
|
free(p->pbuf);
|
||||||
|
p->pbuf = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p->init = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ShowIna(void)
|
||||||
|
{
|
||||||
|
PINA219DRV p = &ina219drv;
|
||||||
|
rtl_printf("INA219: %d, %d\n", p->buf_i2c.us[0], p->buf_i2c.ss[1]);
|
||||||
|
rtl_printf("INA219: Cnt = %u, Err = %u\n", p->count, p->errs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fATINA(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc > 1) {
|
||||||
|
if(atoi(argv[1])) {
|
||||||
|
ina219_init();
|
||||||
|
vTaskDelay(10); // +WDT
|
||||||
|
}
|
||||||
|
else ina219_deinit();
|
||||||
|
}
|
||||||
|
ShowIna();
|
||||||
|
}
|
||||||
|
|
||||||
|
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_ina219[] = {
|
||||||
|
{"ATINA", 0, fATINA, "=[0/1]: INA219 =1 start, =0 stop"}
|
||||||
|
};
|
||||||
|
|
55
RTLGDB/Project/ina219/ina219drv.h
Normal file
55
RTLGDB/Project/ina219/ina219drv.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/**************************************************************************
|
||||||
|
* Драйвер для INA219
|
||||||
|
**************************************************************************/
|
||||||
|
#ifndef _INA219DRV_H_
|
||||||
|
#define _INA219DRV_H_
|
||||||
|
#include "ina219/ina219.h"
|
||||||
|
#include "device.h"
|
||||||
|
#include "timer_api.h"
|
||||||
|
#include "driver/i2c_drv.h"
|
||||||
|
|
||||||
|
typedef struct _ina219_data {
|
||||||
|
union {
|
||||||
|
signed short voltage; // Voltage, 1mV
|
||||||
|
unsigned char vuc[2];
|
||||||
|
} v;
|
||||||
|
union {
|
||||||
|
signed short current; // Current, 50uA?
|
||||||
|
unsigned char iuc[2];
|
||||||
|
} i;
|
||||||
|
} INA219DATA, *PINA219DATA;
|
||||||
|
|
||||||
|
typedef struct _ina219drv {
|
||||||
|
unsigned char status;
|
||||||
|
unsigned char addr; // адрес INA219 на шине I2C (формат 7 bit)
|
||||||
|
signed char init;
|
||||||
|
unsigned char tmp;
|
||||||
|
|
||||||
|
unsigned short config; // регистр конфигурации INA219
|
||||||
|
unsigned short calibration; // коэф. шунта для INA219
|
||||||
|
|
||||||
|
unsigned short count; // счетчик считанных значений
|
||||||
|
unsigned short overrun; // счет переполнений буфера
|
||||||
|
|
||||||
|
unsigned short errs; // счет ошибок на I2C
|
||||||
|
unsigned short buf_idx; // объем буфера pbuf[buf_idx+1], максимальный индекс-номер замера
|
||||||
|
unsigned short buf_rx; // индекс-номер ещё не считанного замера
|
||||||
|
unsigned short buf_tx; // индекс-номер для записи следующего замера
|
||||||
|
PINA219DATA pbuf;
|
||||||
|
gtimer_t timer;
|
||||||
|
union { // буфер
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned short us[2];
|
||||||
|
signed short ss[2];
|
||||||
|
unsigned int ui;
|
||||||
|
} buf_i2c;
|
||||||
|
i2c_drv_t i2c;
|
||||||
|
} INA219DRV, *PINA219DRV;
|
||||||
|
|
||||||
|
|
||||||
|
#define INA219_I2C_PIN_SDA PC_4
|
||||||
|
#define INA219_I2C_PIN_SCL PC_5
|
||||||
|
#define INA219_I2C_BUS_CLK 300000 //hz
|
||||||
|
#define INA219_TIMER TIMER3 // используемый таймер
|
||||||
|
|
||||||
|
#endif // _INA219DRV_H_
|
387
RTLGDB/Project/lwipopts.h
Normal file
387
RTLGDB/Project/lwipopts.h
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file lwipopts.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.1.0
|
||||||
|
* @date 07-October-2011
|
||||||
|
* @brief lwIP Options Configuration.
|
||||||
|
* This file is based on Utilities\lwip_v1.3.2\src\include\lwip\opt.h
|
||||||
|
* and contains the lwIP configuration for the STM32F2x7 demonstration.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIPOPTS_H__
|
||||||
|
#define __LWIPOPTS_H__
|
||||||
|
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
#include "platform_opts.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first
|
||||||
|
* local TCP/UDP pcb (default==0). This can prevent creating predictable port
|
||||||
|
* numbers after booting a device.
|
||||||
|
*/
|
||||||
|
#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 1
|
||||||
|
|
||||||
|
#define WIFI_LOGO_CERTIFICATION_CONFIG 1 //for ping 10k test buffer setting
|
||||||
|
/**
|
||||||
|
* MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library
|
||||||
|
* instead of the lwip internal allocator. Can save code size if you
|
||||||
|
* already use it.
|
||||||
|
*/
|
||||||
|
#define MEM_LIBC_MALLOC 1
|
||||||
|
/**
|
||||||
|
* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator.
|
||||||
|
* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution
|
||||||
|
* speed and usage from interrupts!
|
||||||
|
*/
|
||||||
|
#define MEMP_MEM_MALLOC 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
|
||||||
|
* critical regions during buffer allocation, deallocation and memory
|
||||||
|
* allocation and deallocation.
|
||||||
|
*/
|
||||||
|
#define SYS_LIGHTWEIGHT_PROT 1
|
||||||
|
|
||||||
|
/* Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores
|
||||||
|
should be used instead */
|
||||||
|
#define LWIP_COMPAT_MUTEX 1
|
||||||
|
|
||||||
|
#define ETHARP_TRUST_IP_MAC 0
|
||||||
|
#define IP_REASSEMBLY 1
|
||||||
|
#define IP_FRAG 1
|
||||||
|
#define ARP_QUEUEING 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname
|
||||||
|
* field.
|
||||||
|
*/
|
||||||
|
#define LWIP_NETIF_HOSTNAME 1
|
||||||
|
#define LWIP_NETIF_HOSTNAME_SIZE 16
|
||||||
|
/**
|
||||||
|
* netif0: DEF_HOSTNAME "0", netif1: DEF_HOSTNAME "1", ..
|
||||||
|
*/
|
||||||
|
#define DEF_HOSTNAME "rtl871x"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
|
||||||
|
* use lwIP facilities.
|
||||||
|
*/
|
||||||
|
#define NO_SYS 0
|
||||||
|
|
||||||
|
/* ---------- Memory options ---------- */
|
||||||
|
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
||||||
|
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
|
||||||
|
byte alignment -> define MEM_ALIGNMENT to 2. */
|
||||||
|
#define MEM_ALIGNMENT 4
|
||||||
|
|
||||||
|
/* MEM_SIZE: the size of the heap memory. If the application will send
|
||||||
|
a lot of data that needs to be copied, this should be set high. */
|
||||||
|
#if WIFI_LOGO_CERTIFICATION_CONFIG
|
||||||
|
#define MEM_SIZE (10*1024) //for ping 10k test
|
||||||
|
#else
|
||||||
|
#define MEM_SIZE (5*1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
||||||
|
sends a lot of data out of ROM (or other static memory), this
|
||||||
|
should be set high. */
|
||||||
|
#define MEMP_NUM_PBUF 100
|
||||||
|
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
||||||
|
per active UDP "connection". */
|
||||||
|
#define MEMP_NUM_UDP_PCB 6
|
||||||
|
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
||||||
|
connections. */
|
||||||
|
#define MEMP_NUM_TCP_PCB 10
|
||||||
|
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
||||||
|
connections. */
|
||||||
|
#define MEMP_NUM_TCP_PCB_LISTEN 5
|
||||||
|
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
||||||
|
segments. */
|
||||||
|
#define MEMP_NUM_TCP_SEG 20
|
||||||
|
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
||||||
|
timeouts. */
|
||||||
|
#define MEMP_NUM_SYS_TIMEOUT 10
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- Pbuf options ---------- */
|
||||||
|
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
|
||||||
|
#if WIFI_LOGO_CERTIFICATION_CONFIG
|
||||||
|
#define PBUF_POOL_SIZE 30 //for ping 10k test
|
||||||
|
#else
|
||||||
|
#define PBUF_POOL_SIZE 20
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled.*/
|
||||||
|
#if WIFI_LOGO_CERTIFICATION_CONFIG
|
||||||
|
#define IP_REASS_MAX_PBUFS 30 //for ping 10k test
|
||||||
|
#else
|
||||||
|
#define IP_REASS_MAX_PBUFS 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
|
||||||
|
#define PBUF_POOL_BUFSIZE 500
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- TCP options ---------- */
|
||||||
|
#define LWIP_TCP 1
|
||||||
|
#define TCP_TTL 255
|
||||||
|
|
||||||
|
/* Controls if TCP should queue segments that arrive out of
|
||||||
|
order. Define to 0 if your device is low on memory. */
|
||||||
|
#define TCP_QUEUE_OOSEQ 1
|
||||||
|
|
||||||
|
/* TCP Maximum segment size. */
|
||||||
|
#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
|
||||||
|
|
||||||
|
/* TCP sender buffer space (bytes). */
|
||||||
|
#define TCP_SND_BUF (5*TCP_MSS)
|
||||||
|
|
||||||
|
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
|
||||||
|
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
|
||||||
|
|
||||||
|
#define TCP_SND_QUEUELEN (4* TCP_SND_BUF/TCP_MSS)
|
||||||
|
|
||||||
|
/* TCP receive window. */
|
||||||
|
#define TCP_WND (4*TCP_MSS) // (2*TCP_MSS)
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- ICMP options ---------- */
|
||||||
|
#define LWIP_ICMP 1
|
||||||
|
|
||||||
|
/* ---------- ARP options ----------- */
|
||||||
|
#define LWIP_ARP 1
|
||||||
|
/**
|
||||||
|
* LWIP_AUTOIP==1: Enable AUTOIP module.
|
||||||
|
*/
|
||||||
|
#define LWIP_AUTOIP 0 //Realtek modified (0->1)
|
||||||
|
|
||||||
|
/* ---------- DHCP options ---------- */
|
||||||
|
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
||||||
|
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
|
||||||
|
turning this on does currently not work. */
|
||||||
|
#define LWIP_DHCP 1
|
||||||
|
|
||||||
|
/* ---------- UDP options ---------- */
|
||||||
|
#define LWIP_UDP 1
|
||||||
|
#define UDP_TTL 255
|
||||||
|
/* ---------- DNS options ---------- */
|
||||||
|
#define LWIP_DNS 1
|
||||||
|
|
||||||
|
/* ---------- UPNP options --------- */
|
||||||
|
#define LWIP_UPNP 0
|
||||||
|
|
||||||
|
/* Support Multicast */
|
||||||
|
#define LWIP_IGMP 1
|
||||||
|
|
||||||
|
extern __attribute__ ((long_call)) unsigned int Rand(void);
|
||||||
|
#define LWIP_RAND() Rand()
|
||||||
|
|
||||||
|
/* Support TCP Keepalive */
|
||||||
|
#define LWIP_TCP_KEEPALIVE 1
|
||||||
|
|
||||||
|
/*LWIP_UART_ADAPTER==1: Enable LWIP_UART_ADAPTER when CONFIG_GAGENT is enabled,
|
||||||
|
because some GAGENT functions denpond on the following macro definitions.*/
|
||||||
|
#if CONFIG_EXAMPLE_UART_ADAPTER
|
||||||
|
#define LWIP_UART_ADAPTER 1
|
||||||
|
#else
|
||||||
|
#define LWIP_UART_ADAPTER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_UART_ADAPTER
|
||||||
|
#undef LWIP_SO_SNDTIMEO
|
||||||
|
#define LWIP_SO_SNDTIMEO 1
|
||||||
|
|
||||||
|
#undef SO_REUSE
|
||||||
|
#define SO_REUSE 1
|
||||||
|
|
||||||
|
#undef MEMP_NUM_NETCONN
|
||||||
|
#define MEMP_NUM_NETCONN 10
|
||||||
|
|
||||||
|
#undef TCP_WND
|
||||||
|
#define TCP_WND (4*TCP_MSS)
|
||||||
|
|
||||||
|
#define TCP_KEEPIDLE_DEFAULT 10000UL
|
||||||
|
#define TCP_KEEPINTVL_DEFAULT 1000UL
|
||||||
|
#define TCP_KEEPCNT_DEFAULT 10U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
#undef LWIP_SO_SNDTIMEO
|
||||||
|
#define LWIP_SO_SNDTIMEO 1
|
||||||
|
|
||||||
|
#undef SO_REUSE
|
||||||
|
#define SO_REUSE 1
|
||||||
|
|
||||||
|
#undef MEMP_NUM_NETCONN
|
||||||
|
#define MEMP_NUM_NETCONN 10
|
||||||
|
|
||||||
|
#undef MEMP_NUM_TCP_PCB
|
||||||
|
#define MEMP_NUM_TCP_PCB (MEMP_NUM_NETCONN)
|
||||||
|
|
||||||
|
#undef MEMP_NUM_UDP_PCB
|
||||||
|
#define MEMP_NUM_UDP_PCB (MEMP_NUM_NETCONN)
|
||||||
|
|
||||||
|
#undef TCP_WND
|
||||||
|
#define TCP_WND (4*TCP_MSS)
|
||||||
|
|
||||||
|
#define TCP_KEEPIDLE_DEFAULT 10000UL
|
||||||
|
#define TCP_KEEPINTVL_DEFAULT 1000UL
|
||||||
|
#define TCP_KEEPCNT_DEFAULT 10U
|
||||||
|
|
||||||
|
#define ERRNO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---------- Statistics options ---------- */
|
||||||
|
#define LWIP_STATS 0
|
||||||
|
#define LWIP_PROVIDE_ERRNO 1
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
--------------------------------------
|
||||||
|
---------- Checksum options ----------
|
||||||
|
--------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
The STM32F2x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
|
||||||
|
- To use this feature let the following define uncommented.
|
||||||
|
- To disable it and process by CPU comment the the checksum.
|
||||||
|
*/
|
||||||
|
//Do checksum by lwip - WLAN nic does not support Checksum offload
|
||||||
|
//#define CHECKSUM_BY_HARDWARE
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CHECKSUM_BY_HARDWARE
|
||||||
|
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
|
||||||
|
#define CHECKSUM_GEN_IP 0
|
||||||
|
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
|
||||||
|
#define CHECKSUM_GEN_UDP 0
|
||||||
|
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
|
||||||
|
#define CHECKSUM_GEN_TCP 0
|
||||||
|
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_IP 0
|
||||||
|
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_UDP 0
|
||||||
|
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_TCP 0
|
||||||
|
#else
|
||||||
|
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
|
||||||
|
#define CHECKSUM_GEN_IP 1
|
||||||
|
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
|
||||||
|
#define CHECKSUM_GEN_UDP 1
|
||||||
|
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
|
||||||
|
#define CHECKSUM_GEN_TCP 1
|
||||||
|
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_IP 1
|
||||||
|
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_UDP 1
|
||||||
|
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
|
||||||
|
#define CHECKSUM_CHECK_TCP 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
----------------------------------------------
|
||||||
|
---------- Sequential layer options ----------
|
||||||
|
----------------------------------------------
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
|
||||||
|
*/
|
||||||
|
#define LWIP_NETCONN 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
------------------------------------
|
||||||
|
---------- Socket options ----------
|
||||||
|
------------------------------------
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
|
||||||
|
*/
|
||||||
|
#define LWIP_SOCKET 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
-----------------------------------
|
||||||
|
---------- DEBUG options ----------
|
||||||
|
-----------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LWIP_DEBUG 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
---------------------------------
|
||||||
|
---------- OS options ----------
|
||||||
|
---------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread.
|
||||||
|
* The stack size value itself is platform-dependent, but is passed to
|
||||||
|
* sys_thread_new() when the thread is created.
|
||||||
|
*/
|
||||||
|
#define TCPIP_THREAD_STACKSIZE 1000
|
||||||
|
/**
|
||||||
|
* TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages
|
||||||
|
* The queue size value itself is platform-dependent, but is passed to
|
||||||
|
* sys_mbox_new() when tcpip_init is called.
|
||||||
|
*/
|
||||||
|
#define TCPIP_MBOX_SIZE 6
|
||||||
|
/**
|
||||||
|
* DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a
|
||||||
|
* NETCONN_UDP. The queue size value itself is platform-dependent, but is passed
|
||||||
|
* to sys_mbox_new() when the recvmbox is created.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_UDP_RECVMBOX_SIZE 6
|
||||||
|
/**
|
||||||
|
* DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a
|
||||||
|
* NETCONN_TCP. The queue size value itself is platform-dependent, but is passed
|
||||||
|
* to sys_mbox_new() when the recvmbox is created.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_TCP_RECVMBOX_SIZE 6
|
||||||
|
/**
|
||||||
|
* DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a
|
||||||
|
* NETCONN_RAW. The queue size value itself is platform-dependent, but is passed
|
||||||
|
* to sys_mbox_new() when the recvmbox is created.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_RAW_RECVMBOX_SIZE 6
|
||||||
|
/**
|
||||||
|
* DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections.
|
||||||
|
* The queue size value itself is platform-dependent, but is passed to
|
||||||
|
* sys_mbox_new() when the acceptmbox is created.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_ACCEPTMBOX_SIZE 6
|
||||||
|
/**
|
||||||
|
* DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread.
|
||||||
|
* The stack size value itself is platform-dependent, but is passed to
|
||||||
|
* sys_thread_new() when the thread is created.
|
||||||
|
*/
|
||||||
|
#define DEFAULT_THREAD_STACKSIZE 500
|
||||||
|
/**
|
||||||
|
* TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread.
|
||||||
|
* The priority value itself is platform-dependent, but is passed to
|
||||||
|
* sys_thread_new() when the thread is created.
|
||||||
|
*/
|
||||||
|
#define TCPIP_THREAD_PRIO (configMAX_PRIORITIES - 2)
|
||||||
|
|
||||||
|
/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
|
||||||
|
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
||||||
|
#if defined(_SYS__TIMEVAL_H_)
|
||||||
|
#define LWIP_TIMEVAL_PRIVATE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIPOPTS_H__ */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
97
RTLGDB/Project/main.c
Normal file
97
RTLGDB/Project/main.c
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#include "platform_autoconf.h"
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "hal_crypto.h"
|
||||||
|
#include "hal_log_uart.h"
|
||||||
|
#include "hal_misc.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "tcm_heap.h"
|
||||||
|
#include "hal_platform.h"
|
||||||
|
#include "rtl8195a_sys_on.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_WDG_ON_IDLE
|
||||||
|
#include "rtl8195a_wdt.h"
|
||||||
|
#include "hal_peri_on.h"
|
||||||
|
#include "rtl8195a_peri_on.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---------------------------------------------------
|
||||||
|
* Customized Signature (Image Name)
|
||||||
|
* ---------------------------------------------------*/
|
||||||
|
#include "section_config.h"
|
||||||
|
#ifndef _MSC_VER // IntelliSense
|
||||||
|
SECTION(".custom.validate.rodata")
|
||||||
|
#endif
|
||||||
|
const unsigned char cus_sig[32] = "WEB Sample";
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_LOG
|
||||||
|
#define DEBUG_MAIN_LEVEL CONFIG_DEBUG_LOG
|
||||||
|
#else
|
||||||
|
#define DEBUG_MAIN_LEVEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_INIT_NET
|
||||||
|
#define CONFIG_INIT_NET 1
|
||||||
|
#endif
|
||||||
|
#ifndef CONFIG_INTERACTIVE_MODE
|
||||||
|
#define CONFIG_INTERACTIVE_MODE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void WDGStart(void);
|
||||||
|
extern void user_init_thrd(void);
|
||||||
|
extern void user_init2_thrd(void);
|
||||||
|
|
||||||
|
void ShowMemInfo(void)
|
||||||
|
{
|
||||||
|
DiagPrintf("\nCLK CPU\t\t%d Hz\nRAM heap\t%d bytes\nTCM heap\t%d bytes\n", HalGetCpuClk(), xPortGetFreeHeapSize(), tcm_heap_freeSpace());
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
#if DEBUG_MAIN_LEVEL > 3
|
||||||
|
ConfigDebugErr = -1;
|
||||||
|
ConfigDebugInfo = ~(_DBG_SPI_FLASH_);//|_DBG_TCM_HEAP_);
|
||||||
|
ConfigDebugWarn = -1;
|
||||||
|
CfgSysDebugErr = -1;
|
||||||
|
CfgSysDebugInfo = -1;
|
||||||
|
CfgSysDebugWarn = -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_WDG_ON_IDLE
|
||||||
|
HAL_PERI_ON_WRITE32(REG_SOC_FUNC_EN, HAL_PERI_ON_READ32(REG_SOC_FUNC_EN) & 0x1FFFFF);
|
||||||
|
#if CONFIG_DEBUG_LOG > 3
|
||||||
|
WDGInitial(CONFIG_WDG_ON_IDLE * 3000); // 30 s
|
||||||
|
#else
|
||||||
|
WDGInitial(CONFIG_WDG_ON_IDLE * 1000); // 4 s
|
||||||
|
#endif
|
||||||
|
WDGStart();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(CONFIG_CRYPTO_STARTUP) && (CONFIG_CRYPTO_STARTUP))
|
||||||
|
if(rtl_cryptoEngine_init() != 0 )
|
||||||
|
{
|
||||||
|
DBG_8195A("Crypto engine init failed!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if DEBUG_MAIN_LEVEL > 1
|
||||||
|
vPortFree(pvPortMalloc(4)); // Init RAM heap
|
||||||
|
ShowMemInfo(); // RAM/TCM/Heaps info
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* wlan & user_start intialization */
|
||||||
|
xTaskCreate(user_init_thrd, "user_init", 1024, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, NULL);
|
||||||
|
//xTaskCreate(user_init2_thrd, "user_init2", 16384, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, NULL);
|
||||||
|
|
||||||
|
/*Enable Schedule, Start Kernel*/
|
||||||
|
#if defined(CONFIG_KERNEL) && !TASK_SCHEDULER_DISABLED
|
||||||
|
#ifdef PLATFORM_FREERTOS
|
||||||
|
vTaskStartScheduler();
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
RtlConsolTaskRom(NULL);
|
||||||
|
#endif
|
||||||
|
}
|
119
RTLGDB/Project/main.h
Normal file
119
RTLGDB/Project/main.h
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <autoconf.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_WLAN
|
||||||
|
#define CONFIG_WLAN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Header file declaration*/
|
||||||
|
void wlan_network();
|
||||||
|
|
||||||
|
/* Interactive Mode */
|
||||||
|
#define SERIAL_DEBUG_RX 1
|
||||||
|
|
||||||
|
/* WLAN and Netork */
|
||||||
|
#define STA_MODE_SSID "ap" /* Set SSID here */
|
||||||
|
#define AP_MODE_SSID "wlan_ap_ssid" /* Set SSID here */
|
||||||
|
#define AP_DEFAULT_CH 6
|
||||||
|
#define WLAN0_NAME "wlan0"
|
||||||
|
#define WLAN1_NAME "wlan1"
|
||||||
|
#define WPA_PASSPHRASE "1234567890" /* Max 32 cahracters */
|
||||||
|
#define WEP40_KEY {0x12, 0x34, 0x56, 0x78, 0x90}
|
||||||
|
|
||||||
|
#define ATVER_1 1 // For First AT command
|
||||||
|
#define ATVER_2 2 // For UART Module AT command
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
#define ATCMD_VER ATVER_2
|
||||||
|
#else
|
||||||
|
#define ATCMD_VER ATVER_1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ATCMD_VER == ATVER_2
|
||||||
|
|
||||||
|
extern unsigned char sta_ip[4], sta_netmask[4], sta_gw[4];
|
||||||
|
extern unsigned char ap_ip[4], ap_netmask[4], ap_gw[4];
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#define IP_ADDR0 sta_ip[0]
|
||||||
|
#define IP_ADDR1 sta_ip[1]
|
||||||
|
#define IP_ADDR2 sta_ip[2]
|
||||||
|
#define IP_ADDR3 sta_ip[3]
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#define NETMASK_ADDR0 sta_netmask[0]
|
||||||
|
#define NETMASK_ADDR1 sta_netmask[1]
|
||||||
|
#define NETMASK_ADDR2 sta_netmask[2]
|
||||||
|
#define NETMASK_ADDR3 sta_netmask[3]
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#define GW_ADDR0 sta_gw[0]
|
||||||
|
#define GW_ADDR1 sta_gw[1]
|
||||||
|
#define GW_ADDR2 sta_gw[2]
|
||||||
|
#define GW_ADDR3 sta_gw[3]
|
||||||
|
|
||||||
|
/*******************************************/
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#define AP_IP_ADDR0 ap_ip[0]
|
||||||
|
#define AP_IP_ADDR1 ap_ip[1]
|
||||||
|
#define AP_IP_ADDR2 ap_ip[2]
|
||||||
|
#define AP_IP_ADDR3 ap_ip[3]
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#define AP_NETMASK_ADDR0 ap_netmask[0]
|
||||||
|
#define AP_NETMASK_ADDR1 ap_netmask[1]
|
||||||
|
#define AP_NETMASK_ADDR2 ap_netmask[2]
|
||||||
|
#define AP_NETMASK_ADDR3 ap_netmask[3]
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#define AP_GW_ADDR0 ap_gw[0]
|
||||||
|
#define AP_GW_ADDR1 ap_gw[1]
|
||||||
|
#define AP_GW_ADDR2 ap_gw[2]
|
||||||
|
#define AP_GW_ADDR3 ap_gw[3]
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#define IP_ADDR0 192
|
||||||
|
#define IP_ADDR1 168
|
||||||
|
#define IP_ADDR2 3
|
||||||
|
#define IP_ADDR3 80
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#define NETMASK_ADDR0 255
|
||||||
|
#define NETMASK_ADDR1 255
|
||||||
|
#define NETMASK_ADDR2 255
|
||||||
|
#define NETMASK_ADDR3 0
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#define GW_ADDR0 192
|
||||||
|
#define GW_ADDR1 168
|
||||||
|
#define GW_ADDR2 3
|
||||||
|
#define GW_ADDR3 1
|
||||||
|
|
||||||
|
/*******************************************/
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#define AP_IP_ADDR0 192
|
||||||
|
#define AP_IP_ADDR1 168
|
||||||
|
#define AP_IP_ADDR2 43
|
||||||
|
#define AP_IP_ADDR3 1
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#define AP_NETMASK_ADDR0 255
|
||||||
|
#define AP_NETMASK_ADDR1 255
|
||||||
|
#define AP_NETMASK_ADDR2 255
|
||||||
|
#define AP_NETMASK_ADDR3 0
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#define AP_GW_ADDR0 192
|
||||||
|
#define AP_GW_ADDR1 168
|
||||||
|
#define AP_GW_ADDR2 43
|
||||||
|
#define AP_GW_ADDR3 1
|
||||||
|
|
||||||
|
#endif //#if ATCMD_VER == ATVER_2
|
||||||
|
|
||||||
|
#endif
|
255
RTLGDB/Project/platform_autoconf.h
Normal file
255
RTLGDB/Project/platform_autoconf.h
Normal file
|
@ -0,0 +1,255 @@
|
||||||
|
/*
|
||||||
|
* Automatically generated by make menuconfig: don't edit
|
||||||
|
*/
|
||||||
|
#define AUTOCONF_INCLUDED
|
||||||
|
|
||||||
|
#define RTL8710AF
|
||||||
|
#define RTL8711AM
|
||||||
|
|
||||||
|
/* Image1 on project */
|
||||||
|
#define PRESENT_IMAGE1
|
||||||
|
/* Image2 on project */
|
||||||
|
#define PRESENT_IMAGE2
|
||||||
|
/*
|
||||||
|
* Target Platform Selection
|
||||||
|
*/
|
||||||
|
#define CONFIG_USE_TCM_HEAP 1
|
||||||
|
#define configUSE_STACK_TCM_HEAP 5 // min priority use tcm ?
|
||||||
|
|
||||||
|
#define CONFIG_WITHOUT_MONITOR 1
|
||||||
|
|
||||||
|
#undef CONFIG_RTL8195A
|
||||||
|
#define CONFIG_RTL8195A 1
|
||||||
|
#undef CONFIG_FPGA
|
||||||
|
#undef CONFIG_RTL_SIM
|
||||||
|
#undef CONFIG_POST_SIM
|
||||||
|
/*
|
||||||
|
* < Mass Production Option
|
||||||
|
*/
|
||||||
|
#undef CONFIG_MP
|
||||||
|
#undef CONFIG_CP
|
||||||
|
#undef CONFIG_FT
|
||||||
|
#define RTL8195A 1
|
||||||
|
/* 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000? Hz,
|
||||||
|
6 - 200000000 Hz, 7 - 10000000 Hz, 8 - 50000000 Hz, 9 - 25000000 Hz, 10 - 12500000 Hz, 11 - 4000000? Hz */
|
||||||
|
#define CONFIG_CPU_CLK 1
|
||||||
|
//166.6MHZ - RUN/IDLE/SLP ~63/21/6.4 mA
|
||||||
|
//83.3MHZ - RUN/IDLE/SLP ~55/15/6.4 mA
|
||||||
|
//41.6MHZ - RUN/IDLE ~51/11 mA
|
||||||
|
//20.8MHZ - RUN/IDLE ~49/9.5 mA
|
||||||
|
//4MHZ - IDLE ~8 mA
|
||||||
|
#undef CONFIG_FPGA_CLK
|
||||||
|
#define CONFIG_SDR_CLK 1
|
||||||
|
#define CONFIG_SDR_100MHZ 1
|
||||||
|
#undef CONFIG_SDR_50MHZ
|
||||||
|
#undef CONFIG_SDR_25MHZ
|
||||||
|
#undef CONFIG_SDR_12_5MHZ
|
||||||
|
#define SDR_CLOCK_SEL_VALUE (0)
|
||||||
|
#define CONFIG_BOOT_PROCEDURE 1
|
||||||
|
#define CONFIG_IMAGE_PAGE_LOAD 1
|
||||||
|
#undef CONFIG_IMAGE_AUTO_LOAD
|
||||||
|
#undef CONFIG_IMAGE_PAGE_LOAD
|
||||||
|
//#define CONFIG_IMAGE_AUTO_LOAD 1
|
||||||
|
//#define CONFIG_BOOT_TO_UPGRADE_IMG2 1
|
||||||
|
#undef CONFIG_PERI_UPDATE_IMG
|
||||||
|
#define CONFIG_BOOT_FROM_JTAG 1
|
||||||
|
#undef CONFIG_ALIGNMENT_EXCEPTION_ENABLE
|
||||||
|
#define CONFIG_KERNEL 1
|
||||||
|
#define PLATFORM_FREERTOS 1
|
||||||
|
#undef PLATFORM_UCOSII
|
||||||
|
#undef PLATFORM_ECOS
|
||||||
|
#undef CONFIG_TASK_SCHEDUL_DIS
|
||||||
|
#define TASK_SCHEDULER_DISABLED (0)
|
||||||
|
#define CONFIG_NORMALL_MODE 1
|
||||||
|
#undef CONFIG_MEMORY_VERIFY_MODE
|
||||||
|
#define CONFIG_TIMER_EN 1
|
||||||
|
#define CONFIG_TIMER_NORMAL 1
|
||||||
|
#undef CONFIG_TIMER_TEST
|
||||||
|
#define CONFIG_TIMER_MODULE 1
|
||||||
|
#define CONFIG_WDG 1
|
||||||
|
#undef CONFIG_WDG_NON
|
||||||
|
#define CONFIG_WDG_NORMAL 1
|
||||||
|
#define CONFIG_WDG_ON_IDLE 4 // 10 // add pvvx: wdt on 10 s -> main.c + tasks.c
|
||||||
|
#define CONFIG_GDMA_EN 1
|
||||||
|
#define CONFIG_GDMA_NORMAL 1
|
||||||
|
#undef CONFIG_GDMA_TEST
|
||||||
|
#define CONFIG_GDMA_MODULE 1
|
||||||
|
#define CONFIG_WIFI_EN 1
|
||||||
|
#define CONFIG_WIFI_NORMAL 1
|
||||||
|
#undef CONFIG_WIFI_TEST
|
||||||
|
#define CONFIG_WIFI_MODULE 1
|
||||||
|
#define CONFIG_GPIO_EN 1
|
||||||
|
#define CONFIG_GPIO_NORMAL 1
|
||||||
|
#undef CONFIG_GPIO_TEST
|
||||||
|
#define CONFIG_GPIO_MODULE 1
|
||||||
|
#if defined(CONFIG_INIC) || (CONFIG_SDIOD)
|
||||||
|
#define CONFIG_SDIO_DEVICE_EN 1
|
||||||
|
#define CONFIG_SDIO_DEVICE_NORMAL 1
|
||||||
|
#undef CONFIG_SDIO_DEVICE_TEST
|
||||||
|
#define CONFIG_SDIO_DEVICE_MODULE 1
|
||||||
|
#else
|
||||||
|
#undef CONFIG_SDIO_DEVICE_EN
|
||||||
|
#endif
|
||||||
|
#define CONFIG_SDIO_HOST_EN 1
|
||||||
|
//#define CONFIG_USB_EN 1
|
||||||
|
#undef CONFIG_USB_NORMAL
|
||||||
|
#define CONFIG_USB_TEST 1
|
||||||
|
#define CONFIG_USB_MODULE 1
|
||||||
|
#define CONFIG_USB_VERIFY 1
|
||||||
|
#undef CONFIG_USB_ROM_LIB
|
||||||
|
//#define CONFIG_USB_DBGINFO_EN 1
|
||||||
|
#if defined(CONFIG_INIC) || (CONFIG_USBD)
|
||||||
|
#define DWC_DEVICE_ONLY 1
|
||||||
|
#else
|
||||||
|
#define DWC_HOST_ONLY 1
|
||||||
|
#define CONFIG_USB_HOST_ONLY 1
|
||||||
|
#endif
|
||||||
|
#define CONFIG_SPI_COM_EN 1
|
||||||
|
#define CONFIG_SPI_COM_NORMAL 1
|
||||||
|
#undef CONFIG_SPI_COM_TEST
|
||||||
|
#define CONFIG_SPI_COM_MODULE 1
|
||||||
|
#define CONFIG_UART_EN 1
|
||||||
|
#define CONFIG_UART_NORMAL 1
|
||||||
|
#undef CONFIG_UART_TEST
|
||||||
|
#define CONFIG_UART_MODULE 1
|
||||||
|
#define CONFIG_I2C_EN 1
|
||||||
|
#define CONFIG_I2C_NORMAL 1
|
||||||
|
#undef CONFIG_I2C_TEST
|
||||||
|
#define CONFIG_I2C_MODULE 1
|
||||||
|
#undef CONFIG_DEBUG_LOG_I2C_HAL
|
||||||
|
#undef CONFIG_PCM_EN
|
||||||
|
#define CONFIG_I2S_EN 1
|
||||||
|
#define CONFIG_I2S_NORMAL 1
|
||||||
|
#undef CONFIG_I2S_TEST
|
||||||
|
#define CONFIG_I2S_MODULE 1
|
||||||
|
#undef CONFIG_DEBUG_LOG_I2S_HAL
|
||||||
|
#define CONFIG_NFC_EN 1
|
||||||
|
#define CONFIG_NFC_NORMAL 1
|
||||||
|
#undef CONFIG_NFC_TEST
|
||||||
|
#define CONFIG_NFC_MODULE 1
|
||||||
|
#define CONFIG_SOC_PS_EN 1
|
||||||
|
#define CONFIG_SOC_PS_NORMAL 1
|
||||||
|
#undef CONFIG_SOC_PS_TEST
|
||||||
|
#define CONFIG_SOC_PS_MODULE 1 // hal_soc_ps_monitor.c
|
||||||
|
//#define CONFIG_SOC_PS_VERIFY 1 // hal_soc_ps_monitor.c
|
||||||
|
#define CONFIG_CRYPTO_EN 1
|
||||||
|
#define CONFIG_CRYPTO_NORMAL 1
|
||||||
|
#undef CONFIG_CRYPTO_TEST
|
||||||
|
#define CONFIG_CRYPTO_MODULE 1
|
||||||
|
#define CONFIG_CRYPTO_STARTUP 1
|
||||||
|
#define CONFIG_MII_EN 0 //1
|
||||||
|
#define CONFIG_PWM_EN 1
|
||||||
|
#define CONFIG_PWM_NORMAL 1
|
||||||
|
#undef CONFIG_PWM_TEST
|
||||||
|
#define CONFIG_PWM_MODULE 1
|
||||||
|
#define CONFIG_EFUSE_EN 1 // common/mbed/targets/hal/rtl8195a/efuse_api.c
|
||||||
|
#define CONFIG_EFUSE_NORMAL 1
|
||||||
|
#undef CONFIG_EFUSE_TEST
|
||||||
|
#define CONFIG_EFUSE_MODULE 1
|
||||||
|
#if defined(RTL8711AM) || defined(USE_SDRAM)
|
||||||
|
#define CONFIG_SDR_EN 1
|
||||||
|
#endif
|
||||||
|
#define CONFIG_SDR_NORMAL 1
|
||||||
|
#undef CONFIG_SDR_TEST
|
||||||
|
#define CONFIG_SDR_MODULE 1
|
||||||
|
#define CONFIG_SPIC_EN 1
|
||||||
|
#define CONFIG_SPIC_NORMAL 1
|
||||||
|
#undef CONFIG_SPIC_TEST
|
||||||
|
#define CONFIG_SPIC_MODULE 1
|
||||||
|
#define CONFIG_ADC_EN 1
|
||||||
|
#define CONFIG_DAC_EN 1
|
||||||
|
#define CONFIG_NOR_FLASH 1
|
||||||
|
#undef CONFIG_SPI_FLASH
|
||||||
|
#undef CONFIG_NAND_FLASH
|
||||||
|
#undef CONFIG_NONE_FLASH
|
||||||
|
#undef CONFIG_BTBX_EN
|
||||||
|
|
||||||
|
// add pvvx
|
||||||
|
#define CONFIG_LOG_UART_EN 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < Engineer Mode Config
|
||||||
|
*/
|
||||||
|
#undef CONFIG_JTAG
|
||||||
|
#undef CONFIG_COMPILE_FLASH_DOWNLOAD_CODE
|
||||||
|
#undef CONIFG_COMPILE_EXTERNAL_SRAM_CALIBRATE
|
||||||
|
#undef CONFIG_CMSIS_MATH_LIB_EN
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < Application Config
|
||||||
|
*/
|
||||||
|
#define CONFIG_NETWORK 1
|
||||||
|
#define CONFIG_RTLIB_EN 1
|
||||||
|
#define CONFIG_RTLIB_NORMAL 1
|
||||||
|
#undef CONFIG_RTLIB_TEST
|
||||||
|
#define CONFIG_RTLIB_MODULE 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < System Debug Message Config
|
||||||
|
*/
|
||||||
|
#define CONFIG_UART_LOG_HISTORY 1
|
||||||
|
#undef CONFIG_CONSOLE_NORMALL_MODE
|
||||||
|
#define CONFIG_CONSOLE_VERIFY_MODE 1
|
||||||
|
|
||||||
|
/* CONFIG_DEBUG_LOG:
|
||||||
|
=0 Off all diag/debug msg,
|
||||||
|
=1 Only errors,
|
||||||
|
=2 errors + warning, (default)
|
||||||
|
=3 errors + warning + info,
|
||||||
|
=4 errors + warning + info + debug,
|
||||||
|
=5 full */
|
||||||
|
#define CONFIG_DEBUG_LOG 2
|
||||||
|
#if CONFIG_DEBUG_LOG > 0
|
||||||
|
//#define CONFIG_DEBUG_ERR_MSG 1
|
||||||
|
#define CONFIG_DEBUG_LOG_ADC_HAL 1
|
||||||
|
#define CONFIG_DEBUG_LOG_I2S_HAL 1
|
||||||
|
//#undef CONFIG_DEBUG_WARN_MSG
|
||||||
|
//#undef CONFIG_DEBUG_INFO_MSG
|
||||||
|
#endif // CONFIG_DEBUG_LOG
|
||||||
|
/*
|
||||||
|
* < SDK Option Config
|
||||||
|
*/
|
||||||
|
#undef CONFIG_MBED_ENABLED
|
||||||
|
#undef CONFIG_APP_DEMO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < Select Chip Version
|
||||||
|
*/
|
||||||
|
#undef CONFIG_CHIP_A_CUT
|
||||||
|
#define CONFIG_CHIP_B_CUT 1
|
||||||
|
#undef CONFIG_CHIP_C_CUT
|
||||||
|
#undef CONFIG_CHIP_E_CUT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < Select toolchain
|
||||||
|
*/
|
||||||
|
#undef CONFIG_TOOLCHAIN_ASDK
|
||||||
|
#undef CONFIG_TOOLCHAIN_ARM_GCC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* < Build Option
|
||||||
|
*/
|
||||||
|
#define CONFIG_LINK_ROM_LIB 1
|
||||||
|
#undef CONFIG_LINK_ROM_SYMB
|
||||||
|
#undef CONFIG_NORMAL_BUILD
|
||||||
|
#undef CONFIG_RELEASE_BUILD
|
||||||
|
#undef CONFIG_RELEASE_BUILD_LIBRARIES
|
||||||
|
#undef CONFIG_LIB_BUILD_RAM
|
||||||
|
#define CONFIG_RELEASE_BUILD_RAM_ALL 1
|
||||||
|
#undef CONFIG_IMAGE_ALL
|
||||||
|
#define CONFIG_IMAGE_SEPARATE 1
|
||||||
|
|
||||||
|
#if CONFIG_CPU_CLK < 6
|
||||||
|
#define CPU_CLOCK_SEL_DIV5_3 0
|
||||||
|
#define CPU_CLOCK_SEL_VALUE CONFIG_CPU_CLK
|
||||||
|
#else
|
||||||
|
#define CPU_CLOCK_SEL_DIV5_3 1
|
||||||
|
#define CPU_CLOCK_SEL_VALUE (CONFIG_CPU_CLK-6)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CPU_CLOCK_SEL_DIV5_3
|
||||||
|
#define PLATFORM_CLOCK (200000000ul>>CPU_CLOCK_SEL_VALUE)
|
||||||
|
#else
|
||||||
|
#define PLATFORM_CLOCK (((200000000ul*5ul)/6ul)>>CPU_CLOCK_SEL_VALUE)
|
||||||
|
#endif
|
||||||
|
|
172
RTLGDB/Project/platform_opts.h
Normal file
172
RTLGDB/Project/platform_opts.h
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
*This file contains general configurations for ameba platform
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PLATFORM_OPTS_H__
|
||||||
|
#define __PLATFORM_OPTS_H__
|
||||||
|
|
||||||
|
/*For MP mode setting*/
|
||||||
|
#define SUPPORT_MP_MODE 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For AT cmd Log service configurations
|
||||||
|
*/
|
||||||
|
#define SUPPORT_LOG_SERVICE 0
|
||||||
|
#if SUPPORT_LOG_SERVICE
|
||||||
|
#define LOG_SERVICE_BUFLEN 100 //can't larger than UART_LOG_CMD_BUFLEN(127)
|
||||||
|
#define CONFIG_LOG_HISTORY 0
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
#define LOG_HISTORY_LEN 5
|
||||||
|
#endif
|
||||||
|
#define SUPPORT_INTERACTIVE_MODE 0 //on/off wifi_interactive_mode
|
||||||
|
#define CONFIG_LOG_SERVICE_LOCK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For interactive mode configurations, depends on log service
|
||||||
|
*/
|
||||||
|
#if SUPPORT_INTERACTIVE_MODE
|
||||||
|
#define CONFIG_INTERACTIVE_MODE 1
|
||||||
|
#define CONFIG_INTERACTIVE_EXT 0
|
||||||
|
#else
|
||||||
|
#define CONFIG_INTERACTIVE_MODE 0
|
||||||
|
#define CONFIG_INTERACTIVE_EXT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For FreeRTOS tickless configurations
|
||||||
|
*/
|
||||||
|
#define FREERTOS_PMU_TICKLESS_PLL_RESERVED 0 // In sleep mode, 0: close PLL clock, 1: reserve PLL clock
|
||||||
|
#define FREERTOS_PMU_TICKLESS_SUSPEND_SDRAM 0 // In sleep mode, 1: suspend SDRAM, 0: no act
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For common flash usage
|
||||||
|
*/
|
||||||
|
#define AP_SETTING_SECTOR 0x000FE000
|
||||||
|
#define UART_SETTING_SECTOR 0x000FC000
|
||||||
|
#define FAST_RECONNECT_DATA (0x80000 - 0x1000)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For Wlan configurations
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CONFIG_WLAN 1
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
#define CONFIG_LWIP_LAYER 1
|
||||||
|
#define CONFIG_AT_USR 1 // add pvxx
|
||||||
|
//#define CONFIG_AT_LWIP 1 // add pvxx
|
||||||
|
//#define CONFIG_AT_SYS 1 // add pvxx
|
||||||
|
//#define CONFIG_AT_WIFI 1 // add pvxx
|
||||||
|
#define CONFIG_INIT_NET 1 // init lwip layer when start up
|
||||||
|
#define CONFIG_WIFI_IND_USE_THREAD 0 // wifi indicate worker thread
|
||||||
|
|
||||||
|
//on/off relative commands in log service
|
||||||
|
#define CONFIG_SSL_CLIENT 0
|
||||||
|
#define CONFIG_WEBSERVER 0
|
||||||
|
#define CONFIG_OTA_UPDATE 1
|
||||||
|
#define CONFIG_BSD_TCP 1 //NOTE : Enable CONFIG_BSD_TCP will increase about 11KB code size
|
||||||
|
#define CONFIG_AIRKISS 0 //on or off tencent airkiss
|
||||||
|
#define CONFIG_UART_SOCKET 0 // Set: CONFIG_UART_EN, CONFIG_UART_SOCKET
|
||||||
|
#define CONFIG_UART_XMODEM 0 //support uart xmodem upgrade or not
|
||||||
|
#define CONFIG_TRANSPORT 0 //on or off the at command for transport socket
|
||||||
|
|
||||||
|
/* For WPS and P2P */
|
||||||
|
#define CONFIG_ENABLE_WPS 0
|
||||||
|
#define CONFIG_ENABLE_P2P 0
|
||||||
|
#if CONFIG_ENABLE_P2P
|
||||||
|
#define CONFIG_ENABLE_WPS_AP 1
|
||||||
|
#undef CONFIG_WIFI_IND_USE_THREAD
|
||||||
|
#define CONFIG_WIFI_IND_USE_THREAD 1
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_ENABLE_P2P && ((CONFIG_ENABLE_WPS_AP == 0) || (CONFIG_ENABLE_WPS == 0)))
|
||||||
|
#error "If CONFIG_ENABLE_P2P, need to define CONFIG_ENABLE_WPS_AP 1"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For Simple Link */
|
||||||
|
#define CONFIG_INCLUDE_SIMPLE_CONFIG 0
|
||||||
|
|
||||||
|
/*For wowlan service settings*/
|
||||||
|
#define CONFIG_WOWLAN_SERVICE 0
|
||||||
|
|
||||||
|
#endif //end of #if CONFIG_WLAN
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For Ethernet configurations
|
||||||
|
*/
|
||||||
|
#define CONFIG_ETHERNET 0
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
|
||||||
|
#define CONFIG_LWIP_LAYER 1
|
||||||
|
#define CONFIG_INIT_NET 1 //init lwip layer when start up
|
||||||
|
|
||||||
|
//on/off relative commands in log service
|
||||||
|
#define CONFIG_SSL_CLIENT 0
|
||||||
|
#define CONFIG_BSD_TCP 0 //NOTE : Enable CONFIG_BSD_TCP will increase about 11KB code size
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For iNIC configurations
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_INIC //this flag is defined in IAR project
|
||||||
|
#define CONFIG_INIC_EN 1 //enable iNIC mode
|
||||||
|
#undef CONFIG_ENABLE_WPS
|
||||||
|
#define CONFIG_ENABLE_WPS 1
|
||||||
|
#undef CONFIG_INCLUDE_SIMPLE_CONFIG
|
||||||
|
#define CONFIG_INCLUDE_SIMPLE_CONFIG 1
|
||||||
|
#undef CONFIG_WOWLAN_SERVICE
|
||||||
|
#define CONFIG_WOWLAN_SERVICE 1
|
||||||
|
#undef LOG_SERVICE_BUFLEN
|
||||||
|
#define LOG_SERVICE_BUFLEN 256
|
||||||
|
#undef CONFIG_LWIP_LAYER
|
||||||
|
#define CONFIG_LWIP_LAYER 0
|
||||||
|
#undef CONFIG_OTA_UPDATE
|
||||||
|
#define CONFIG_OTA_UPDATE 0
|
||||||
|
#undef CONFIG_EXAMPLE_WLAN_FAST_CONNECT
|
||||||
|
#define CONFIG_EXAMPLE_WLAN_FAST_CONNECT 0
|
||||||
|
#define CONFIG_INIC_SDIO_HCI 1 //for SDIO or USB iNIC
|
||||||
|
#define CONFIG_INIC_USB_HCI 0
|
||||||
|
#define CONFIG_INIC_CMD_RSP 1 //need to return msg to host
|
||||||
|
#endif
|
||||||
|
/******************End of iNIC configurations*******************/
|
||||||
|
|
||||||
|
/* For UART Module AT command example */
|
||||||
|
#define CONFIG_EXAMPLE_UART_ATCMD 0
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
#undef FREERTOS_PMU_TICKLESS_PLL_RESERVED
|
||||||
|
#define FREERTOS_PMU_TICKLESS_PLL_RESERVED 1
|
||||||
|
#undef CONFIG_OTA_UPDATE
|
||||||
|
#define CONFIG_OTA_UPDATE 1
|
||||||
|
#undef CONFIG_TRANSPORT
|
||||||
|
#define CONFIG_TRANSPORT 1
|
||||||
|
#undef LOG_SERVICE_BUFLEN
|
||||||
|
#define LOG_SERVICE_BUFLEN 1600
|
||||||
|
#undef CONFIG_LOG_SERVICE_LOCK
|
||||||
|
#define CONFIG_LOG_SERVICE_LOCK 1
|
||||||
|
#else
|
||||||
|
#define CONFIG_EXAMPLE_WLAN_FAST_CONNECT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define CONFIG_EXAMPLE_UART_ADAPTER 1
|
||||||
|
//#define CONFIG_EXAMPLE_MDNS
|
||||||
|
#define USE_FLASH_EEP 1
|
||||||
|
#define CONFIG_WLAN_CONNECT_CB 0
|
||||||
|
|
||||||
|
//#define CONFIG_FATFS_EN 1 // FatFs & SD
|
||||||
|
#ifdef CONFIG_FATFS_EN
|
||||||
|
// fatfs version
|
||||||
|
#define FATFS_R_10C
|
||||||
|
// fatfs disk interface
|
||||||
|
#define FATFS_DISK_USB 0
|
||||||
|
#define FATFS_DISK_SD 1
|
||||||
|
#undef CONFIG_SDIO_HOST_EN
|
||||||
|
#define CONFIG_SDIO_HOST_EN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //__PLATFORM_OPTS_H__
|
92
RTLGDB/Project/rtl8195a/c_types.h
Normal file
92
RTLGDB/Project/rtl8195a/c_types.h
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
#ifndef _C_TYPES_H_
|
||||||
|
#define _C_TYPES_H_
|
||||||
|
/*
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef signed char sint8_t;
|
||||||
|
typedef signed char int8_t;
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
typedef signed short sint16_t;
|
||||||
|
typedef signed short int16_t;
|
||||||
|
typedef unsigned long uint32_t;
|
||||||
|
typedef signed long sint32_t;
|
||||||
|
typedef signed long int32_t;
|
||||||
|
typedef signed long long sint64_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
typedef unsigned long long u_int64_t;
|
||||||
|
typedef float real32_t;
|
||||||
|
typedef double real64_t;
|
||||||
|
|
||||||
|
typedef unsigned char uint8;
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef signed char sint8;
|
||||||
|
typedef signed char int8;
|
||||||
|
typedef signed char int8_t;
|
||||||
|
typedef unsigned short uint16;
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
typedef signed short sint16;
|
||||||
|
typedef signed short int16_t;
|
||||||
|
typedef unsigned int uint32;
|
||||||
|
typedef unsigned int u_int;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef signed int sint32;
|
||||||
|
typedef signed int int32_t;
|
||||||
|
typedef int int32;
|
||||||
|
typedef signed long long sint64;
|
||||||
|
typedef unsigned long long uint64;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
typedef float real32;
|
||||||
|
typedef double real64;
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __le16 uint16_t
|
||||||
|
|
||||||
|
typedef unsigned int size_t;
|
||||||
|
typedef int ssize_t;
|
||||||
|
|
||||||
|
#ifndef _SYS_CDEFS_H_
|
||||||
|
#define __packed __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define static static
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
#endif /* NULL */
|
||||||
|
|
||||||
|
/* probably should not put STATUS here */
|
||||||
|
typedef enum {
|
||||||
|
OK = 0,
|
||||||
|
FAIL,
|
||||||
|
PENDING,
|
||||||
|
BUSY,
|
||||||
|
CANCEL,
|
||||||
|
} STATUS;
|
||||||
|
|
||||||
|
#define BIT(nr) (1UL << (nr))
|
||||||
|
|
||||||
|
#define REG_SET_BIT(_r, _b) (*(volatile uint32_t*)(_r) |= (_b))
|
||||||
|
#define REG_CLR_BIT(_r, _b) (*(volatile uint32_t*)(_r) &= ~(_b))
|
||||||
|
|
||||||
|
#define DMEM_ATTR
|
||||||
|
#define SHMEM_ATTR
|
||||||
|
|
||||||
|
#ifdef ICACHE_FLASH
|
||||||
|
#define ICACHE_FLASH_ATTR
|
||||||
|
#define ICACHE_RODATA_ATTR
|
||||||
|
#else
|
||||||
|
#define ICACHE_FLASH_ATTR
|
||||||
|
#define ICACHE_RODATA_ATTR
|
||||||
|
#endif /* ICACHE_FLASH */
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
typedef unsigned char bool;
|
||||||
|
//#define BOOL bool
|
||||||
|
#define true (1)
|
||||||
|
#define false (0)
|
||||||
|
#define TRUE true
|
||||||
|
#define FALSE false
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !__cplusplus */
|
||||||
|
|
||||||
|
#endif /* _C_TYPES_H_ */
|
593
RTLGDB/Project/rtl8195a/os.h
Normal file
593
RTLGDB/Project/rtl8195a/os.h
Normal file
|
@ -0,0 +1,593 @@
|
||||||
|
/*
|
||||||
|
* OS specific functions
|
||||||
|
* Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
|
||||||
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
|
* See README for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_H
|
||||||
|
#define OS_H
|
||||||
|
|
||||||
|
//#include "basic_types.h"
|
||||||
|
#include <autoconf.h>
|
||||||
|
#include "osdep_service.h"
|
||||||
|
#include "freertos/wrapper.h"
|
||||||
|
#include "utils/rom/rom_wps_os.h"
|
||||||
|
|
||||||
|
typedef void* xqueue_handle_t;
|
||||||
|
|
||||||
|
typedef long os_time_t;
|
||||||
|
|
||||||
|
typedef _timer os_timer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_sleep - Sleep (sec, usec)
|
||||||
|
* @sec: Number of seconds to sleep
|
||||||
|
* @usec: Number of microseconds to sleep
|
||||||
|
*/
|
||||||
|
void os_sleep(os_time_t sec, os_time_t usec);
|
||||||
|
|
||||||
|
struct os_time {
|
||||||
|
os_time_t sec;
|
||||||
|
os_time_t usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct os_reltime {
|
||||||
|
os_time_t sec;
|
||||||
|
os_time_t usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_get_time - Get current time (sec, usec)
|
||||||
|
* @t: Pointer to buffer for the time
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int os_get_time(struct os_time *t);
|
||||||
|
|
||||||
|
int os_get_reltime(struct os_reltime *t);
|
||||||
|
/* Helper macros for handling struct os_time */
|
||||||
|
/* (&timeout->time, &tmp->time) */
|
||||||
|
#define os_time_before(a, b) \
|
||||||
|
((a)->sec < (b)->sec || \
|
||||||
|
((a)->sec == (b)->sec && (a)->usec < (b)->usec))
|
||||||
|
|
||||||
|
#define os_time_sub(a, b, res) do { \
|
||||||
|
(res)->sec = (a)->sec - (b)->sec; \
|
||||||
|
(res)->usec = (a)->usec - (b)->usec; \
|
||||||
|
if ((res)->usec < 0) { \
|
||||||
|
(res)->sec--; \
|
||||||
|
(res)->usec += 1000000; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_mktime - Convert broken-down time into seconds since 1970-01-01
|
||||||
|
* @year: Four digit year
|
||||||
|
* @month: Month (1 .. 12)
|
||||||
|
* @day: Day of month (1 .. 31)
|
||||||
|
* @hour: Hour (0 .. 23)
|
||||||
|
* @min: Minute (0 .. 59)
|
||||||
|
* @sec: Second (0 .. 60)
|
||||||
|
* @t: Buffer for returning calendar time representation (seconds since
|
||||||
|
* 1970-01-01 00:00:00)
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*
|
||||||
|
* Note: The result is in seconds from Epoch, i.e., in UTC, not in local time
|
||||||
|
* which is used by POSIX mktime().
|
||||||
|
*/
|
||||||
|
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||||
|
os_time_t *t);
|
||||||
|
|
||||||
|
struct os_tm {
|
||||||
|
int sec; /* 0..59 or 60 for leap seconds */
|
||||||
|
int min; /* 0..59 */
|
||||||
|
int hour; /* 0..23 */
|
||||||
|
int day; /* 1..31 */
|
||||||
|
int month; /* 1..12 */
|
||||||
|
int year; /* Four digit year */
|
||||||
|
};
|
||||||
|
|
||||||
|
int os_gmtime(os_time_t t, struct os_tm *tm);
|
||||||
|
|
||||||
|
/* Helpers for handling struct os_time */
|
||||||
|
|
||||||
|
/* Helpers for handling struct os_reltime */
|
||||||
|
|
||||||
|
static inline int os_reltime_before(struct os_reltime *a,
|
||||||
|
struct os_reltime *b)
|
||||||
|
{
|
||||||
|
return os_time_before(a,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void os_reltime_sub(struct os_reltime *a, struct os_reltime *b,
|
||||||
|
struct os_reltime *res)
|
||||||
|
{
|
||||||
|
os_time_sub(a,b,res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void os_reltime_age(struct os_reltime *start,
|
||||||
|
struct os_reltime *age)
|
||||||
|
{
|
||||||
|
struct os_reltime now;
|
||||||
|
|
||||||
|
os_get_time((struct os_time *)&now);
|
||||||
|
os_reltime_sub(&now, start, age);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline int os_reltime_expired(struct os_reltime *now,
|
||||||
|
struct os_reltime *ts,
|
||||||
|
os_time_t timeout_secs)
|
||||||
|
{
|
||||||
|
struct os_reltime age;
|
||||||
|
|
||||||
|
os_reltime_sub(now, ts, &age);
|
||||||
|
return (age.sec > timeout_secs) ||
|
||||||
|
(age.sec == timeout_secs && age.usec > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_daemonize - Run in the background (detach from the controlling terminal)
|
||||||
|
* @pid_file: File name to write the process ID to or %NULL to skip this
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int os_daemonize(const char *pid_file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_daemonize_terminate - Stop running in the background (remove pid file)
|
||||||
|
* @pid_file: File name to write the process ID to or %NULL to skip this
|
||||||
|
*/
|
||||||
|
void os_daemonize_terminate(const char *pid_file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_get_random - Get cryptographically strong pseudo random data
|
||||||
|
* @buf: Buffer for pseudo random data
|
||||||
|
* @len: Length of the buffer
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int os_get_random(unsigned char *buf, size_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_random - Get pseudo random value (not necessarily very strong)
|
||||||
|
* Returns: Pseudo random value
|
||||||
|
*/
|
||||||
|
unsigned long os_random(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_rel2abs_path - Get an absolute path for a file
|
||||||
|
* @rel_path: Relative path to a file
|
||||||
|
* Returns: Absolute path for the file or %NULL on failure
|
||||||
|
*
|
||||||
|
* This function tries to convert a relative path of a file to an absolute path
|
||||||
|
* in order for the file to be found even if current working directory has
|
||||||
|
* changed. The returned value is allocated and caller is responsible for
|
||||||
|
* freeing it. It is acceptable to just return the same path in an allocated
|
||||||
|
* buffer, e.g., return strdup(rel_path). This function is only used to find
|
||||||
|
* configuration files when os_daemonize() may have changed the current working
|
||||||
|
* directory and relative path would be pointing to a different location.
|
||||||
|
*/
|
||||||
|
char * os_rel2abs_path(const char *rel_path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_program_init - Program initialization (called at start)
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*
|
||||||
|
* This function is called when a programs starts. If there are any OS specific
|
||||||
|
* processing that is needed, it can be placed here. It is also acceptable to
|
||||||
|
* just return 0 if not special processing is needed.
|
||||||
|
*/
|
||||||
|
int os_program_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_program_deinit - Program deinitialization (called just before exit)
|
||||||
|
*
|
||||||
|
* This function is called just before a program exists. If there are any OS
|
||||||
|
* specific processing, e.g., freeing resourced allocated in os_program_init(),
|
||||||
|
* it should be done here. It is also acceptable for this function to do
|
||||||
|
* nothing.
|
||||||
|
*/
|
||||||
|
void os_program_deinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_setenv - Set environment variable
|
||||||
|
* @name: Name of the variable
|
||||||
|
* @value: Value to set to the variable
|
||||||
|
* @overwrite: Whether existing variable should be overwritten
|
||||||
|
* Returns: 0 on success, -1 on error
|
||||||
|
*
|
||||||
|
* This function is only used for wpa_cli action scripts. OS wrapper does not
|
||||||
|
* need to implement this if such functionality is not needed.
|
||||||
|
*/
|
||||||
|
int os_setenv(const char *name, const char *value, int overwrite);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_unsetenv - Delete environent variable
|
||||||
|
* @name: Name of the variable
|
||||||
|
* Returns: 0 on success, -1 on error
|
||||||
|
*
|
||||||
|
* This function is only used for wpa_cli action scripts. OS wrapper does not
|
||||||
|
* need to implement this if such functionality is not needed.
|
||||||
|
*/
|
||||||
|
int os_unsetenv(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_readfile - Read a file to an allocated memory buffer
|
||||||
|
* @name: Name of the file to read
|
||||||
|
* @len: For returning the length of the allocated buffer
|
||||||
|
* Returns: Pointer to the allocated buffer or %NULL on failure
|
||||||
|
*
|
||||||
|
* This function allocates memory and reads the given file to this buffer. Both
|
||||||
|
* binary and text files can be read with this function. The caller is
|
||||||
|
* responsible for freeing the returned buffer with os_free().
|
||||||
|
*/
|
||||||
|
char * os_readfile(const char *name, size_t *len);
|
||||||
|
|
||||||
|
//#if 0
|
||||||
|
/**
|
||||||
|
* os_zalloc - Allocate and zero memory
|
||||||
|
* @size: Number of bytes to allocate
|
||||||
|
* Returns: Pointer to allocated and zeroed memory or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer with os_free().
|
||||||
|
*/
|
||||||
|
void * os_zalloc(size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_calloc - Allocate and zero memory for an array
|
||||||
|
* @nmemb: Number of members in the array
|
||||||
|
* @size: Number of bytes in each member
|
||||||
|
* Returns: Pointer to allocated and zeroed memory or %NULL on failure
|
||||||
|
*
|
||||||
|
* This function can be used as a wrapper for os_zalloc(nmemb * size) when an
|
||||||
|
* allocation is used for an array. The main benefit over os_zalloc() is in
|
||||||
|
* having an extra check to catch integer overflows in multiplication.
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer with os_free().
|
||||||
|
*/
|
||||||
|
static inline void * os_calloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
if (size && nmemb > (~(size_t) 0) / size)
|
||||||
|
return NULL;
|
||||||
|
return os_zalloc(nmemb * size);
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
|
||||||
|
static inline int os_memcmp_const(const void *a, const void *b, size_t len)
|
||||||
|
{
|
||||||
|
const uint8_t *aa = a;
|
||||||
|
const uint8_t *bb = b;
|
||||||
|
size_t i;
|
||||||
|
uint8_t res;
|
||||||
|
|
||||||
|
for (res = 0, i = 0; i < len; i++)
|
||||||
|
res |= aa[i] ^ bb[i];
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following functions are wrapper for standard ANSI C or POSIX functions.
|
||||||
|
* By default, they are just defined to use the standard function name and no
|
||||||
|
* os_*.c implementation is needed for them. This avoids extra function calls
|
||||||
|
* by allowing the C pre-processor take care of the function name mapping.
|
||||||
|
*
|
||||||
|
* If the target system uses a C library that does not provide these functions,
|
||||||
|
* build_config.h can be used to define the wrappers to use a different
|
||||||
|
* function name. This can be done on function-by-function basis since the
|
||||||
|
* defines here are only used if build_config.h does not define the os_* name.
|
||||||
|
* If needed, os_*.c file can be used to implement the functions that are not
|
||||||
|
* included in the C library on the target system. Alternatively,
|
||||||
|
* OS_NO_C_LIB_DEFINES can be defined to skip all defines here in which case
|
||||||
|
* these functions need to be implemented in os_*.c file for the target system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef OS_NO_C_LIB_DEFINES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_malloc - Allocate dynamic memory
|
||||||
|
* @size: Size of the buffer to allocate
|
||||||
|
* Returns: Allocated buffer or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer with os_free().
|
||||||
|
*/
|
||||||
|
void * os_malloc(size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_realloc - Re-allocate dynamic memory
|
||||||
|
* @ptr: Old buffer from os_malloc() or os_realloc()
|
||||||
|
* @size: Size of the new buffer
|
||||||
|
* Returns: Allocated buffer or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer with os_free().
|
||||||
|
* If re-allocation fails, %NULL is returned and the original buffer (ptr) is
|
||||||
|
* not freed and caller is still responsible for freeing it.
|
||||||
|
*/
|
||||||
|
void * os_realloc(void *ptr, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_free - Free dynamic memory
|
||||||
|
* @ptr: Old buffer from os_malloc() or os_realloc(); can be %NULL
|
||||||
|
*/
|
||||||
|
void os_free(void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_memcpy - Copy memory area
|
||||||
|
* @dest: Destination
|
||||||
|
* @src: Source
|
||||||
|
* @n: Number of bytes to copy
|
||||||
|
* Returns: dest
|
||||||
|
*
|
||||||
|
* The memory areas src and dst must not overlap. os_memmove() can be used with
|
||||||
|
* overlapping memory.
|
||||||
|
*/
|
||||||
|
void * os_memcpy(void *dest, const void *src, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_memmove - Copy memory area
|
||||||
|
* @dest: Destination
|
||||||
|
* @src: Source
|
||||||
|
* @n: Number of bytes to copy
|
||||||
|
* Returns: dest
|
||||||
|
*
|
||||||
|
* The memory areas src and dst may overlap.
|
||||||
|
*/
|
||||||
|
void *os_memmove(void *dest, const void *src, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_memset - Fill memory with a constant byte
|
||||||
|
* @s: Memory area to be filled
|
||||||
|
* @c: Constant byte
|
||||||
|
* @n: Number of bytes started from s to fill with c
|
||||||
|
* Returns: s
|
||||||
|
*/
|
||||||
|
void *os_memset(void *s, int c, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_memcmp - Compare memory areas
|
||||||
|
* @s1: First buffer
|
||||||
|
* @s2: Second buffer
|
||||||
|
* @n: Maximum numbers of octets to compare
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||||
|
* found to be less than, to match, or be greater than s2. Only first n
|
||||||
|
* characters will be compared.
|
||||||
|
*/
|
||||||
|
int os_memcmp(const void *s1, const void *s2, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strdup - Duplicate a string
|
||||||
|
* @s: Source string
|
||||||
|
* Returns: Allocated buffer with the string copied into it or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer with os_free().
|
||||||
|
*/
|
||||||
|
char *os_strdup(const char *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strlen - Calculate the length of a string
|
||||||
|
* @s: '\0' terminated string
|
||||||
|
* Returns: Number of characters in s (not counting the '\0' terminator)
|
||||||
|
*/
|
||||||
|
size_t os_strlen(const char *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strcasecmp - Compare two strings ignoring case
|
||||||
|
* @s1: First string
|
||||||
|
* @s2: Second string
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||||
|
* found to be less than, to match, or be greatred than s2
|
||||||
|
*/
|
||||||
|
int os_strcasecmp(const char *s1, const char *s2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strncasecmp - Compare two strings ignoring case
|
||||||
|
* @s1: First string
|
||||||
|
* @s2: Second string
|
||||||
|
* @n: Maximum numbers of characters to compare
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||||
|
* found to be less than, to match, or be greater than s2. Only first n
|
||||||
|
* characters will be compared.
|
||||||
|
*/
|
||||||
|
int os_strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strchr - Locate the first occurrence of a character in string
|
||||||
|
* @s: String
|
||||||
|
* @c: Character to search for
|
||||||
|
* Returns: Pointer to the matched character or %NULL if not found
|
||||||
|
*/
|
||||||
|
char *os_strchr(const char *s, int c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strrchr - Locate the last occurrence of a character in string
|
||||||
|
* @s: String
|
||||||
|
* @c: Character to search for
|
||||||
|
* Returns: Pointer to the matched character or %NULL if not found
|
||||||
|
*/
|
||||||
|
char *os_strrchr(const char *s, int c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strcmp - Compare two strings
|
||||||
|
* @s1: First string
|
||||||
|
* @s2: Second string
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||||
|
* found to be less than, to match, or be greatred than s2
|
||||||
|
*/
|
||||||
|
int os_strcmp(const char *s1, const char *s2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strncmp - Compare two strings
|
||||||
|
* @s1: First string
|
||||||
|
* @s2: Second string
|
||||||
|
* @n: Maximum numbers of characters to compare
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||||
|
* found to be less than, to match, or be greater than s2. Only first n
|
||||||
|
* characters will be compared.
|
||||||
|
*/
|
||||||
|
int os_strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strncpy - Copy a string
|
||||||
|
* @dest: Destination
|
||||||
|
* @src: Source
|
||||||
|
* @n: Maximum number of characters to copy
|
||||||
|
* Returns: dest
|
||||||
|
*/
|
||||||
|
char *os_strncpy(char *dest, const char *src, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_strstr - Locate a substring
|
||||||
|
* @haystack: String (haystack) to search from
|
||||||
|
* @needle: Needle to search from haystack
|
||||||
|
* Returns: Pointer to the beginning of the substring or %NULL if not found
|
||||||
|
*/
|
||||||
|
char *os_strstr(const char *haystack, const char *needle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_snprintf - Print to a memory buffer
|
||||||
|
* @str: Memory buffer to print into
|
||||||
|
* @size: Maximum length of the str buffer
|
||||||
|
* @format: printf format
|
||||||
|
* Returns: Number of characters printed (not including trailing '\0').
|
||||||
|
*
|
||||||
|
* If the output buffer is truncated, number of characters which would have
|
||||||
|
* been written is returned. Since some C libraries return -1 in such a case,
|
||||||
|
* the caller must be prepared on that value, too, to indicate truncation.
|
||||||
|
*
|
||||||
|
* Note: Some C library implementations of snprintf() may not guarantee null
|
||||||
|
* termination in case the output is truncated. The OS wrapper function of
|
||||||
|
* os_snprintf() should provide this guarantee, i.e., to null terminate the
|
||||||
|
* output buffer if a C library version of the function is used and if that
|
||||||
|
* function does not guarantee null termination.
|
||||||
|
*
|
||||||
|
* If the target system does not include snprintf(), see, e.g.,
|
||||||
|
* http://www.ijs.si/software/snprintf/ for an example of a portable
|
||||||
|
* implementation of snprintf.
|
||||||
|
*/
|
||||||
|
int os_snprintf(char *str, size_t size, const char *format, ...);
|
||||||
|
|
||||||
|
#else /* OS_NO_C_LIB_DEFINES */
|
||||||
|
|
||||||
|
#if !defined(CONFIG_PLATFORM_8195A) && !defined(CONFIG_PLATFORM_8711B)
|
||||||
|
#ifdef CONFIG_MEM_MONITOR
|
||||||
|
uint8_t* os_malloc(uint32_t sz);
|
||||||
|
void os_mfree(uint8_t *pbuf, uint32_t sz);
|
||||||
|
#ifndef os_free
|
||||||
|
#define os_free(p, sz) os_mfree(((uint8_t*)(p)), (sz))
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifndef os_malloc
|
||||||
|
#define os_malloc(sz) _rtw_malloc(sz)
|
||||||
|
#endif
|
||||||
|
#ifndef os_free
|
||||||
|
#define os_free(p, sz) _rtw_mfree(((uint8_t*)(p)), (sz))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
extern void *os_zalloc(size_t size);
|
||||||
|
extern char *os_strdup(const char *string_copy_from);
|
||||||
|
|
||||||
|
#ifndef os_sleep
|
||||||
|
#define os_sleep(s, us) rtw_mdelay_os((s)*1000 + (us)/1000)
|
||||||
|
#endif
|
||||||
|
#ifndef os_memcpy
|
||||||
|
#define os_memcpy(d, s, n) rtw_memcpy((void*)(d), ((void*)(s)), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_memmove
|
||||||
|
#define os_memmove(d, s, n) memmove((d), (s), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_memset
|
||||||
|
#define os_memset(pbuf, c, sz) rtw_memset(pbuf, c, sz)
|
||||||
|
#endif
|
||||||
|
#ifndef os_memcmp
|
||||||
|
#define os_memcmp(s1, s2, n) rtw_memcmp(((void*)(s1)), ((void*)(s2)), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_memcmp_p2p
|
||||||
|
#define os_memcmp_p2p(s1, s2, n) memcmp((s1), (s2), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_get_random_bytes
|
||||||
|
#define os_get_random_bytes(d,sz) rtw_get_random_bytes(((void*)(d)), (sz))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strlen
|
||||||
|
#define os_strlen(s) strlen(s)
|
||||||
|
#endif
|
||||||
|
#ifndef os_strcasecmp
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define os_strcasecmp(s1, s2) _stricmp((s1), (s2))
|
||||||
|
#else
|
||||||
|
#define os_strcasecmp(s1, s2) strcasecmp((s1), (s2))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef os_strncasecmp
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define os_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n))
|
||||||
|
#else
|
||||||
|
#define os_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef os_init_timer
|
||||||
|
#define os_init_timer(t, p, f, x, n) rtw_init_timer((t), (p), (f), (x), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_set_timer
|
||||||
|
#define os_set_timer(t, d) rtw_set_timer((t), (d))
|
||||||
|
#endif
|
||||||
|
#ifndef os_cancel_timer
|
||||||
|
#define os_cancel_timer(t) rtw_cancel_timer(t)
|
||||||
|
#endif
|
||||||
|
#ifndef os_del_timer
|
||||||
|
#define os_del_timer(t) rtw_del_timer(t)
|
||||||
|
#endif
|
||||||
|
#ifndef os_atoi
|
||||||
|
#define os_atoi(s) rtw_atoi(s)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef os_strchr
|
||||||
|
#define os_strchr(s, c) strchr((s), (c))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strcmp
|
||||||
|
#define os_strcmp(s1, s2) strcmp((s1), (s2))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strncmp
|
||||||
|
#define os_strncmp(s1, s2, n) strncmp((s1), (s2), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strncpy
|
||||||
|
#define os_strncpy(d, s, n) strncpy((d), (s), (n))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strrchr
|
||||||
|
#define os_strrchr(s, c) strrchr((s), (c))
|
||||||
|
#endif
|
||||||
|
#ifndef os_strstr
|
||||||
|
#define os_strstr(h, n) strstr((h), (n))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef os_snprintf
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define os_snprintf _snprintf
|
||||||
|
#else
|
||||||
|
#define os_snprintf snprintf
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OS_NO_C_LIB_DEFINES */
|
||||||
|
|
||||||
|
|
||||||
|
static inline void * os_realloc_array(void *ptr, size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
if (size && nmemb > (~(size_t) 0) / size)
|
||||||
|
return NULL;
|
||||||
|
return os_realloc(ptr, nmemb * size, nmemb * size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *os_xqueue_create(unsigned long uxQueueLength, unsigned long uxItemSize) ;
|
||||||
|
|
||||||
|
int os_xqueue_receive(xqueue_handle_t xQueue, void * const pvBuffer, unsigned long xSecsToWait);
|
||||||
|
|
||||||
|
void os_xqueue_delete(xqueue_handle_t xQueue );
|
||||||
|
|
||||||
|
int os_xqueue_send(xqueue_handle_t xQueue, const void * const pvItemToQueue, unsigned long xSecsToWait);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OS_H */
|
204
RTLGDB/Project/rtl8195a/queue.h
Normal file
204
RTLGDB/Project/rtl8195a/queue.h
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
#ifndef _SYS_QUEUE_H_
|
||||||
|
#define _SYS_QUEUE_H_
|
||||||
|
|
||||||
|
#define QMD_SAVELINK(name, link)
|
||||||
|
#define TRASHIT(x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Singly-linked List declarations.
|
||||||
|
*/
|
||||||
|
#define SLIST_HEAD(name, type) \
|
||||||
|
struct name { \
|
||||||
|
struct type *slh_first; /* first element */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SLIST_HEAD_INITIALIZER(head) \
|
||||||
|
{ NULL }
|
||||||
|
|
||||||
|
#define SLIST_ENTRY(type) \
|
||||||
|
struct { \
|
||||||
|
struct type *sle_next; /* next element */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Singly-linked List functions.
|
||||||
|
*/
|
||||||
|
#define SLIST_EMPTY(head) ((head)->slh_first == NULL)
|
||||||
|
|
||||||
|
#define SLIST_FIRST(head) ((head)->slh_first)
|
||||||
|
|
||||||
|
#define SLIST_FOREACH(var, head, field) \
|
||||||
|
for ((var) = SLIST_FIRST((head)); \
|
||||||
|
(var); \
|
||||||
|
(var) = SLIST_NEXT((var), field))
|
||||||
|
|
||||||
|
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
|
||||||
|
for ((var) = SLIST_FIRST((head)); \
|
||||||
|
(var) && ((tvar) = SLIST_NEXT((var), field), 1); \
|
||||||
|
(var) = (tvar))
|
||||||
|
|
||||||
|
#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
|
||||||
|
for ((varp) = &SLIST_FIRST((head)); \
|
||||||
|
((var) = *(varp)) != NULL; \
|
||||||
|
(varp) = &SLIST_NEXT((var), field))
|
||||||
|
|
||||||
|
#define SLIST_INIT(head) do { \
|
||||||
|
SLIST_FIRST((head)) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
|
||||||
|
SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \
|
||||||
|
SLIST_NEXT((slistelm), field) = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SLIST_INSERT_HEAD(head, elm, field) do { \
|
||||||
|
SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \
|
||||||
|
SLIST_FIRST((head)) = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
|
||||||
|
|
||||||
|
#define SLIST_REMOVE(head, elm, type, field) do { \
|
||||||
|
QMD_SAVELINK(oldnext, (elm)->field.sle_next); \
|
||||||
|
if (SLIST_FIRST((head)) == (elm)) { \
|
||||||
|
SLIST_REMOVE_HEAD((head), field); \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
struct type *curelm = SLIST_FIRST((head)); \
|
||||||
|
while (SLIST_NEXT(curelm, field) != (elm)) \
|
||||||
|
curelm = SLIST_NEXT(curelm, field); \
|
||||||
|
SLIST_REMOVE_AFTER(curelm, field); \
|
||||||
|
} \
|
||||||
|
TRASHIT(*oldnext); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SLIST_REMOVE_AFTER(elm, field) do { \
|
||||||
|
SLIST_NEXT(elm, field) = \
|
||||||
|
SLIST_NEXT(SLIST_NEXT(elm, field), field); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SLIST_REMOVE_HEAD(head, field) do { \
|
||||||
|
SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Singly-linked Tail queue declarations.
|
||||||
|
*/
|
||||||
|
#define STAILQ_HEAD(name, type) \
|
||||||
|
struct name { \
|
||||||
|
struct type *stqh_first;/* first element */ \
|
||||||
|
struct type **stqh_last;/* addr of last next element */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define STAILQ_HEAD_INITIALIZER(head) \
|
||||||
|
{ NULL, &(head).stqh_first }
|
||||||
|
|
||||||
|
#define STAILQ_ENTRY(type) \
|
||||||
|
struct { \
|
||||||
|
struct type *stqe_next; /* next element */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Singly-linked Tail queue functions.
|
||||||
|
*/
|
||||||
|
#define STAILQ_CONCAT(head1, head2) do { \
|
||||||
|
if (!STAILQ_EMPTY((head2))) { \
|
||||||
|
*(head1)->stqh_last = (head2)->stqh_first; \
|
||||||
|
(head1)->stqh_last = (head2)->stqh_last; \
|
||||||
|
STAILQ_INIT((head2)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
|
||||||
|
|
||||||
|
#define STAILQ_FIRST(head) ((head)->stqh_first)
|
||||||
|
|
||||||
|
#define STAILQ_FOREACH(var, head, field) \
|
||||||
|
for((var) = STAILQ_FIRST((head)); \
|
||||||
|
(var); \
|
||||||
|
(var) = STAILQ_NEXT((var), field))
|
||||||
|
|
||||||
|
|
||||||
|
#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
|
||||||
|
for ((var) = STAILQ_FIRST((head)); \
|
||||||
|
(var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
|
||||||
|
(var) = (tvar))
|
||||||
|
|
||||||
|
#define STAILQ_INIT(head) do { \
|
||||||
|
STAILQ_FIRST((head)) = NULL; \
|
||||||
|
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \
|
||||||
|
if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
|
||||||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||||
|
STAILQ_NEXT((tqelm), field) = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_INSERT_HEAD(head, elm, field) do { \
|
||||||
|
if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
|
||||||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||||
|
STAILQ_FIRST((head)) = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_INSERT_TAIL(head, elm, field) do { \
|
||||||
|
STAILQ_NEXT((elm), field) = NULL; \
|
||||||
|
*(head)->stqh_last = (elm); \
|
||||||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_LAST(head, type, field) \
|
||||||
|
(STAILQ_EMPTY((head)) ? \
|
||||||
|
NULL : \
|
||||||
|
((struct type *)(void *) \
|
||||||
|
((char *)((head)->stqh_last) - __offsetof(struct type, field))))
|
||||||
|
|
||||||
|
#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
|
||||||
|
|
||||||
|
#define STAILQ_REMOVE(head, elm, type, field) do { \
|
||||||
|
QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \
|
||||||
|
if (STAILQ_FIRST((head)) == (elm)) { \
|
||||||
|
STAILQ_REMOVE_HEAD((head), field); \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
struct type *curelm = STAILQ_FIRST((head)); \
|
||||||
|
while (STAILQ_NEXT(curelm, field) != (elm)) \
|
||||||
|
curelm = STAILQ_NEXT(curelm, field); \
|
||||||
|
STAILQ_REMOVE_AFTER(head, curelm, field); \
|
||||||
|
} \
|
||||||
|
TRASHIT(*oldnext); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_REMOVE_HEAD(head, field) do { \
|
||||||
|
if ((STAILQ_FIRST((head)) = \
|
||||||
|
STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
|
||||||
|
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_REMOVE_AFTER(head, elm, field) do { \
|
||||||
|
if ((STAILQ_NEXT(elm, field) = \
|
||||||
|
STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
|
||||||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_SWAP(head1, head2, type) do { \
|
||||||
|
struct type *swap_first = STAILQ_FIRST(head1); \
|
||||||
|
struct type **swap_last = (head1)->stqh_last; \
|
||||||
|
STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \
|
||||||
|
(head1)->stqh_last = (head2)->stqh_last; \
|
||||||
|
STAILQ_FIRST(head2) = swap_first; \
|
||||||
|
(head2)->stqh_last = swap_last; \
|
||||||
|
if (STAILQ_EMPTY(head1)) \
|
||||||
|
(head1)->stqh_last = &STAILQ_FIRST(head1); \
|
||||||
|
if (STAILQ_EMPTY(head2)) \
|
||||||
|
(head2)->stqh_last = &STAILQ_FIRST(head2); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STAILQ_INSERT_CHAIN_HEAD(head, elm_chead, elm_ctail, field) do { \
|
||||||
|
if ((STAILQ_NEXT(elm_ctail, field) = STAILQ_FIRST(head)) == NULL ) { \
|
||||||
|
(head)->stqh_last = &STAILQ_NEXT(elm_ctail, field); \
|
||||||
|
} \
|
||||||
|
STAILQ_FIRST(head) = (elm_chead); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* !_SYS_QUEUE_H_ */
|
24
RTLGDB/Project/rtl8195a/rom_wps_os.h
Normal file
24
RTLGDB/Project/rtl8195a/rom_wps_os.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* OS specific functions
|
||||||
|
* Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
|
||||||
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
|
* See README for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ROM_WPS_OS_H
|
||||||
|
#define ROM_WPS_OS_H
|
||||||
|
|
||||||
|
#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B)
|
||||||
|
|
||||||
|
#include <rom_wlan_ram_map.h>
|
||||||
|
extern struct _rom_wlan_ram_map rom_wlan_ram_map;
|
||||||
|
#define os_malloc(sz) rom_wlan_ram_map.rtw_malloc(sz)
|
||||||
|
#define os_free(p, sz) rom_wlan_ram_map.rtw_mfree(((uint8_t*)(p)), (sz))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t *WPS_realloc(uint8_t *old_buf, uint32_t old_sz, uint32_t new_sz);
|
||||||
|
#define os_realloc(p, os, ns) WPS_realloc(((uint8_t*)(p)),(os),(ns))
|
||||||
|
|
||||||
|
#endif /* ROM_WPS_OS_H */
|
15
RTLGDB/Project/rtl8195a/rtl_common.h
Normal file
15
RTLGDB/Project/rtl8195a/rtl_common.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __RTL_COMMON_H__
|
||||||
|
#define __RTL_COMMON_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "c_types.h"
|
||||||
|
|
||||||
|
#endif
|
164
RTLGDB/Project/rtl8195a/rtl_libc.h
Normal file
164
RTLGDB/Project/rtl8195a/rtl_libc.h
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
/*
|
||||||
|
* ROM calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INC_RTL_LIBC_
|
||||||
|
#define _INC_RTL_LIBC_
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
#define malloc(size) pvPortMalloc(size)
|
||||||
|
#undef free
|
||||||
|
#define free(pbuf) vPortFree(pbuf)
|
||||||
|
|
||||||
|
#define atoi(str) prvAtoi(str)
|
||||||
|
|
||||||
|
#define calloc(nelements, elementSize) calloc_freertos(nelements, elementSize)
|
||||||
|
|
||||||
|
#define snprintf rtl_snprintf
|
||||||
|
#define sprintf rtl_sprintf
|
||||||
|
#define printf rtl_printf
|
||||||
|
#define vprintf rtl_vprintf
|
||||||
|
#define vsnprintf rtl_vsnprintf
|
||||||
|
#define vfprintf rtl_vfprintf
|
||||||
|
#define memchr rtl_memchr
|
||||||
|
#define memcmp rtl_memcmp
|
||||||
|
#define memcpy rtl_memcpy
|
||||||
|
#define memmove rtl_memmove
|
||||||
|
#define memset rtl_memset
|
||||||
|
#define strcat rtl_strcat
|
||||||
|
#define strchr rtl_strchr
|
||||||
|
#define strcmp rtl_strcmp
|
||||||
|
#define strcpy rtl_strcpy
|
||||||
|
#define strlen rtl_strlen
|
||||||
|
#define strncat rtl_strncat
|
||||||
|
#define strncmp rtl_strncmp
|
||||||
|
#define strncpy rtl_strncpy
|
||||||
|
#define strstr rtl_strstr
|
||||||
|
#define strsep rtl_strsep
|
||||||
|
#define strtok rtl_strtok
|
||||||
|
|
||||||
|
#define dtoi rtl_dtoi
|
||||||
|
#define dtoui rtl_dtoui
|
||||||
|
#define i2f rtl_i2f
|
||||||
|
#define i2d rtl_i2d
|
||||||
|
#define ui2f rtl_ui2f
|
||||||
|
#define ui2d rtl_ui2d
|
||||||
|
#define itoa rtl_itoa
|
||||||
|
#define ltoa rtl_ltoa
|
||||||
|
#define utoa rtl_utoa
|
||||||
|
#define ultoa rtl_ultoa
|
||||||
|
#define ftol rtl_ftol
|
||||||
|
#define ftod rtl_ftod
|
||||||
|
#define dtof rtl_dtof
|
||||||
|
#define fadd rtl_fadd
|
||||||
|
#define fsub rtl_fsub
|
||||||
|
#define fmul rtl_fmul
|
||||||
|
#define fdiv rtl_fdiv
|
||||||
|
#define dadd rtl_dadd
|
||||||
|
#define dsub rtl_dsub
|
||||||
|
#define dmul rtl_dmul
|
||||||
|
#define ddiv rtl_ddiv
|
||||||
|
#define dcmpeq rtl_dcmpeq
|
||||||
|
#define dcmplt rtl_dcmplt
|
||||||
|
#define dcmple rtl_dcmple
|
||||||
|
#define dcmpgt rtl_dcmpgt
|
||||||
|
#define fcmplt rtl_fcmplt
|
||||||
|
#define fcmpgt rtl_fcmpgt
|
||||||
|
|
||||||
|
#define fabsf rtl_fabsf
|
||||||
|
#define fabs rtl_fabs
|
||||||
|
#define cos_f32 rtl_cos_f32
|
||||||
|
#define sin_f32 rtl_sin_f32
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
extern void *calloc_freertos(size_t nelements, size_t elementSize);
|
||||||
|
// ram_libc.c
|
||||||
|
extern int rtl_snprintf(char *str, size_t size, const char *fmt, ...);
|
||||||
|
extern int rtl_sprintf(char *str, const char *fmt, ...);
|
||||||
|
extern int rtl_printf(const char *fmt, ...);
|
||||||
|
extern int rtl_vprintf(const char *fmt, void *param);
|
||||||
|
extern int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param);
|
||||||
|
extern int rtl_vfprintf(FILE *fp, const char *fmt0, va_list ap);
|
||||||
|
extern int rtl_memchr(const void *src_void, int c, size_t length);
|
||||||
|
extern int rtl_memcmp(const void *m1, const void *m2, size_t n);
|
||||||
|
extern int rtl_memcpy(void *dst0, const void *src0, size_t len0);
|
||||||
|
extern int rtl_memmove(void *dst_void, const void *src_void, size_t length);
|
||||||
|
extern int rtl_memset(void *m, int c, size_t n);
|
||||||
|
extern char * rtl_strcat(char *s1, const char *s2);
|
||||||
|
extern char * rtl_strchr(const char *s1, int i);
|
||||||
|
extern int rtl_strcmp(const char *s1, const char *s2);
|
||||||
|
extern char * rtl_strcpy(char *dst0, const char *src0);
|
||||||
|
extern int rtl_strlen(const char *str);
|
||||||
|
extern char * rtl_strncat(char *s1, const char *s2, size_t n);
|
||||||
|
extern int rtl_strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
extern char * rtl_strncpy(char *dst0, const char *src0, size_t count);
|
||||||
|
extern char * rtl_strstr(const char *searchee, const char *lookfor);
|
||||||
|
extern char * rtl_strsep(char **source_ptr, const char *delim);
|
||||||
|
extern char * rtl_strtok(char *s, const char *delim);
|
||||||
|
|
||||||
|
//rtl_eabi_cast_ram.c
|
||||||
|
extern int rtl_dtoi(double d);
|
||||||
|
extern int rtl_dtoui(double d);
|
||||||
|
extern float rtl_i2f(int val);
|
||||||
|
extern int rtl_i2d(int val);
|
||||||
|
extern float rtl_ui2f(unsigned int val);
|
||||||
|
extern int rtl_ui2d(unsigned int val);
|
||||||
|
extern char *rtl_itoa(int value, char *string, int radix);
|
||||||
|
extern char *rtl_ltoa(int value, char *string, int radix);
|
||||||
|
extern char *rtl_utoa(unsigned int value, char *string, int radix);
|
||||||
|
extern char *rtl_ultoa(unsigned int value, char *string, int radix);
|
||||||
|
extern int rtl_ftol(float f);
|
||||||
|
extern int rtl_ftod(float f);
|
||||||
|
extern float rtl_dtof(double d);
|
||||||
|
extern float rtl_fadd(float a, float b);
|
||||||
|
extern float rtl_fsub(float a, float b);
|
||||||
|
extern float rtl_fmul(float a, float b);
|
||||||
|
extern float rtl_fdiv(float a, float b);
|
||||||
|
extern int rtl_dadd(double a, double b);
|
||||||
|
extern int rtl_dsub(double a, double b);
|
||||||
|
extern int rtl_dmul(double a, double b);
|
||||||
|
extern int rtl_ddiv(double a, double b);
|
||||||
|
extern int rtl_dcmpeq(double a, double b);
|
||||||
|
extern int rtl_dcmplt(double a, double b);
|
||||||
|
extern int rtl_dcmple(double a, double b);
|
||||||
|
extern int rtl_dcmpgt(double a, double b);
|
||||||
|
extern int rtl_fcmplt(float a, float b);
|
||||||
|
extern int rtl_fcmpgt(float a, float b);
|
||||||
|
|
||||||
|
// rtl_math_ram.c
|
||||||
|
extern float rtl_fabsf(float a);
|
||||||
|
extern int rtl_fabs(double a);
|
||||||
|
extern float rtl_cos_f32(float a);
|
||||||
|
extern float rtl_sin_f32(float a);
|
||||||
|
|
||||||
|
// ram_pvvx_libc.c
|
||||||
|
extern int snprintf(char *str, size_t size, const char *fmt, ...);
|
||||||
|
extern int sprintf(char *str, const char *fmt, ...);
|
||||||
|
extern int printf(const char *fmt, ...);
|
||||||
|
extern int vprintf(const char *fmt, void *param);
|
||||||
|
extern int vsnprintf(char *str, size_t size, const char *fmt, void *param);
|
||||||
|
extern int vfprintf(FILE *fp, const char *fmt0, va_list ap);
|
||||||
|
extern int memchr(const void *src_void, int c, size_t length);
|
||||||
|
extern int memcmp(const void *m1, const void *m2, size_t n);
|
||||||
|
extern int memcpy(void *dst0, const void *src0, size_t len0);
|
||||||
|
extern int memmove(void *dst_void, const void *src_void, size_t length);
|
||||||
|
extern int memset(void *m, int c, size_t n);
|
||||||
|
extern char * strcat(char *s1, const char *s2);
|
||||||
|
extern char * strchr(const char *s1, int i);
|
||||||
|
extern int strcmp(const char *s1, const char *s2);
|
||||||
|
extern char * strcpy(char *dst0, const char *src0);
|
||||||
|
extern int strlen(const char *str);
|
||||||
|
extern char * strncat(char *s1, const char *s2, size_t n);
|
||||||
|
extern int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
extern char * strncpy(char *dst0, const char *src0, size_t count);
|
||||||
|
extern char * strstr(const char *searchee, const char *lookfor);
|
||||||
|
extern char * strsep(char **source_ptr, const char *delim);
|
||||||
|
extern char * strtok(char *s, const char *delim);
|
||||||
|
extern int sscanf(const char *buf, const char *fmt, ...);
|
||||||
|
extern char toupper(char ch);
|
||||||
|
extern int _stricmp (const char *s1, const char *s2);
|
||||||
|
extern unsigned long long __aeabi_llsr(unsigned long long val, unsigned int shift);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _INC_RTL_LIBC_
|
67
RTLGDB/Project/sys_cfg.h
Normal file
67
RTLGDB/Project/sys_cfg.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* sys_cfg.h
|
||||||
|
*
|
||||||
|
* Created on: 17/04/17
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#ifndef __SYS_CFG_H__
|
||||||
|
#define __SYS_CFG_H__
|
||||||
|
#include "user_config.h"
|
||||||
|
#define FEEP_ID_SYS_CFG 0x5359
|
||||||
|
|
||||||
|
struct sys_bits_config {
|
||||||
|
uint16 powersave_enable : 1; //0 0x0000001 =1 Включение режима экономии энергии (актуально в режиме ST), отключает LogUART
|
||||||
|
uint16 pin_clear_cfg_enable : 1; //1 0x0000002 =1 Проверять ножку RX на сброс конфигурации WiFi
|
||||||
|
uint16 debug_print_enable : 1; //2 0x0000004 =1 Вывод отладочной информации на GPIO2
|
||||||
|
uint16 web_time_wait_delete : 1; //3 0x0000008 =1 Закрывать соединение и убивать pcb c TIME_WAIT
|
||||||
|
uint16 netbios_ena : 1; //4 0x0000010 =1 включить NetBios
|
||||||
|
uint16 sntp_ena : 1; //5 0x0000020 =1 включить SNTP
|
||||||
|
uint16 cdns_ena : 1; //6 0x0000040 =1 включить CAPDNS
|
||||||
|
uint16 tcp2uart_reopen : 1; //7 0x0000080 =1 открытие нового соединения tcp2uart ведет к закрытию старого соединения (в режиме tcp2uart = сервер)
|
||||||
|
uint16 mdb_reopen : 1; //8 0x0000100 =1 открытие нового соединения modbus ведет к закрытию старого соединения (в режиме modbus = сервер)
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SYS_CFG_POWERSAVE 0x0000001 // Включение режима экономии энергии (актуально в режиме ST)
|
||||||
|
#define SYS_CFG_PIN_CLR_ENA 0x0000002 // Проверять ножку RX на сброс конфигурации WiFi
|
||||||
|
#define SYS_CFG_DEBUG_ENA 0x0000004 // Вывод отладочной информации на GPIO2
|
||||||
|
#define SYS_CFG_TWPCB_DEL 0x0000008 // Закрывать соединение и убивать pcb c TIME_WAIT
|
||||||
|
#define SYS_CFG_NETBIOS_ENA 0x0000010 // включить NetBios
|
||||||
|
#define SYS_CFG_SNTP_ENA 0x0000020 // включить SNTP
|
||||||
|
#define SYS_CFG_CDNS_ENA 0x0000040 // включить CAPDNS
|
||||||
|
#define SYS_CFG_T2U_REOPEN 0x0000080 // открытие нового соединения tcp2uart ведет к закрытию старого соединения (сервер)
|
||||||
|
#define SYS_CFG_MDB_REOPEN 0x0000100 // открытие нового соединения modbus ведет к закрытию старого соединения (сервер)
|
||||||
|
|
||||||
|
|
||||||
|
struct SystemCfg
|
||||||
|
{ // структура сохранения системных настроек в Flash
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct sys_bits_config b;
|
||||||
|
uint16 w;
|
||||||
|
} cfg;
|
||||||
|
|
||||||
|
uint16 tcp_client_twait; // время (миллисек) до повтора соединения клиента
|
||||||
|
#ifdef USE_TCP2UART
|
||||||
|
uint16 tcp2uart_port; // номер порта TCP-UART (=0 - отключен)
|
||||||
|
uint16 tcp2uart_twrec; // время (сек) стартового ожидания приема/передачи первого пакета, до авто-закрытия соединения
|
||||||
|
uint16 tcp2uart_twcls; // время (сек) до авто-закрытия соединения после приема или передачи
|
||||||
|
#endif
|
||||||
|
#ifdef USE_WEB
|
||||||
|
uint16 web_port; // номер порта WEB (=0 - отключен)
|
||||||
|
uint16 web_twrec; // время (сек) стартового ожидания приема/передачи первого пакета, до авто-закрытия соединения
|
||||||
|
uint16 web_twcls; // время (сек) до авто-закрытия соединения после приема или передачи
|
||||||
|
#endif
|
||||||
|
#ifdef USE_MODBUS
|
||||||
|
uint16 mdb_port; // =0 - отключен
|
||||||
|
uint16 mdb_twrec; // время (сек) стартового ожидания приема/передачи первого пакета, до авто-закрытия соединения
|
||||||
|
uint16 mdb_twcls; // время (сек) до авто-закрытия соединения после приема или передачи
|
||||||
|
uint8 mdb_id; // номер устройства ESP8266 по шине modbus
|
||||||
|
#endif
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
|
extern void sys_write_cfg(void);
|
||||||
|
|
||||||
|
extern struct SystemCfg syscfg;
|
||||||
|
|
||||||
|
#endif // #define __SYS_CFG_H__
|
1013
RTLGDB/Project/tcpsrv/tcp_srv_conn.c
Normal file
1013
RTLGDB/Project/tcpsrv/tcp_srv_conn.c
Normal file
File diff suppressed because it is too large
Load diff
188
RTLGDB/Project/tcpsrv/tcp_srv_conn.h
Normal file
188
RTLGDB/Project/tcpsrv/tcp_srv_conn.h
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
#ifndef __TCP_SERV_CONN_H__
|
||||||
|
/***********************************
|
||||||
|
* FileName: tcp_srv_conn.h
|
||||||
|
* Tcp сервачек для ESP8266
|
||||||
|
* PV` ver1.0 20/12/2014
|
||||||
|
* PV` ver1.0 29/10/2016 для RTL87xx
|
||||||
|
***********************************/
|
||||||
|
#define __TCP_SERV_CONN_H__
|
||||||
|
|
||||||
|
#include "user_config.h"
|
||||||
|
#include "tcp.h"
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#undef mMIN
|
||||||
|
#define mMIN(a, b) ((a < b)? a : b)
|
||||||
|
#define mMAX(a, b) ((a>b)?a:b)
|
||||||
|
|
||||||
|
|
||||||
|
enum srvconn_state {
|
||||||
|
SRVCONN_NONE =0,
|
||||||
|
SRVCONN_CLOSEWAIT, // ожидает закрытия
|
||||||
|
SRVCONN_LISTEN, // соединение открыто, ждет rx или tx
|
||||||
|
SRVCONN_CONNECT, // соединение открыто, было rx или tx
|
||||||
|
SRVCONN_CLOSED // соединение закрыто
|
||||||
|
};
|
||||||
|
|
||||||
|
// приоритет pcb 1..127 1 - min, 127 - max
|
||||||
|
#ifndef TCP_SRV_PRIO
|
||||||
|
#define TCP_SRV_PRIO 99 // TCP_PRIO_MIN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// максимальное кол-во TCP c TIME_WAIT
|
||||||
|
#ifndef MAX_TIME_WAIT_PCB
|
||||||
|
#define MAX_TIME_WAIT_PCB 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// кол-во одновременно открытых соединений по умолчанию
|
||||||
|
#ifndef TCP_SRV_MAX_CONNECTIONS
|
||||||
|
#define TCP_SRV_MAX_CONNECTIONS mMIN(MEMP_NUM_TCP_PCB, 10)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// порт сервера по умолчанию
|
||||||
|
#ifndef TCP_SRV_SERVER_PORT
|
||||||
|
#define TCP_SRV_SERVER_PORT 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define SRV_WDGREFESH_IN_POOL // использовать WDGRefresh() в tcpsrv_poll()
|
||||||
|
|
||||||
|
// время (сек), по умолчанию, ожидания запроса (передачи пакета) от клиента, до авто-закрытия соединения,
|
||||||
|
// при = 0 заменяется на эти 5 сек.
|
||||||
|
#ifndef TCP_SRV_RECV_WAIT
|
||||||
|
#define TCP_SRV_RECV_WAIT 5
|
||||||
|
#endif
|
||||||
|
// время (сек), по умолчанию, до авто-закрытия соединения после приема или передачи,
|
||||||
|
// при = 0 заменяется на эти 5 сек.
|
||||||
|
#ifndef TCP_SRV_END_WAIT
|
||||||
|
#define TCP_SRV_END_WAIT 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// время (в сек) до повтора закрытия соединения (исполняется до 3-х раз).
|
||||||
|
#define TCP_SRV_CLOSE_WAIT 5 // 5 сек
|
||||||
|
|
||||||
|
// минимальный размер heap по умолчанию, при открытии нового соединения, при = 0 заменяется на это:
|
||||||
|
#define TCP_SRV_MIN_HEAP_SIZE 32768 // самый минимум от 6Kb
|
||||||
|
|
||||||
|
// максимальный размер выделяемого буфера в heap для приема порции
|
||||||
|
#ifndef TCP_SRV_SERVER_MAX_RXBUF
|
||||||
|
#define TCP_SRV_SERVER_MAX_RXBUF TCP_WND // (TCP_MSS*3) // 1460*2=2920, 1460*3=4380, 1460*4=5840
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// размер выделяемого буфера в heap для передачи при буферизированном выводе
|
||||||
|
#ifndef TCP_SRV_SERVER_DEF_TXBUF
|
||||||
|
#define TCP_SRV_SERVER_DEF_TXBUF TCP_SND_BUF //(TCP_MSS*3) // 1460*2=2920, 1460*3=4380, 1460*4=5840
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ID_CLIENTS_PORT 3 // до 3-х clients
|
||||||
|
#define tcpsrv_init_client1() tcpsrv_init(1) // tcp2uart_client
|
||||||
|
#define tcpsrv_init_client2() tcpsrv_init(2) // mdb_tcp_client
|
||||||
|
#define tcpsrv_init_client3() tcpsrv_init(3)
|
||||||
|
|
||||||
|
#define TCP_CLIENT_NEXT_CONNECT_S 5 // syscfg.tcp_client_twait // 5000 // через 5 сек
|
||||||
|
#define TCP_CLIENT_MAX_CONNECT_RETRY 7 // до 7 раз с интервалом TCP_CLIENT_NEXT_CONNECT_MS
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Структура соединения
|
||||||
|
//
|
||||||
|
typedef struct t_tcpsrv_conn_flags {
|
||||||
|
uint16 srv_reopen: 1; //0001 открытие нового соединения более max_conn ведет к закрытию наиболее старого соединения.
|
||||||
|
uint16 pcb_time_wait_free: 1; //0002 проверка на макс кол-во и уничтожение pcb с TIME_WAIT при вызове disconnect() (иначе pcb TIME_WAIT 60 сек http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html)
|
||||||
|
uint16 nagle_disabled: 1; //0004 выключение nagle
|
||||||
|
uint16 rx_buf: 1; //0008 прием в буфер, используется ручное управление размером окна TCP
|
||||||
|
uint16 rx_null: 1; //0010 отключение вызова func_received_data() и прием в null (устанавливается автоматически при вызове tcpsrv_disconnect())
|
||||||
|
uint16 tx_null: 1; //0020 отключение вызова func_sent_callback() и передача в null (устанавливается автоматически при вызове tcpsrv_disconnect())
|
||||||
|
uint16 wait_sent: 1; //0040 ожидет завершения/подтверждения передачи от lwip
|
||||||
|
uint16 busy_bufo: 1; //0080 идет обработка bufo
|
||||||
|
uint16 busy_bufi: 1; //0100 идет обработка bufi
|
||||||
|
uint16 tmp0: 1; //0200 резерв
|
||||||
|
uint16 tmp1: 1; //0400 резерв
|
||||||
|
// далее идут биты не относящиеся к работе tcp_srv_conn
|
||||||
|
uint16 user_flg1: 1; //0800 для нужд процедур уровнем выше (пока свободен)
|
||||||
|
uint16 user_flg2: 1; //1000 для нужд процедур уровнем выше (пока свободен)
|
||||||
|
uint16 user_option1: 1; //2000 для нужд процедур обработки переменных (использован для hexdump, xml_mdb в web_int_callbacks.c)
|
||||||
|
uint16 user_option2: 1; //4000 для нужд процедур обработки переменных (использован для xml_mdb в web_int_callbacks.c)
|
||||||
|
} __attribute__((packed)) tcpsrv_conn_flags;
|
||||||
|
|
||||||
|
typedef struct t_TCP_SERV_CONN {
|
||||||
|
volatile tcpsrv_conn_flags flag;//+0 флаги соеднения
|
||||||
|
enum srvconn_state state; //+4 состояние
|
||||||
|
struct t_TCP_SERV_CFG *pcfg; //+8 указатель на базовую структуру сервера
|
||||||
|
uint16 recv_check; //+12 счет тиков соединения в tcpsrv_poll
|
||||||
|
uint16 remote_port; //+16 номер порта клиента
|
||||||
|
union { //+20 ip клиента
|
||||||
|
uint32 dw;
|
||||||
|
uint8 b[4];
|
||||||
|
} remote_ip;
|
||||||
|
struct t_TCP_SERV_CONN *next; //+24 указатель на следующую структуру
|
||||||
|
struct tcp_pcb *pcb; //+28 указатель на pcb в Lwip
|
||||||
|
uint8 *pbufo; //+32 указатель на сегмент с передаваемыми данными
|
||||||
|
uint8 *ptrtx; //+36 указатель на ещё не переданные данные
|
||||||
|
uint8 *pbufi; //+40 указатель на сегмент буфера с принимаемыми данными
|
||||||
|
uint16 sizeo; //+44 размер буфера передачи
|
||||||
|
uint16 sizei; //+48 размер приемного буфера (кол-во принятых и ещё не обработанных байт)
|
||||||
|
uint16 cntro; //+52 кол-во обработанных байт в буфере передачи
|
||||||
|
uint16 cntri; //+56 кол-во обработанных байт в буфере приема
|
||||||
|
uint16 unrecved_bytes; //+60 используется при ручном управлении TCP WIN / This can be used to throttle data reception
|
||||||
|
// далее идут переменные не относящиеся к работе tcp_srv_conn
|
||||||
|
uint8 *linkd; //+64 указатель на прилепленные данные пользователя (при закрытии соединения вызывается os_close(linkd), если linkd != NULL;
|
||||||
|
} TCP_SERV_CONN;
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Вызываемые функции пользователя (calback-и)
|
||||||
|
//
|
||||||
|
typedef void (*func_disconect_calback)(TCP_SERV_CONN *ts_conn); // соединение закрыто
|
||||||
|
typedef err_t (*func_listen)(TCP_SERV_CONN *ts_conn); // новый клиент
|
||||||
|
typedef err_t (*func_received_data)(TCP_SERV_CONN *ts_conn); // принято всего ts_conn->sizei байт, лежат в буфере по ts_conn->pbufi, по выходу принимается обработанных ts_conn->cntri;
|
||||||
|
typedef err_t (*func_sent_callback)(TCP_SERV_CONN *ts_conn); // блок данных передан
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Структура конфигурации tcp сервера
|
||||||
|
//
|
||||||
|
typedef struct t_TCP_SERV_CFG {
|
||||||
|
struct t_tcpsrv_conn_flags flag; // начальные флаги для соединения
|
||||||
|
uint16 port; // номер порта
|
||||||
|
uint16 min_heap; // минимальный размер heap при открытии нового соединения, при = 0 заменяется на 8192.
|
||||||
|
uint8 max_conn; // максимальное кол-во одновременных соединений
|
||||||
|
uint8 conn_count; // кол-во текущих соединений, при инициализации прописывает 0
|
||||||
|
uint8 time_wait_rec; // время (сек) ожидания запроса (передачи пакета) от клиента, до авто-закрытия соединения, по умолчанию TCP_SRV_RECV_WAIT сек.
|
||||||
|
uint8 time_wait_cls; // время (сек) до авто-закрытия соединения после приема или передачи, по умолчанию TCP_SRV_END_WAIT сек.
|
||||||
|
TCP_SERV_CONN * conn_links; // указатель на цепочку активных соединений, при инициализации или отсуствии активных соединений = NULL
|
||||||
|
struct tcp_pcb *pcb; // начальный pcb [LISTEN] если сервер, иначе NULL
|
||||||
|
func_disconect_calback func_discon_cb; // функция вызываемая после закрытия соединения, если = NULL - не вызывается
|
||||||
|
func_listen func_listen; // функция вызываемая при присоединении клиента или коннекта к серверу, если = NULL - не вызывается
|
||||||
|
func_sent_callback func_sent_cb; // функция вызываемая после передачи данных или наличию места в ip стеке для следушей передачи данных, если = NULL - не вызывается (+см. флаги)
|
||||||
|
func_received_data func_recv; // функция вызываемая при приеме данных, если = NULL - не вызывается (+см. флаги)
|
||||||
|
struct t_TCP_SERV_CFG *next; // следующий экземпляр структуры сервера/клиента
|
||||||
|
}TCP_SERV_CFG;
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Данные
|
||||||
|
//
|
||||||
|
extern TCP_SERV_CFG *phcfg; // указатель на цепочку TCP_SERV_CFG (стартовавших серверов)
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Функции
|
||||||
|
//
|
||||||
|
err_t tcpsrv_int_sent_data(TCP_SERV_CONN * ts_conn, uint8 *psent, uint16 length); // передать length байт (внутрення функция - никаких проверок)
|
||||||
|
void tcpsrv_disconnect(TCP_SERV_CONN * ts_conn); // закрыть соединение
|
||||||
|
void tcpsrv_print_remote_info(TCP_SERV_CONN *ts_conn); // выводит remote_ip:remote_port [conn_count] os_printf("srv x.x.x.x:x [n] ")
|
||||||
|
TCP_SERV_CFG * tcpsrv_server_port2pcfg(uint16 portn); // поиск структуры конфига по номеру порта
|
||||||
|
void tcpsrv_unrecved_win(TCP_SERV_CONN *ts_conn); // Восстановить размер TCP WIN, если используется ручное управление размером окна TCP
|
||||||
|
|
||||||
|
void tcpsrv_disconnect_calback_default(TCP_SERV_CONN *ts_conn);
|
||||||
|
err_t tcpsrv_listen_default(TCP_SERV_CONN *ts_conn);
|
||||||
|
err_t tcpsrv_sent_callback_default(TCP_SERV_CONN *ts_conn);
|
||||||
|
err_t tcpsrv_received_data_default(TCP_SERV_CONN *ts_conn);
|
||||||
|
|
||||||
|
TCP_SERV_CFG *tcpsrv_init(uint16 portn);
|
||||||
|
err_t tcpsrv_start(TCP_SERV_CFG *p);
|
||||||
|
err_t tcpsrv_close(TCP_SERV_CFG *p);
|
||||||
|
err_t tcpsrv_close_port(uint16 portn);
|
||||||
|
err_t tcpsrv_close_all(void);
|
||||||
|
|
||||||
|
const char * tspsrv_error_msg(err_t err);
|
||||||
|
const char * tspsrv_tcp_state_msg(enum tcp_state state);
|
||||||
|
const char * tspsrv_srvconn_state_msg(enum srvconn_state state);
|
||||||
|
|
||||||
|
#endif // __TCP_SERV_CONN_H__
|
26
RTLGDB/Project/user_config.h
Normal file
26
RTLGDB/Project/user_config.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef _user_config_h_
|
||||||
|
#define _user_config_h_
|
||||||
|
|
||||||
|
#define SYS_VERSION "1.0.1"
|
||||||
|
#include "sdk_ver.h"
|
||||||
|
|
||||||
|
#define USE_WEB 80 // включить в трансялцию порт Web, если =0 - по умолчанию выключен
|
||||||
|
#define WEBSOCKET_ENA 1 // включить WEBSOCKET
|
||||||
|
#define USE_SNTP 1 // включить в трансялцию драйвер SNTP, если =0 - по умолчанию выключен, = 1 - по умолчанию включен.
|
||||||
|
#define USE_NETBIOS 1 // включить в трансялцию драйвер NETBIOS, если =0 - по умолчанию выключен.
|
||||||
|
|
||||||
|
#define WEB_DEBUG_FUNCTIONS 1 // =1 - включить в WEB отладочные функции, =0 отключить (остается только конфигурация WiFi)
|
||||||
|
|
||||||
|
// #define WEB_INA219_DRV 1 (set in project.mk !)
|
||||||
|
// #define WEB_ADC_DRV 1 (set in project.mk !)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _MSC_VER // IntelliSense
|
||||||
|
#define __attribute__(packed)
|
||||||
|
//typedef int8_t err_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _user_config_h_
|
||||||
|
|
||||||
|
|
202
RTLGDB/Project/user_start.c
Normal file
202
RTLGDB/Project/user_start.c
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
/*
|
||||||
|
* user_start.c
|
||||||
|
*
|
||||||
|
* Created on: 26/03/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include "user_config.h"
|
||||||
|
#include "platform_autoconf.h"
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "netbios/netbios.h"
|
||||||
|
#include "sntp/sntp.h"
|
||||||
|
#include "sys_cfg.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
#include "web/web_srv.h"
|
||||||
|
#include "webfs/webfs.h"
|
||||||
|
|
||||||
|
#include "MPU6050.h"
|
||||||
|
//#include "SSD1306.h"
|
||||||
|
//#include "WS2812.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
|
||||||
|
#include "gpio_api.h" // mbed
|
||||||
|
#include "i2c_api.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/udp.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
|
||||||
|
#include "flashconf_tst.h"
|
||||||
|
#include "efuse_tst.h"
|
||||||
|
|
||||||
|
#define OFFSET 0x298
|
||||||
|
#define GAIN_DIV 0x34C
|
||||||
|
#define AD2MV(ad,offset,gain) (((ad/16)-offset)*1000/gain)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct SystemCfg syscfg = {
|
||||||
|
.cfg.w = SYS_CFG_DEBUG_ENA
|
||||||
|
| SYS_CFG_PIN_CLR_ENA
|
||||||
|
#if defined(USE_NETBIOS) && USE_NETBIOS
|
||||||
|
| SYS_CFG_NETBIOS_ENA
|
||||||
|
#endif
|
||||||
|
#if defined(USE_SNTP) && USE_SNTP
|
||||||
|
| SYS_CFG_SNTP_ENA
|
||||||
|
#endif
|
||||||
|
,
|
||||||
|
#if defined(USE_WEB)
|
||||||
|
.web_port = USE_WEB,
|
||||||
|
#else
|
||||||
|
.web_port = 0,
|
||||||
|
#endif
|
||||||
|
.web_twrec = 5,
|
||||||
|
.web_twcls = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
void connect_start(void)
|
||||||
|
{
|
||||||
|
info_printf("\%s: Time at start %d ms.\n", __func__, xTaskGetTickCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
void connect_close(void)
|
||||||
|
{
|
||||||
|
info_printf("\%s: Time at start %d ms.\n", __func__, xTaskGetTickCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
void user_start(void)
|
||||||
|
{
|
||||||
|
info_printf("\%s: Time at start %d ms.\n", __func__, xTaskGetTickCount());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sys_write_cfg(void)
|
||||||
|
{
|
||||||
|
flash_write_cfg(&syscfg, FEEP_ID_SYS_CFG, sizeof(syscfg));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void console_init(void);
|
||||||
|
|
||||||
|
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, uint16_t port);
|
||||||
|
void user_init2_thrd(void)
|
||||||
|
{
|
||||||
|
gpio_t gpio_usrled, gpio_usrbt, gpio_pwren, gpio_pwrbt;
|
||||||
|
MPU6050_DataPack dp[MPU6050_PACKSIZE];
|
||||||
|
struct pbuf *pb;
|
||||||
|
struct udp_pcb *upcb;
|
||||||
|
ip_addr_t servIP;
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < MPU6050_PACKSIZE; i++)
|
||||||
|
{
|
||||||
|
dp[i].X = 0;
|
||||||
|
//dp[i].Y = 0;
|
||||||
|
//dp[i].Z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//IP4_ADDR(&servIP, 192, 168, 1, 39);
|
||||||
|
//IP4_ADDR(&servIP, 192, 168, 137, 1);
|
||||||
|
IP4_ADDR(&servIP, 192, 168, 1, 55);
|
||||||
|
|
||||||
|
gpio_usrled.direction = PIN_OUTPUT;
|
||||||
|
gpio_usrled.mode = PullNone;
|
||||||
|
gpio_init(&gpio_usrled, PC_2);
|
||||||
|
|
||||||
|
gpio_pwren.direction = PIN_OUTPUT;
|
||||||
|
gpio_pwren.mode = PullNone;
|
||||||
|
gpio_init(&gpio_pwren, PC_0);
|
||||||
|
|
||||||
|
gpio_pwrbt.direction = PIN_INPUT;
|
||||||
|
gpio_pwrbt.mode = PullDown;
|
||||||
|
gpio_init(&gpio_pwrbt, PC_1);
|
||||||
|
|
||||||
|
gpio_usrbt.direction = PIN_INPUT;
|
||||||
|
gpio_usrbt.mode = PullUp;
|
||||||
|
gpio_init(&gpio_usrbt, PC_3);
|
||||||
|
|
||||||
|
gpio_write(&gpio_pwren, 1);
|
||||||
|
gpio_write(&gpio_usrled, 1);
|
||||||
|
|
||||||
|
vTaskDelay(1000);
|
||||||
|
|
||||||
|
MPU6050_Init();
|
||||||
|
|
||||||
|
upcb = udp_new();
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
vTaskDelay(50);
|
||||||
|
WDGRefresh();
|
||||||
|
|
||||||
|
if (gpio_read(&gpio_pwrbt))
|
||||||
|
{
|
||||||
|
gpio_write(&gpio_usrled, 0);
|
||||||
|
gpio_write(&gpio_pwren, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wifi_st_status == WIFI_STA_CONNECTED)
|
||||||
|
{
|
||||||
|
if(MPU6050_IsDataPacketReady(&dp))
|
||||||
|
{
|
||||||
|
if (upcb)
|
||||||
|
{
|
||||||
|
//DBG_8195A("Send UDP data...\n");
|
||||||
|
udp_connect(upcb, &servIP, 5001);
|
||||||
|
|
||||||
|
pb = pbuf_alloc(PBUF_TRANSPORT, sizeof(MPU6050_DataPack) * MPU6050_PACKSIZE, PBUF_RAM);
|
||||||
|
memcpy(pb->payload, &dp, sizeof(MPU6050_DataPack) * MPU6050_PACKSIZE);
|
||||||
|
|
||||||
|
udp_send(upcb, pb);
|
||||||
|
udp_disconnect(upcb);
|
||||||
|
pbuf_free(pb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void user_init_thrd(void)
|
||||||
|
{
|
||||||
|
//if(syscfg.cfg.b.pin_clear_cfg_enable && 0)
|
||||||
|
//{
|
||||||
|
// user_test_clear_pin();
|
||||||
|
wifi_cfg.load_flg = 0;
|
||||||
|
//}
|
||||||
|
//else flash_read_cfg(&syscfg, FEEP_ID_SYS_CFG, sizeof(syscfg));
|
||||||
|
|
||||||
|
if(!syscfg.cfg.b.debug_print_enable) print_off = 1;
|
||||||
|
|
||||||
|
/* Initilaize the console stack */
|
||||||
|
console_init();
|
||||||
|
|
||||||
|
/* Web Disk Init */
|
||||||
|
WEBFSInit();
|
||||||
|
|
||||||
|
/* Load cfg, init WiFi + LwIP init, WiFi start if wifi_cfg.mode != RTW_MODE_NONE */
|
||||||
|
wifi_init();
|
||||||
|
|
||||||
|
#if defined(USE_NETBIOS)
|
||||||
|
if(syscfg.cfg.b.netbios_ena) netbios_init();
|
||||||
|
#endif
|
||||||
|
#if defined(USE_SNTP)
|
||||||
|
if(syscfg.cfg.b.sntp_ena) sntp_init();
|
||||||
|
#endif
|
||||||
|
// webstuff_init(); // httpd_init();
|
||||||
|
webserver_init(syscfg.web_port);
|
||||||
|
|
||||||
|
if(syscfg.cfg.b.powersave_enable)
|
||||||
|
{
|
||||||
|
release_wakelock(~WAKELOCK_WLAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// xTaskCreate(x_init_thrd, "wifi_init", 1024, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, NULL);
|
||||||
|
|
||||||
|
/* Kill init thread after all init tasks done */
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
52
RTLGDB/Project/web/web_auth.c
Normal file
52
RTLGDB/Project/web/web_auth.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* web_auth.c
|
||||||
|
*
|
||||||
|
* Created on: 23/04/2017.
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
#include "web_srv.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------------
|
||||||
|
* pbuf[77] = Username and password are combined into a string "username:password"
|
||||||
|
* Return: Authorization Level
|
||||||
|
* 0 - Not Authorized */
|
||||||
|
|
||||||
|
uint8 UserAuthorization(uint8 *pbuf, size_t declen)
|
||||||
|
{
|
||||||
|
uint8 * psw = rtl_strchr(pbuf, ':');
|
||||||
|
if(psw != NULL)
|
||||||
|
{
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
if(rtl_strcmp(pbuf, "rtl871x:webfs_write") == 0)
|
||||||
|
{
|
||||||
|
return WEB_AUTH_LEVEL_WEBFS;
|
||||||
|
}
|
||||||
|
if(rtl_strcmp(pbuf, "rtl871x:ota_write") == 0)
|
||||||
|
{
|
||||||
|
return WEB_AUTH_LEVEL_OTA;
|
||||||
|
}
|
||||||
|
if(rtl_strcmp(pbuf, "rtl871x:supervisor") == 0)
|
||||||
|
{
|
||||||
|
return WEB_AUTH_LEVEL_SUPERVISOR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
*psw++ = 0;
|
||||||
|
if(rom_xstrcmp(wifi_ap_cfg.ssid, pbuf) && rom_xstrcmp( wifi_ap_cfg.password, psw))
|
||||||
|
{
|
||||||
|
return WEB_AUTH_LEVEL_USER;
|
||||||
|
}
|
||||||
|
if(rom_xstrcmp(wifi_st_cfg.ssid, pbuf) && rom_xstrcmp( wifi_st_cfg.password, psw))
|
||||||
|
{
|
||||||
|
return WEB_AUTH_LEVEL_USER1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
700
RTLGDB/Project/web/web_int_callbacks.c
Normal file
700
RTLGDB/Project/web/web_int_callbacks.c
Normal file
|
@ -0,0 +1,700 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: web_int_callbacks.c
|
||||||
|
* Description: The web server inernal callbacks.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#include "user_config.h"
|
||||||
|
#ifdef USE_WEB
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "tcm_heap.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "flash_eep.h"
|
||||||
|
#include "device_lock.h"
|
||||||
|
#include "ethernetif.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
#include "web_srv_int.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "webfs/webfs.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "sys_cfg.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
#include "sys_api.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
#include "sdk_ver.h"
|
||||||
|
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
#include "netbios/netbios.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_SNTP
|
||||||
|
#include "sntp/sntp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_CAPTDNS
|
||||||
|
#include "captdns.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_MODBUS
|
||||||
|
#include "modbustcp.h"
|
||||||
|
#include "mdbtab.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_RS485DRV
|
||||||
|
#include "driver/rs485drv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_OVERLAY
|
||||||
|
#include "overlay.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef atoi
|
||||||
|
#define atoi rom_atoi
|
||||||
|
|
||||||
|
//#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
#define ifcmp(a) if(rom_xstrcmp(cstr, a))
|
||||||
|
|
||||||
|
#define OpenFlash() { device_mutex_lock(RT_DEV_LOCK_FLASH); flash_turnon(); }
|
||||||
|
#define CloseFlash() { SpicDisableRtl8195A(); device_mutex_unlock(RT_DEV_LOCK_FLASH); }
|
||||||
|
|
||||||
|
|
||||||
|
extern struct netif xnetif[NET_IF_NUM]; /* network interface structure */
|
||||||
|
|
||||||
|
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
//#define TEST_SEND_WAVE
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
|
||||||
|
#ifdef TEST_SEND_WAVE
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
// Test adc
|
||||||
|
// Читает adc в одиночный буфер (~2килобайта) на ~20ksps и сохраняет в виде WAV
|
||||||
|
// Правильное чтение организуется по прерыванию таймера(!).
|
||||||
|
// Тут только демо!
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
typedef struct
|
||||||
|
{ // https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
|
||||||
|
unsigned long int RIFF ;/* +00 'RIFF' */
|
||||||
|
unsigned long int size8;/* +04 file size - 8 */
|
||||||
|
unsigned long int WAVE ;/* +08 'WAVE' */
|
||||||
|
unsigned long int fmt ;/* +12 'fmt ' */
|
||||||
|
unsigned long int fsize;/* +16 указатель до 'fact' или 'data' */
|
||||||
|
unsigned short int ccod;/* +20 01 00 Compression code: 1 - PCM/uncompressed */
|
||||||
|
unsigned short int mono;/* +22 00 01 или 00 02 */
|
||||||
|
unsigned long int freq ;/* +24 частота */
|
||||||
|
unsigned long int bps ;/* +28 */
|
||||||
|
unsigned short int blka;/* +32 1/2/4 BlockAlign*/
|
||||||
|
unsigned short int bits;/* +34 разрядность 8/16 */
|
||||||
|
unsigned long int data ;/* +36 'data' */
|
||||||
|
unsigned long int dsize;/* +40 размер данных */
|
||||||
|
} WAV_HEADER;
|
||||||
|
const WAV_HEADER ICACHE_RODATA_ATTR wav_header =
|
||||||
|
{0x46464952L,
|
||||||
|
0x00000008L,
|
||||||
|
0x45564157L,
|
||||||
|
0x20746d66L,
|
||||||
|
0x00000010L,
|
||||||
|
0x0001 ,
|
||||||
|
0x0001 ,
|
||||||
|
0x000055f0L,
|
||||||
|
0x000055f0L,
|
||||||
|
0x0002 ,
|
||||||
|
0x0010 ,
|
||||||
|
0x61746164L,
|
||||||
|
0x00000000L};
|
||||||
|
#define WAV_HEADER_SIZE sizeof(wav_header)
|
||||||
|
//===============================================================================
|
||||||
|
// web_test_adc()
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
void ICACHE_FLASH_ATTR web_test_adc(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *) ts_conn->linkd;
|
||||||
|
unsigned int len = web_conn->msgbufsize - web_conn->msgbuflen;
|
||||||
|
if(len > WAV_HEADER_SIZE + 10) {
|
||||||
|
len -= WAV_HEADER_SIZE;
|
||||||
|
WAV_HEADER * ptr = (WAV_HEADER *) &web_conn->msgbuf[web_conn->msgbuflen];
|
||||||
|
os_memcpy(ptr, &wav_header, WAV_HEADER_SIZE);
|
||||||
|
ptr->dsize = len;
|
||||||
|
web_conn->msgbuflen += WAV_HEADER_SIZE;
|
||||||
|
len >>= 1;
|
||||||
|
read_adcs((uint16 *)(web_conn->msgbuf + web_conn->msgbuflen), len, 0x0808);
|
||||||
|
web_conn->msgbuflen += len << 1;
|
||||||
|
}
|
||||||
|
if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close
|
||||||
|
}
|
||||||
|
#endif // TEST_SEND_WAVE
|
||||||
|
|
||||||
|
//===============================================================================
|
||||||
|
// WiFi Scan XML
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
extern void wifi_set_timer_scan(int ms);
|
||||||
|
static void ICACHE_FLASH_ATTR web_wscan_xml(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *) ts_conn->linkd;
|
||||||
|
web_scan_handler_t * pwscn_rec = &web_scan_handler_ptr;
|
||||||
|
// Check if this is a first round call
|
||||||
|
if(CheckSCB(SCB_RETRYCB)==0) {
|
||||||
|
int i = 0;
|
||||||
|
web_conn->udata_start = 0;
|
||||||
|
if(pwscn_rec->flg == 2) {
|
||||||
|
i = pwscn_rec->ap_count;
|
||||||
|
wifi_set_timer_scan(7000);
|
||||||
|
} else if(pwscn_rec->flg == 0) api_wifi_scan(NULL);
|
||||||
|
tcp_puts_fd("<total>%d</total>", i);
|
||||||
|
if(i == 0) return;
|
||||||
|
}
|
||||||
|
while(web_conn->msgbuflen + 96 + 10 + 32 <= web_conn->msgbufsize) {
|
||||||
|
if(pwscn_rec->flg && web_conn->udata_start < pwscn_rec->ap_count) {
|
||||||
|
rtw_scan_result_t *si = &pwscn_rec->ap_details[web_conn->udata_start];
|
||||||
|
uint8 ssid[32*6 + 1];
|
||||||
|
int len = si->SSID.len;
|
||||||
|
if(len > 32) len = 32;
|
||||||
|
si->SSID.val[len] = '\0';
|
||||||
|
if(web_conn->msgbuflen + 96 + 10 + htmlcode(ssid, si->SSID.val, 32*6, 32) > web_conn->msgbufsize) break;
|
||||||
|
tcp_puts_fd("<ap id=\"%d\"><ch>%d</ch><au>%d</au><bs>" MACSTR "</bs><ss>%s</ss><rs>%d</rs><hd>%d</hd><wp>%d</wp></ap>",
|
||||||
|
web_conn->udata_start,
|
||||||
|
si->channel,
|
||||||
|
rtw_security_to_idx(si->security),
|
||||||
|
MAC2STR(si->BSSID.octet),
|
||||||
|
ssid,
|
||||||
|
si->signal_strength,
|
||||||
|
// si->band, // rtw_802_11_band_t
|
||||||
|
si->bss_type & 3, // rtw_bss_type_t
|
||||||
|
si->wps_type); // rtw_wps_type_t
|
||||||
|
web_conn->udata_start++;
|
||||||
|
if(web_conn->udata_start >= pwscn_rec->ap_count) {
|
||||||
|
wifi_close_scan();
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wifi_close_scan();
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// repeat in the next call ...
|
||||||
|
SetSCB(SCB_RETRYCB);
|
||||||
|
SetNextFunSCB(web_wscan_xml);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#ifdef USE_MODBUS
|
||||||
|
//===============================================================================
|
||||||
|
// Mdb XML
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
void ICACHE_FLASH_ATTR web_modbus_xml(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *) ts_conn->linkd;
|
||||||
|
while(web_conn->msgbuflen + 24 <= web_conn->msgbufsize) {
|
||||||
|
if(web_conn->udata_start < web_conn->udata_stop) {
|
||||||
|
uint16 val16;
|
||||||
|
if(RdMdbData((uint8 *)&val16, web_conn->udata_start, 1) != 0) tcp_puts_fd("<m%u>?</m%u>", web_conn->udata_start, web_conn->udata_start);
|
||||||
|
else {
|
||||||
|
if(ts_conn->flag.user_option2) {
|
||||||
|
if(ts_conn->flag.user_option1) {
|
||||||
|
tcp_puts_fd("<m%u>0x%04x</m%u>", web_conn->udata_start, val16, web_conn->udata_start);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tcp_puts_fd("<m%u>%04x</m%u>", web_conn->udata_start, val16, web_conn->udata_start);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(ts_conn->flag.user_option1) {
|
||||||
|
tcp_puts_fd("<m%u>%d</m%u>", web_conn->udata_start, (sint32)((sint16)val16), web_conn->udata_start);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tcp_puts_fd("<m%u>%u</m%u>", web_conn->udata_start, val16, web_conn->udata_start);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
web_conn->udata_start++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// repeat in the next call ...
|
||||||
|
SetSCB(SCB_RETRYCB);
|
||||||
|
SetNextFunSCB(web_modbus_xml);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//===============================================================================
|
||||||
|
// RAM hexdump
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
void ICACHE_FLASH_ATTR web_hexdump(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *) ts_conn->linkd;
|
||||||
|
union {
|
||||||
|
uint32 dw[4];
|
||||||
|
uint8 b[16];
|
||||||
|
}data;
|
||||||
|
web_conn->udata_start &= 0xfffffff0;
|
||||||
|
uint32 *addr = (uint32 *)web_conn->udata_start;
|
||||||
|
int i;
|
||||||
|
web_conn->udata_stop &= 0xfffffff0;
|
||||||
|
while(web_conn->msgbuflen + (9+3*16+17+2) <= web_conn->msgbufsize) {
|
||||||
|
// if((uint32)addr < 0x9A000000) {
|
||||||
|
if((uint32)addr >= 0x98000000 && (uint32)addr < 0x9A000000) {
|
||||||
|
OpenFlash();
|
||||||
|
}
|
||||||
|
tcp_puts("%08x", addr);
|
||||||
|
for(i=0 ; i < 4 ; i++) data.dw[i] = *addr++;
|
||||||
|
web_conn->udata_start = (uint32)addr;
|
||||||
|
if(ts_conn->flag.user_option1) { // dword or byte ?
|
||||||
|
for(i=0 ; i < 4 ; i++) tcp_puts(" %08x", data.dw[i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(i=0 ; i < 16 ; i++) tcp_puts(" %02x", data.b[i]);
|
||||||
|
}
|
||||||
|
if((uint32)addr >= 0x98000000 && (uint32)addr < 0x9A000000) {
|
||||||
|
CloseFlash();
|
||||||
|
}
|
||||||
|
tcp_put(' '); tcp_put(' ');
|
||||||
|
for(i=0 ; i < 16 ; i++) tcp_put((data.b[i] >=' ' && data.b[i] != 0x7F)? data.b[i] : '.');
|
||||||
|
tcp_puts("\r\n");
|
||||||
|
if((uint32)addr >= web_conn->udata_stop) {
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// } else {
|
||||||
|
// tcp_puts("%p = Bad address!\r\n", addr);
|
||||||
|
// ClrSCB(SCB_RETRYCB);
|
||||||
|
// if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close
|
||||||
|
// return;
|
||||||
|
// };
|
||||||
|
}
|
||||||
|
// repeat in the next call ...
|
||||||
|
SetSCB(SCB_RETRYCB);
|
||||||
|
SetNextFunSCB(web_hexdump);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : web saved flash
|
||||||
|
* Description : Processing the flash data send
|
||||||
|
* Parameters : none (Calback)
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR web_get_flash(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
// Check if this is a first round call
|
||||||
|
if(CheckSCB(SCB_RETRYCB)==0) {
|
||||||
|
if(web_conn->udata_start == web_conn->udata_stop) return;
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
os_printf("file_size:%08x ", web_conn->udata_stop - web_conn->udata_start );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// Get/put as many bytes as possible
|
||||||
|
unsigned int len = mMIN(web_conn->msgbufsize - web_conn->msgbuflen, web_conn->udata_stop - web_conn->udata_start);
|
||||||
|
// Read Flash addr = web_conn->webfinc_offsets, len = x, buf = sendbuf
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
os_printf("%08x..%08x ",web_conn->udata_start, web_conn->udata_start + len );
|
||||||
|
#endif
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_FLASH);
|
||||||
|
if(spi_flash_read(web_conn->udata_start, web_conn->msgbuf, len)) {
|
||||||
|
web_conn->udata_start += len;
|
||||||
|
web_conn->msgbuflen += len;
|
||||||
|
if(web_conn->udata_start < web_conn->udata_stop) {
|
||||||
|
SetNextFunSCB(web_get_flash);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_FLASH);
|
||||||
|
SetSCB(SCB_RETRYCB);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_FLASH);
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
// SetSCB(SCB_FCLOSE | SCB_DISCONNECT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : web saved flash
|
||||||
|
* Description : Processing the flash data send
|
||||||
|
* Parameters : none (Calback)
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR web_get_ram(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
// Check if this is a first round call
|
||||||
|
if(CheckSCB(SCB_RETRYCB)==0) { // On initial call, проверка параметров
|
||||||
|
if(web_conn->udata_start == web_conn->udata_stop) {
|
||||||
|
// SetSCB(SCB_FCLOSE | SCB_DISCONNECT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
os_printf("file_size:%08x ", web_conn->udata_stop - web_conn->udata_start );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// Get/put as many bytes as possible
|
||||||
|
uint32 len = mMIN(web_conn->msgbufsize - web_conn->msgbuflen, web_conn->udata_stop - web_conn->udata_start);
|
||||||
|
if((uint32)web_conn->udata_start >= 0x98000000 && (uint32)web_conn->udata_start < 0x9A000000) {
|
||||||
|
OpenFlash();
|
||||||
|
}
|
||||||
|
copy_align4(web_conn->msgbuf, (void *)(web_conn->udata_start), len);
|
||||||
|
if((uint32)web_conn->udata_start >= 0x98000000 && (uint32)web_conn->udata_start < 0x9A000000) {
|
||||||
|
CloseFlash();
|
||||||
|
}
|
||||||
|
web_conn->msgbuflen += len;
|
||||||
|
web_conn->udata_start += len;
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
os_printf("%08x-%08x ",web_conn->udata_start, web_conn->udata_start + len );
|
||||||
|
#endif
|
||||||
|
if(web_conn->udata_start != web_conn->udata_stop) {
|
||||||
|
SetSCB(SCB_RETRYCB);
|
||||||
|
SetNextFunSCB(web_get_ram);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
ClrSCB(SCB_RETRYCB);
|
||||||
|
// SetSCB(SCB_FCLOSE | SCB_DISCONNECT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : web_callback
|
||||||
|
* Description : callback
|
||||||
|
* Parameters : struct TCP_SERV_CONN
|
||||||
|
* Returns : none
|
||||||
|
******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
// uint8 *cstr = &web_conn->msgbuf[web_conn->msgbuflen];
|
||||||
|
{
|
||||||
|
uint8 *vstr = os_strchr(cstr, '=');
|
||||||
|
if(vstr != NULL) {
|
||||||
|
*vstr++ = '\0';
|
||||||
|
web_int_vars(ts_conn, cstr, vstr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("[%s]\n", cstr);
|
||||||
|
#endif
|
||||||
|
ifcmp("start") tcp_puts("0x%08x", web_conn->udata_start);
|
||||||
|
else ifcmp("stop") tcp_puts("0x%08x", web_conn->udata_stop);
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
else ifcmp("realm") tcp_puts("%u", web_conn->auth_realm);
|
||||||
|
else ifcmp("auth") tcp_puts("%u", web_conn->auth_level);
|
||||||
|
#endif
|
||||||
|
else ifcmp("xml_") {
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("scan") web_wscan_xml(ts_conn);
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
if(web_conn->auth_level < WEB_AUTH_LEVEL_USER)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
web_conn->udata_start&=~3;
|
||||||
|
ifcmp("ram") tcp_puts("0x%08x", *((uint32*)web_conn->udata_start));
|
||||||
|
else tcp_put('?');
|
||||||
|
web_conn->udata_start += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else ifcmp("sys_") {
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("url") tcp_strcpy(get_new_hostname());
|
||||||
|
else ifcmp("cid") tcp_puts("%08x", HalGetChipId());
|
||||||
|
else ifcmp("fid") tcp_puts("%08x", spi_flash_get_id());
|
||||||
|
else ifcmp("fsize") tcp_puts("%u", spi_flash_real_size()); // flashchip->chip_size
|
||||||
|
else ifcmp("sdkver") tcp_strcpy_fd(SDK_VERSION);
|
||||||
|
else ifcmp("sysver") tcp_strcpy_fd(SYS_VERSION);
|
||||||
|
else ifcmp("webver") tcp_strcpy_fd(WEB_SVERSION);
|
||||||
|
else ifcmp("heap") tcp_puts("%u", xPortGetFreeHeapSize());
|
||||||
|
else ifcmp("heapm") tcp_puts("%u", xPortGetMinimumEverFreeHeapSize());
|
||||||
|
else ifcmp("tcmh") tcp_puts("%u", tcm_heap_freeSpace());
|
||||||
|
else ifcmp("time") tcp_puts("%u", xTaskGetTickCount());
|
||||||
|
else ifcmp("mactime") {
|
||||||
|
if(wifi_mode) {
|
||||||
|
union {
|
||||||
|
uint32 dw[2];
|
||||||
|
uint64 dd;
|
||||||
|
}ux;
|
||||||
|
ux.dd = *((uint64_t *)(WIFI_REG_BASE + 0x0560)); // REG_TSFTR -> #include "hal_com_reg.h"
|
||||||
|
tcp_puts("0x%08x%08x", ux.dw[1], ux.dw[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("clkcpu") tcp_puts("%u", HalGetCpuClk());
|
||||||
|
else ifcmp("debug") tcp_put('1' - (print_off & 1)); // rtl_print on/off
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("restart") {
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return;
|
||||||
|
#endif
|
||||||
|
webserver_qfn((web_ex_func_cb)sys_reset, NULL, 200);
|
||||||
|
}
|
||||||
|
else ifcmp("ram") tcp_puts("0x%08x", *((uint32 *)(ahextoul(cstr+3)&(~3))));
|
||||||
|
else ifcmp("rdec") tcp_puts("%d", *((uint32 *)(ahextoul(cstr+4)&(~3))));
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("ip") {
|
||||||
|
uint32 cur_ip;
|
||||||
|
if(netif_default != NULL) cur_ip = netif_default->ip_addr.addr;
|
||||||
|
tcp_puts(IPSTR, IP2STR(&cur_ip));
|
||||||
|
}
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
else ifcmp("netbios") {
|
||||||
|
if(syscfg.cfg.b.netbios_ena) tcp_strcpy(netbios_name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
#ifdef WEB_INA219_DRV
|
||||||
|
else ifcmp("ina219") {
|
||||||
|
if(CheckSCB(SCB_WEBSOC)) {
|
||||||
|
extern int ina219_ws(TCP_SERV_CONN *ts_conn, char cmd);
|
||||||
|
int x = ina219_ws(ts_conn, cstr[6]);
|
||||||
|
if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
|
||||||
|
else tcp_puts("%d", x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef WEB_MLX90614_DRV
|
||||||
|
else ifcmp("mlx90614") {
|
||||||
|
if(CheckSCB(SCB_WEBSOC)) {
|
||||||
|
extern int mlx90614_ws(TCP_SERV_CONN *ts_conn, char cmd);
|
||||||
|
int x = mlx90614_ws(ts_conn, cstr[6]);
|
||||||
|
if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
|
||||||
|
else tcp_puts("%d", x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef WEB_ADC_DRV
|
||||||
|
else ifcmp("adc")
|
||||||
|
{
|
||||||
|
if(CheckSCB(SCB_WEBSOC))
|
||||||
|
{
|
||||||
|
extern int adc_ws(TCP_SERV_CONN *ts_conn, char cmd);
|
||||||
|
int x = adc_ws(ts_conn, cstr[6]);
|
||||||
|
if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
|
||||||
|
else tcp_puts("%d", x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef WEB_MPU6050
|
||||||
|
else ifcmp("mpu6050")
|
||||||
|
{
|
||||||
|
if (CheckSCB(SCB_WEBSOC))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else ifcmp("cfg_") {
|
||||||
|
cstr += 4;
|
||||||
|
ifcmp("web_") {
|
||||||
|
cstr += 4;
|
||||||
|
ifcmp("port") tcp_puts("%u", syscfg.web_port);
|
||||||
|
else ifcmp("twrec") tcp_puts("%u", syscfg.web_twrec);
|
||||||
|
else ifcmp("twcls") tcp_puts("%u", syscfg.web_twcls);
|
||||||
|
else ifcmp("twd") tcp_put((syscfg.cfg.b.web_time_wait_delete)? '1' : '0');
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else ifcmp("sleep") tcp_put((syscfg.cfg.b.powersave_enable)? '1' : '0');
|
||||||
|
else ifcmp("pinclr") tcp_put((syscfg.cfg.b.pin_clear_cfg_enable)? '1' : '0');
|
||||||
|
else ifcmp("debug") tcp_put((syscfg.cfg.b.debug_print_enable)? '1' : '0');
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
else ifcmp("netbios") tcp_put((syscfg.cfg.b.netbios_ena)? '1' : '0');
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SNTP
|
||||||
|
else ifcmp("sntp") tcp_put((syscfg.cfg.b.sntp_ena)? '1' : '0');
|
||||||
|
#endif
|
||||||
|
#ifdef USE_CAPTDNS
|
||||||
|
else ifcmp("cdns") tcp_put((syscfg.cfg.b.cdns_ena)? '1' : '0');
|
||||||
|
#endif
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else ifcmp("wifi_") {
|
||||||
|
cstr+=5;
|
||||||
|
ifcmp("rdcfg") read_wifi_cfg(-1);
|
||||||
|
else ifcmp("newcfg") webserver_qfn((web_ex_func_cb)wifi_run, (void *)((uint32)wifi_cfg.mode), 200);
|
||||||
|
else ifcmp("cmode") tcp_puts("%d", wifi_mode);
|
||||||
|
else ifcmp("mode") tcp_puts("%d", wifi_cfg.mode);
|
||||||
|
else ifcmp("bgn") tcp_puts("%d", wifi_cfg.bgn);
|
||||||
|
else ifcmp("txpow") tcp_puts("%u", wifi_cfg.tx_pwr);
|
||||||
|
else ifcmp("lflg") tcp_puts("%u", wifi_cfg.load_flg);
|
||||||
|
else ifcmp("sflg") tcp_puts("%u", wifi_cfg.save_flg);
|
||||||
|
else ifcmp("adpt") tcp_puts("%u", wifi_cfg.adaptivity);
|
||||||
|
else ifcmp("country") tcp_puts("%u", wifi_cfg.country_code);
|
||||||
|
else ifcmp("ap_") {
|
||||||
|
cstr+=3;
|
||||||
|
ifcmp("ssid") {
|
||||||
|
wifi_ap_cfg.ssid[NDIS_802_11_LENGTH_SSID] = '\0';
|
||||||
|
tcp_strcpy(wifi_ap_cfg.ssid);
|
||||||
|
}
|
||||||
|
else ifcmp("psw") {
|
||||||
|
wifi_ap_cfg.password[IW_PASSPHRASE_MAX_SIZE] = '\0';
|
||||||
|
tcp_strcpy(wifi_ap_cfg.password);
|
||||||
|
}
|
||||||
|
else ifcmp("chl") tcp_puts("%u", wifi_ap_cfg.channel);
|
||||||
|
else ifcmp("mcns") tcp_puts("%u", wifi_ap_cfg.max_sta);
|
||||||
|
else ifcmp("auth") tcp_put((wifi_ap_cfg.security) ? '1' : '0');
|
||||||
|
else ifcmp("hssid") tcp_put((wifi_ap_cfg.ssid_hidden & 1) + '0');
|
||||||
|
else ifcmp("bint") tcp_puts("%u", wifi_ap_cfg.beacon_interval);
|
||||||
|
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[WLAN_AP_NETIF_NUM].hwaddr));
|
||||||
|
else ifcmp("hostname") tcp_strcpy(lwip_host_name[1]);
|
||||||
|
else ifcmp("dhcp") tcp_puts("%u", wifi_ap_dhcp.mode);
|
||||||
|
else ifcmp("ip") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.ip));
|
||||||
|
else ifcmp("gw") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.gw));
|
||||||
|
else ifcmp("msk") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.mask));
|
||||||
|
else ifcmp("cip") tcp_puts(IPSTR, IP2STR(&xnetif[WLAN_ST_NETIF_NUM].ip_addr.addr));
|
||||||
|
// else ifcmp("mac") strtomac(pvar, wifi_ap_cfg.macaddr);
|
||||||
|
// else ifcmp("sip") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.start_ip));
|
||||||
|
// else ifcmp("eip") tcp_puts(IPSTR, IP2STR(&wifi_ap_dhcp.end_ip));
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
else os_printf(" - none! ");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else ifcmp("st_") {
|
||||||
|
cstr+=3;
|
||||||
|
ifcmp("rssi") {
|
||||||
|
int rssi;
|
||||||
|
wifi_get_rssi(&rssi);
|
||||||
|
tcp_puts("%d", rssi);
|
||||||
|
}
|
||||||
|
else ifcmp("status") tcp_puts("%u", wifi_st_status);
|
||||||
|
else ifcmp("arec") tcp_puts("%u", wifi_st_cfg.autoreconnect);
|
||||||
|
else ifcmp("rect") tcp_puts("%u", wifi_st_cfg.reconnect_pause);
|
||||||
|
ifcmp("ssid") {
|
||||||
|
wifi_st_cfg.ssid[NDIS_802_11_LENGTH_SSID] = '\0';
|
||||||
|
tcp_strcpy(wifi_st_cfg.ssid);
|
||||||
|
}
|
||||||
|
else ifcmp("psw") {
|
||||||
|
wifi_st_cfg.password[IW_PASSPHRASE_MAX_SIZE] = '\0';
|
||||||
|
tcp_strcpy(wifi_st_cfg.password);
|
||||||
|
}
|
||||||
|
else ifcmp("mac") tcp_puts(MACSTR, MAC2STR(xnetif[WLAN_ST_NETIF_NUM].hwaddr));
|
||||||
|
else ifcmp("bssid") tcp_puts(MACSTR, MAC2STR(wifi_st_cfg.bssid));
|
||||||
|
else ifcmp("sbss") tcp_puts("%u", wifi_st_cfg.flg);
|
||||||
|
else ifcmp("sleep") tcp_puts("%d", wifi_st_cfg.sleep);
|
||||||
|
else ifcmp("dtim") tcp_puts("%u", wifi_st_cfg.dtim);
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
else ifcmp("hostname") tcp_strcpy(lwip_host_name[0]);
|
||||||
|
#endif
|
||||||
|
else ifcmp("auth") tcp_puts("%u", wifi_st_cfg.security);
|
||||||
|
else ifcmp("dhcp") tcp_puts("%u", wifi_st_dhcp.mode);
|
||||||
|
else ifcmp("ip") tcp_puts(IPSTR, IP2STR(&wifi_st_dhcp.ip));
|
||||||
|
else ifcmp("gw") tcp_puts(IPSTR, IP2STR(&wifi_st_dhcp.gw));
|
||||||
|
else ifcmp("msk") tcp_puts(IPSTR, IP2STR(&wifi_st_dhcp.mask));
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else ifcmp("bin_") {
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return;
|
||||||
|
#endif
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("flash") {
|
||||||
|
cstr+=5;
|
||||||
|
if(*cstr == '_') {
|
||||||
|
cstr++;
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
ifcmp("all") {
|
||||||
|
web_conn->udata_start = 0;
|
||||||
|
web_conn->udata_stop = spi_flash_real_size();
|
||||||
|
web_get_flash(ts_conn);
|
||||||
|
}
|
||||||
|
else ifcmp("sec_") {
|
||||||
|
web_conn->udata_start = ahextoul(cstr+4) << 12;
|
||||||
|
web_conn->udata_stop = web_conn->udata_start + FLASH_SECTOR_SIZE;
|
||||||
|
web_get_flash(ts_conn);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
ifcmp("disk") {
|
||||||
|
web_conn->udata_start = WEBFS_base_addr();
|
||||||
|
web_conn->udata_stop = web_conn->udata_start + WEBFS_curent_size();
|
||||||
|
web_get_flash(ts_conn);
|
||||||
|
}
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else web_get_flash(ts_conn);
|
||||||
|
}
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("ram") web_get_ram(ts_conn);
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("hexdmp") {
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return;
|
||||||
|
#endif
|
||||||
|
if(cstr[6]=='d') ts_conn->flag.user_option1 = 1;
|
||||||
|
else ts_conn->flag.user_option1 = 0;
|
||||||
|
web_hexdump(ts_conn);
|
||||||
|
}
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("web_") {
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("port") tcp_puts("%u", ts_conn->pcfg->port);
|
||||||
|
else ifcmp("host") tcp_puts(IPSTR ":%d", IP2STR(&(ts_conn->pcb->local_ip.addr)), ts_conn->pcb->local_port);
|
||||||
|
else ifcmp("remote") tcp_puts(IPSTR ":%d", IP2STR(&(ts_conn->remote_ip.dw)), ts_conn->remote_port);
|
||||||
|
else ifcmp("twrec") tcp_puts("%u", ts_conn->pcfg->time_wait_rec);
|
||||||
|
else ifcmp("twcls") tcp_puts("%u", ts_conn->pcfg->time_wait_cls);
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else ifcmp("wfs_") {
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("files") tcp_puts("%u", numFiles);
|
||||||
|
else ifcmp("addr") tcp_puts("0x%08x", WEBFS_base_addr());
|
||||||
|
else ifcmp("size") tcp_puts("%u", WEBFS_curent_size());
|
||||||
|
else ifcmp("max_size") tcp_puts("%u", WEBFS_max_size());
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
#ifdef USE_OVERLAY
|
||||||
|
else ifcmp("ovl") {
|
||||||
|
cstr += 3;
|
||||||
|
if(*cstr == ':') {
|
||||||
|
int i = ovl_loader(cstr + 1);
|
||||||
|
if (i == 0) {
|
||||||
|
if(CheckSCB(SCB_WEBSOC)) {
|
||||||
|
tcp_puts("%d", ovl_call(1));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
web_conn->web_disc_cb = (web_func_disc_cb)ovl_call; // адрес старта оверлея
|
||||||
|
web_conn->web_disc_par = 1; // параметр функции - инициализация
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tcp_puts("%d", i);
|
||||||
|
}
|
||||||
|
else if(*cstr == '$') {
|
||||||
|
if(ovl_call != NULL) tcp_puts("%d", ovl_call(ahextoul(cstr + 1)));
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else if(*cstr == '@') {
|
||||||
|
if(ovl_call != NULL) tcp_puts("%d", ovl_call((int) cstr + 1));
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SNTP
|
||||||
|
else ifcmp("sntp_") {
|
||||||
|
cstr += 5;
|
||||||
|
ifcmp("time") tcp_puts("%u", sntp_gen_system_time(0)); // get_sntp_time
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TEST_SEND_WAVE
|
||||||
|
else ifcmp("test_adc") web_test_adc(ts_conn);
|
||||||
|
#endif
|
||||||
|
else ifcmp("hellomsg") tcp_puts_fd("Web on RTL871x!");
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_WEB
|
396
RTLGDB/Project/web/web_int_vars.c
Normal file
396
RTLGDB/Project/web/web_int_vars.c
Normal file
|
@ -0,0 +1,396 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: webserver.c
|
||||||
|
* Description: The web server mode configuration.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#include "user_config.h"
|
||||||
|
#ifdef USE_WEB
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
#include "ethernetif.h"
|
||||||
|
#include "web_srv_int.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "webfs/webfs.h"
|
||||||
|
#include "flash_eep.h"
|
||||||
|
#include "device_lock.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "sys_cfg.h"
|
||||||
|
#include "wifi_api.h"
|
||||||
|
#include "sys_api.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
#include "netbios/netbios.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_SNTP
|
||||||
|
#include "sntp/sntp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_LWIP_PING
|
||||||
|
#include "lwip/app/ping.h"
|
||||||
|
struct ping_option pingopt; // for test
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_CAPTDNS
|
||||||
|
#include "captdns.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_MODBUS
|
||||||
|
#include "modbustcp.h"
|
||||||
|
#include "mdbtab.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_RS485DRV
|
||||||
|
#include "driver/rs485drv.h"
|
||||||
|
#include "mdbrs485.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_OVERLAY
|
||||||
|
#include "overlay.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void web_get_ram(TCP_SERV_CONN *ts_conn);
|
||||||
|
extern void web_get_flash(TCP_SERV_CONN *ts_conn);
|
||||||
|
extern void web_hexdump(TCP_SERV_CONN *ts_conn);
|
||||||
|
|
||||||
|
#define ifcmp(a) if(rom_xstrcmp(cstr, a))
|
||||||
|
|
||||||
|
extern int rom_atoi(const char *);
|
||||||
|
#undef atoi
|
||||||
|
#define atoi rom_atoi
|
||||||
|
|
||||||
|
typedef uint32 (* call_func)(uint32 a, uint32 b, uint32 c);
|
||||||
|
extern QueueHandle_t xQueueWebSrv;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : parse_url
|
||||||
|
* Description : parse the received data from the server
|
||||||
|
* Parameters : CurHTTP -- the result of parsing the url
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *pvar)
|
||||||
|
{
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
uint32 val = ahextoul(pvar);
|
||||||
|
char *cstr = pcmd;
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("[%s=%s]\n", pcmd, pvar);
|
||||||
|
#endif
|
||||||
|
ifcmp("start") web_conn->udata_start = val;
|
||||||
|
else ifcmp("stop") web_conn->udata_stop = val;
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
else ifcmp("user") web_conn->auth_level = UserAuthorization(pvar, strlen(pvar));
|
||||||
|
else if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) {
|
||||||
|
if(!web_conn->auth_realm) web_conn->auth_realm = WEB_AUTH_LEVEL_USER;
|
||||||
|
SetSCB(SCB_AUTH);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("sys_") {
|
||||||
|
cstr+=4;
|
||||||
|
ifcmp("restart") {
|
||||||
|
if(val == 12345) webserver_qfn((web_ex_func_cb)sys_reset, NULL, 200);
|
||||||
|
}
|
||||||
|
else ifcmp("ram") { uint32 *ptr = (uint32 *)(ahextoul(cstr+3)&(~3)); str_array(pvar, ptr, 32); }
|
||||||
|
else ifcmp("debug") print_off = (!val) & 1; // rtl_print on/off
|
||||||
|
else ifcmp("dsleep") deepsleep_ex(DSLEEP_WAKEUP_BY_TIMER, val);
|
||||||
|
#ifdef USE_LWIP_PING
|
||||||
|
else ifcmp("ping") {
|
||||||
|
// struct ping_option *pingopt = (struct ping_option *)UartDev.rcv_buff.pRcvMsgBuff;
|
||||||
|
pingopt.ip = ipaddr_addr(pvar);
|
||||||
|
pingopt.count = 3;
|
||||||
|
pingopt.recv_function=NULL;
|
||||||
|
pingopt.sent_function=NULL;
|
||||||
|
ping_start(&pingopt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
else ifcmp("cfg_") {
|
||||||
|
cstr += 4;
|
||||||
|
ifcmp("web_") {
|
||||||
|
cstr += 4;
|
||||||
|
ifcmp("port") {
|
||||||
|
if(syscfg.web_port != val) {
|
||||||
|
webserver_qfn((web_ex_func_cb)webserver_reinit, (void *)((uint32)syscfg.web_port), 200);
|
||||||
|
syscfg.web_port = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("twd") {
|
||||||
|
if(val) {
|
||||||
|
syscfg.cfg.b.web_time_wait_delete = 1;
|
||||||
|
ts_conn->pcfg->flag.pcb_time_wait_free = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
syscfg.cfg.b.web_time_wait_delete = 0;
|
||||||
|
ts_conn->pcfg->flag.pcb_time_wait_free = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("twrec") {
|
||||||
|
syscfg.web_twrec = val;
|
||||||
|
ts_conn->pcfg->time_wait_rec = val;
|
||||||
|
}
|
||||||
|
else ifcmp("twcls") {
|
||||||
|
syscfg.web_twcls = val;
|
||||||
|
ts_conn->pcfg->time_wait_cls = val;
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else ifcmp("pinclr") syscfg.cfg.b.pin_clear_cfg_enable = (val)? 1 : 0;
|
||||||
|
else ifcmp("sleep") {
|
||||||
|
syscfg.cfg.b.powersave_enable = (val)? 1 : 0;
|
||||||
|
if(val) release_wakelock(~WAKELOCK_WLAN);
|
||||||
|
else acquire_wakelock(~WAKELOCK_WLAN);
|
||||||
|
}
|
||||||
|
else ifcmp("debug") {
|
||||||
|
syscfg.cfg.b.debug_print_enable = val;
|
||||||
|
print_off = (!val) & 1; // rtl_print on/off
|
||||||
|
}
|
||||||
|
else ifcmp("save") {
|
||||||
|
if(val == 2) SetSCB(SCB_SYSSAVE); // по закрытию соединения вызвать sys_write_cfg()
|
||||||
|
else if(val == 1) sys_write_cfg();
|
||||||
|
}
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
else ifcmp("netbios") {
|
||||||
|
syscfg.cfg.b.netbios_ena = (val)? 1 : 0;
|
||||||
|
if(syscfg.cfg.b.netbios_ena) netbios_init();
|
||||||
|
else netbios_off();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SNTP
|
||||||
|
else ifcmp("sntp") {
|
||||||
|
syscfg.cfg.b.sntp_ena = (val)? 1 : 0;
|
||||||
|
if(syscfg.cfg.b.sntp_ena) sntp_init();
|
||||||
|
else sntp_stop();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_CAPTDNS
|
||||||
|
else ifcmp("cdns") {
|
||||||
|
syscfg.cfg.b.cdns_ena = (val)? 1 : 0;
|
||||||
|
if(syscfg.cfg.b.cdns_ena && wifi_softap_get_station_num()) captdns_init();
|
||||||
|
else captdns_close();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
// sys_write_cfg();
|
||||||
|
}
|
||||||
|
else ifcmp("wifi_") {
|
||||||
|
cstr+=5;
|
||||||
|
ifcmp("scan") api_wifi_scan(NULL);
|
||||||
|
else ifcmp("rdcfg") web_conn->udata_stop = read_wifi_cfg(val);
|
||||||
|
else ifcmp("newcfg") webserver_qfn((web_ex_func_cb)wifi_run, (void *)((uint32) wifi_cfg.mode), 200);
|
||||||
|
else ifcmp("mode") wifi_cfg.mode = val;
|
||||||
|
else ifcmp("bgn") wifi_cfg.bgn = val;
|
||||||
|
else ifcmp("lflg") wifi_cfg.load_flg = val;
|
||||||
|
else ifcmp("sflg") wifi_cfg.save_flg = val;
|
||||||
|
else ifcmp("txpow") wifi_cfg.tx_pwr = val;
|
||||||
|
else ifcmp("adpt") wifi_cfg.adaptivity = val;
|
||||||
|
else ifcmp("country") wifi_cfg.country_code = val;
|
||||||
|
// .. mac wifi_set_mac_address()
|
||||||
|
|
||||||
|
// else ifcmp("scan") {
|
||||||
|
// web_conn->web_disc_par = val;
|
||||||
|
// web_conn->web_disc_cb = (web_func_disc_cb)wifi_start_scan;
|
||||||
|
// }
|
||||||
|
else ifcmp("save") { write_wifi_cfg(val); }
|
||||||
|
else ifcmp("ap_") {
|
||||||
|
cstr+=3;
|
||||||
|
ifcmp("ssid") {
|
||||||
|
if(pvar[0]!='\0') {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len > NDIS_802_11_LENGTH_SSID) {
|
||||||
|
len = NDIS_802_11_LENGTH_SSID;
|
||||||
|
}
|
||||||
|
os_memset(wifi_ap_cfg.ssid, 0, sizeof(wifi_ap_cfg.ssid));
|
||||||
|
os_memcpy(wifi_ap_cfg.ssid, pvar, len);
|
||||||
|
#ifdef USE_NETBIOS
|
||||||
|
// netbios_set_name(wlan_ap_netifn, wifi_ap_cfg.ssid);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("psw") {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len > IW_PASSPHRASE_MAX_SIZE) {
|
||||||
|
len = IW_PASSPHRASE_MAX_SIZE;
|
||||||
|
}
|
||||||
|
os_memset(wifi_ap_cfg.password, 0, sizeof(wifi_ap_cfg.password));
|
||||||
|
os_memcpy(wifi_ap_cfg.password, pvar, len);
|
||||||
|
}
|
||||||
|
else ifcmp("chl") wifi_ap_cfg.channel = val;
|
||||||
|
else ifcmp("mcns") wifi_ap_cfg.max_sta = val;
|
||||||
|
else ifcmp("auth") wifi_ap_cfg.security = val; // =1 IDX_SECURITY_WPA2_AES_PSK, =0 IDX_SECURITY_OPEN
|
||||||
|
else ifcmp("hssid") wifi_ap_cfg.ssid_hidden = val;
|
||||||
|
else ifcmp("bint") wifi_ap_cfg.beacon_interval = val;
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
else ifcmp("hostname") {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len >= LWIP_NETIF_HOSTNAME_SIZE) {
|
||||||
|
len = LWIP_NETIF_HOSTNAME_SIZE-1;
|
||||||
|
}
|
||||||
|
if(len) {
|
||||||
|
os_memset(lwip_host_name[1], 0, LWIP_NETIF_HOSTNAME_SIZE);
|
||||||
|
os_memcpy(lwip_host_name[1], pvar, len);
|
||||||
|
}
|
||||||
|
netbios_set_name(WLAN_AP_NETIF_NUM, lwip_host_name[1]);
|
||||||
|
if(wifi_cfg.save_flg & BID_AP_HOSTNAME) {
|
||||||
|
WEB_SRV_QFNK x;
|
||||||
|
x.fnc = write_wifi_cfg;
|
||||||
|
x.param = (void *)BID_AP_HOSTNAME;
|
||||||
|
xQueueSendToBack(xQueueWebSrv, &x, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else ifcmp("dhcp") wifi_ap_dhcp.mode = val;
|
||||||
|
else ifcmp("ip") wifi_ap_dhcp.ip = ipaddr_addr(pvar);
|
||||||
|
else ifcmp("gw") wifi_ap_dhcp.gw = ipaddr_addr(pvar);
|
||||||
|
else ifcmp("msk") wifi_ap_dhcp.mask = ipaddr_addr(pvar);
|
||||||
|
// else ifcmp("mac") strtomac(pvar, wifi_ap_cfg.macaddr);
|
||||||
|
// else ifcmp("sip") wifi_ap_dhcp.start_ip = ipaddr_addr(pvar);
|
||||||
|
// else ifcmp("eip") wifi_ap_dhcp.end_ip = ipaddr_addr(pvar);
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
else os_printf(" - none! ");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else ifcmp("st_") {
|
||||||
|
cstr+=3;
|
||||||
|
ifcmp("arec") wifi_st_cfg.autoreconnect = val;
|
||||||
|
else ifcmp("rect") wifi_st_cfg.reconnect_pause = val;
|
||||||
|
else ifcmp("ssid") {
|
||||||
|
if(pvar[0]!='\0') {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len > NDIS_802_11_LENGTH_SSID) {
|
||||||
|
len = NDIS_802_11_LENGTH_SSID;
|
||||||
|
}
|
||||||
|
os_memset(wifi_st_cfg.ssid, 0, sizeof(wifi_st_cfg.ssid));
|
||||||
|
os_memcpy(wifi_st_cfg.ssid, pvar, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("psw") {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len > IW_PASSPHRASE_MAX_SIZE) {
|
||||||
|
len = IW_PASSPHRASE_MAX_SIZE;
|
||||||
|
}
|
||||||
|
os_memset(wifi_st_cfg.password, 0, sizeof(wifi_st_cfg.password));
|
||||||
|
os_memcpy(wifi_st_cfg.password, pvar, len);
|
||||||
|
}
|
||||||
|
else ifcmp("auth") wifi_st_cfg.security = val;
|
||||||
|
else ifcmp("bssid") strtomac(pvar, wifi_st_cfg.bssid);
|
||||||
|
else ifcmp("sbss") wifi_st_cfg.flg = val;
|
||||||
|
else ifcmp("sleep") wifi_st_cfg.sleep = val;
|
||||||
|
else ifcmp("dtim") wifi_st_cfg.dtim = val;
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
else ifcmp("hostname") {
|
||||||
|
int len = os_strlen(pvar);
|
||||||
|
if(len >= LWIP_NETIF_HOSTNAME_SIZE) {
|
||||||
|
len = LWIP_NETIF_HOSTNAME_SIZE-1;
|
||||||
|
}
|
||||||
|
if(len) {
|
||||||
|
os_memset(lwip_host_name[0], 0, LWIP_NETIF_HOSTNAME_SIZE);
|
||||||
|
os_memcpy(lwip_host_name[0], pvar, len);
|
||||||
|
netbios_set_name(WLAN_ST_NETIF_NUM, lwip_host_name[0]);
|
||||||
|
}
|
||||||
|
if(wifi_cfg.save_flg & BID_ST_HOSTNAME) {
|
||||||
|
WEB_SRV_QFNK x;
|
||||||
|
x.fnc = write_wifi_cfg;
|
||||||
|
x.param = (void *)BID_ST_HOSTNAME;
|
||||||
|
x.pause_ms = 0;
|
||||||
|
xQueueSendToBack(xQueueWebSrv, &x, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else ifcmp("dhcp") wifi_st_dhcp.mode = val;
|
||||||
|
else ifcmp("ip") wifi_st_dhcp.ip = ipaddr_addr(pvar);
|
||||||
|
else ifcmp("gw") wifi_st_dhcp.gw = ipaddr_addr(pvar);
|
||||||
|
else ifcmp("msk") wifi_st_dhcp.mask = ipaddr_addr(pvar);
|
||||||
|
// else ifcmp("mac") strtomac(pvar, wifi_st_cfg.mac);
|
||||||
|
// else ifcmp("sbss") wifi_st_cfg.bssidx = val;
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if WEB_DEBUG_FUNCTIONS
|
||||||
|
else if(web_conn->bffiles[0]==WEBFS_WEBCGI_HANDLE && CheckSCB(SCB_GET)) {
|
||||||
|
ifcmp("hexdmp") {
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
os_printf("hexdmp(%p)\n", val);
|
||||||
|
#endif
|
||||||
|
if(val > 0) {
|
||||||
|
if(cstr[6]=='d') ts_conn->flag.user_option1 = 1;
|
||||||
|
else ts_conn->flag.user_option1 = 0;
|
||||||
|
uint32 x = ahextoul(cstr+7);
|
||||||
|
web_conn->udata_start = x;
|
||||||
|
web_conn->udata_stop = val + web_conn->udata_start;
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
os_printf("start=%p, stop=%p\n", web_conn->udata_start, web_conn->udata_stop);
|
||||||
|
#endif
|
||||||
|
web_conn->fileType = HTTP_TXT;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_hexdump);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else ifcmp("flash") {
|
||||||
|
cstr+=5;
|
||||||
|
if(*cstr == '_') {
|
||||||
|
cstr++;
|
||||||
|
ifcmp("all") {
|
||||||
|
web_conn->udata_start = 0;
|
||||||
|
web_conn->udata_stop = spi_flash_real_size();
|
||||||
|
web_conn->fileType = HTTP_BIN;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_get_flash);
|
||||||
|
}
|
||||||
|
else ifcmp("sec_") {
|
||||||
|
web_conn->udata_start = ahextoul(cstr+4) << 12;
|
||||||
|
web_conn->udata_stop = web_conn->udata_start + FLASH_SECTOR_SIZE*val;
|
||||||
|
web_conn->fileType = HTTP_BIN;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_get_flash);
|
||||||
|
}
|
||||||
|
else ifcmp("disk") {
|
||||||
|
web_conn->udata_start = WEBFS_base_addr();
|
||||||
|
web_conn->udata_stop = web_conn->udata_start + WEBFS_curent_size();
|
||||||
|
web_conn->fileType = HTTP_BIN;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_get_flash);
|
||||||
|
}
|
||||||
|
else tcp_put('?');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
web_conn->fileType = HTTP_BIN;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_get_flash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else ifcmp("bin_ram") {
|
||||||
|
web_conn->fileType = HTTP_BIN;
|
||||||
|
SetSCB(SCB_RETRYCB | SCB_FCALBACK);
|
||||||
|
SetNextFunSCB(web_get_ram);
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none! ");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif // #if WEB_DEBUG_FUNCTIONS
|
||||||
|
#if DEBUGSOO > 5
|
||||||
|
else os_printf(" - none! ");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_WEB
|
2076
RTLGDB/Project/web/web_srv.c
Normal file
2076
RTLGDB/Project/web/web_srv.c
Normal file
File diff suppressed because it is too large
Load diff
210
RTLGDB/Project/web/web_srv.h
Normal file
210
RTLGDB/Project/web/web_srv.h
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
* File: web_srv.h
|
||||||
|
* Description: The web server configration.
|
||||||
|
* Small WEB server ESP8266EX
|
||||||
|
* Author: PV`
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_WEB_SRV_H_
|
||||||
|
#define _INCLUDE_WEB_SRV_H_
|
||||||
|
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
#ifdef WEBSOCKET_ENA
|
||||||
|
#include "websock.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WEB_SVERSION "0.2.0"
|
||||||
|
#define DEFAULT_WEB_PORT USE_WEB // 80
|
||||||
|
#define USE_WEB_AUTH_LEVEL 0 // 1
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
WEB_AUTH_NONE = 0,
|
||||||
|
WEB_AUTH_LEVEL_USER,
|
||||||
|
WEB_AUTH_LEVEL_USER1,
|
||||||
|
WEB_AUTH_LEVEL_WEBFS,
|
||||||
|
WEB_AUTH_LEVEL_OTA,
|
||||||
|
WEB_AUTH_LEVEL_SUPERVISOR
|
||||||
|
} WEB_AUTH_LEVEL_TYPE;
|
||||||
|
|
||||||
|
// File type definitions
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HTTP_TXT = 0, // File is a text document
|
||||||
|
HTTP_HTML, // File is HTML (extension .htm)
|
||||||
|
HTTP_CGI, // File is HTML (extension .cgi)
|
||||||
|
HTTP_XML, // File is XML (extension .xml)
|
||||||
|
HTTP_CSS, // File is stylesheet (extension .css)
|
||||||
|
HTTP_ICO, // File is ICO vnd.microsoft.icon
|
||||||
|
HTTP_GIF, // File is GIF image (extension .gif)
|
||||||
|
HTTP_PNG, // File is PNG image (extension .png)
|
||||||
|
HTTP_JPG, // File is JPG image (extension .jpg)
|
||||||
|
HTTP_SVG, // File is SVG image (extension .svg)
|
||||||
|
HTTP_JAVA, // File is java (extension .js)
|
||||||
|
HTTP_SWF, // File is ShockWave-Flash (extension .swf)
|
||||||
|
HTTP_WAV, // File is audio (extension .wav)
|
||||||
|
HTTP_PDF, // File is PDF (extension .pdf)
|
||||||
|
HTTP_ZIP, // File is ZIP (extension .zip)
|
||||||
|
HTTP_BIN, // File is BIN (extension .bin)
|
||||||
|
HTTP_UNKNOWN // File type is unknown
|
||||||
|
} HTTP_FILE_TYPE;
|
||||||
|
|
||||||
|
|
||||||
|
// extended state data for each connection
|
||||||
|
#define FileNameSize 64
|
||||||
|
#define VarNameSize 64
|
||||||
|
#define CmdNameSize 32
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16 httpStatus; // Request method/status
|
||||||
|
uint16 uri_len;
|
||||||
|
uint16 head_len;
|
||||||
|
uint16 cookie_len;
|
||||||
|
uint8 pFilename[FileNameSize];
|
||||||
|
uint8 *puri; // указатель на строку с переменными запроса к файлу
|
||||||
|
uint8 *phead; // HTTP Headers
|
||||||
|
uint8 *pcookie; // cookie
|
||||||
|
uint8 *pcontent; // content
|
||||||
|
uint32 content_len; //
|
||||||
|
uint8 httpver; // версия HTTP клиента в BCD (0x00 = неизвестен; 0x09 = HTTP/0.9; 0x10 = HTTP/1.0; 0x11 = HTTP/1.1)
|
||||||
|
uint8 fileType; // File type to return with Content-Type
|
||||||
|
} HTTP_CONN;
|
||||||
|
|
||||||
|
|
||||||
|
typedef void (* web_func_cb)(TCP_SERV_CONN *ts_conn);
|
||||||
|
typedef uint32 (* web_ex_func_cb)(uint32 flg); // внешняя или отложенная функция
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
web_ex_func_cb fnc;
|
||||||
|
void * param;
|
||||||
|
uint16 pause_ms;
|
||||||
|
} WEB_SRV_QFNK;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32 webflag; // флаги для http/web сервера
|
||||||
|
uint8 bffiles[4]; // четыре Files pointers для оработки вложенных файлов include
|
||||||
|
uint32 udata_start; // udata "start=0x..."
|
||||||
|
uint32 udata_stop; // udata "stop=0x..."
|
||||||
|
uint8 *msgbuf; // указатель на текущий буфер вывода
|
||||||
|
uint16 msgbuflen; // кол-во занятых байт в буфере msgbuf
|
||||||
|
uint16 msgbufsize; // размер буфера
|
||||||
|
web_func_cb func_web_cb; // calback функция у httpd для обработки приема/передачи кусками
|
||||||
|
uint32 content_len; // размер файла для передачи (GET/POST) или приема, если принимается внешний файл (POST + SCB_RXDATA)
|
||||||
|
#ifdef WEBSOCKET_ENA
|
||||||
|
WS_FRSTAT ws; // параметры websoc
|
||||||
|
#endif
|
||||||
|
#if USE_WEB_AUTH_LEVEL
|
||||||
|
uint8 auth_level; // Уровень авторизации пользователя по паролю WEB_AUTH_LEVEL_TYPE
|
||||||
|
uint8 auth_realm; // Требуемый уровень авторизации (минимальный уровень) WEB_AUTH_LEVEL_TYPE
|
||||||
|
#endif
|
||||||
|
uint8 fileType; // File type to return with Content-Type (if SCB_FCALBACK)
|
||||||
|
} WEB_SRV_CONN;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
WEBFS_MAX_HANDLE = 251,
|
||||||
|
WEBFS_NODISK_HANDLE,
|
||||||
|
WEBFS_WEBCGI_HANDLE,
|
||||||
|
WEBFS_UPLOAD_HANDLE
|
||||||
|
} WEBFS_NUM_HANDLE;
|
||||||
|
|
||||||
|
// webflag:
|
||||||
|
|
||||||
|
#define SCB_CLOSED 0x000001 // соединение закрыто
|
||||||
|
#define SCB_DISCONNECT 0x000002 // выход на DISCONNECT
|
||||||
|
#define SCB_FCLOSE 0x000004 // закрыть файлы
|
||||||
|
#define SCB_FOPEN 0x000008 // файл(ы) открыт(ы)
|
||||||
|
#define SCB_FCALBACK 0x000010 // file use ~calback~
|
||||||
|
#define SCB_FGZIP 0x000020 // файл GZIP
|
||||||
|
#define SCB_CHUNKED 0x000040 // передача шинковкой
|
||||||
|
#define SCB_RETRYCB 0x000080 // вызвать повтор CalBack
|
||||||
|
#define SCB_POST 0x000100 // POST
|
||||||
|
#define SCB_GET 0x000200 // GET
|
||||||
|
#define SCB_AUTH 0x000400 // необходима авторизация
|
||||||
|
#define SCB_FINDCB 0x000800 // используется парсингом ~calback~
|
||||||
|
#define SCB_RXDATA 0x001000 // прием данных (файла)
|
||||||
|
#define SCB_HEAD_OK 0x002000 // заголовок HTTP принят и обработан
|
||||||
|
#define SCB_BNDR 0x004000 // прилеплен Content-Type: multipart/form-data; boundary="..."
|
||||||
|
#define SCB_REDIR 0x008000 // Redirect 302
|
||||||
|
#define SCB_WEBSOC 0x010000 // WebSocket
|
||||||
|
#define SCB_WSDATA 0x020000 // WebSocket data
|
||||||
|
#define SCB_SYSSAVE 0x040000 // по закрытию соединения вызвать sys_write_cfg()
|
||||||
|
|
||||||
|
|
||||||
|
#define SCB_OPEN 0
|
||||||
|
|
||||||
|
#define SetSCB(a) web_conn->webflag |= a
|
||||||
|
#define FreeSCB() web_conn->webflag = SCB_FREE
|
||||||
|
#define SetNextFunSCB(a) web_conn->func_web_cb = a
|
||||||
|
#define ClrSCB(a) web_conn->webflag &= ~(a)
|
||||||
|
#define CheckSCB(a) (web_conn->webflag & (a))
|
||||||
|
|
||||||
|
#define FreeSCB() web_conn->webflag = SCB_FREE
|
||||||
|
#define OpenSCB() web_conn->webflag = SCB_OPEN
|
||||||
|
|
||||||
|
#define MAXLENBOUNDARY 64
|
||||||
|
typedef struct s_http_upload
|
||||||
|
{
|
||||||
|
uint16 status;
|
||||||
|
uint16 sizeboundary;
|
||||||
|
uint8 boundary[MAXLENBOUNDARY+1];
|
||||||
|
uint8 name[VarNameSize];
|
||||||
|
uint8 filename[VarNameSize];
|
||||||
|
#ifdef USE_OVERLAY
|
||||||
|
uint32 segs; // кол-во сегментов оверлея // пока в web_conn->web_disc_par
|
||||||
|
uint32 start; // адрес запуска оверлея
|
||||||
|
#endif
|
||||||
|
uint32 fsize;
|
||||||
|
uint32 faddr;
|
||||||
|
uint8 *pbndr;
|
||||||
|
uint8 *pnext;
|
||||||
|
} HTTP_UPLOAD;
|
||||||
|
|
||||||
|
typedef struct s_http_response
|
||||||
|
{
|
||||||
|
uint32 status;
|
||||||
|
uint32 flag;
|
||||||
|
const char * headers;
|
||||||
|
const char * default_content;
|
||||||
|
} HTTP_RESPONSE;
|
||||||
|
|
||||||
|
// HTTP_RESPONSE.flags:
|
||||||
|
#define HTTP_RESP_FLG_END 0x8000
|
||||||
|
#define HTTP_RESP_FLG_NONE 0x0000
|
||||||
|
#define HTTP_RESP_FLG_FINDFILE 0x0001
|
||||||
|
#define HTTP_RESP_FLG_REDIRECT 0x0002
|
||||||
|
|
||||||
|
#define tcp_put(a) web_conn->msgbuf[web_conn->msgbuflen++] = a
|
||||||
|
#define tcp_htmlstrcpy(str, len) web_conn->msgbuflen += htmlcode(&web_conn->msgbuf[web_conn->msgbuflen], str, web_conn->msgbufsize - web_conn->msgbuflen - 1, len)
|
||||||
|
//#define tcp_urlstrcpy(str, len) web_conn->msgbuflen += urlencode(&web_conn->msgbuf[web_conn->msgbuflen], str, web_conn->msgbufsize - web_conn->msgbuflen - 1, len)
|
||||||
|
#define tcp_puts(...) web_conn->msgbuflen += rtl_sprintf((char *)&web_conn->msgbuf[web_conn->msgbuflen], __VA_ARGS__)
|
||||||
|
#define tcp_puts_fd(...) web_conn->msgbuflen += rtl_sprintf((char *)&web_conn->msgbuf[web_conn->msgbuflen], __VA_ARGS__)
|
||||||
|
/*
|
||||||
|
#define tcp_puts_fd(fmt, ...) do { \
|
||||||
|
static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \
|
||||||
|
web_conn->msgbuflen += rtl_sprintf((char *)&web_conn->msgbuf[web_conn->msgbuflen], (char *)flash_str, ##__VA_ARGS__); \
|
||||||
|
} while(0)
|
||||||
|
*/
|
||||||
|
//#define tcp_strcpy(a) web_conn->msgbuflen += ets_strlen((char *)ets_strcpy((char *)&web_conn->msgbuf[web_conn->msgbuflen], (char *)a))
|
||||||
|
#define tcp_strcpy(a) web_conn->msgbuflen += rom_xstrcpy((char *)&web_conn->msgbuf[web_conn->msgbuflen], (const char *)a)
|
||||||
|
#define tcp_strcpy_fd(a) web_conn->msgbuflen += rom_xstrcpy((char *)&web_conn->msgbuf[web_conn->msgbuflen], (const char *)a)
|
||||||
|
/*
|
||||||
|
#define tcp_strcpy_fd(fmt) do { \
|
||||||
|
static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \
|
||||||
|
web_conn->msgbuflen += rom_xstrcpy((char *)&web_conn->msgbuf[web_conn->msgbuflen], (char *)flash_str); \
|
||||||
|
} while(0)
|
||||||
|
*/
|
||||||
|
uint32 ahextoul(uint8 *s);
|
||||||
|
err_t webserver_init(uint16 portn);
|
||||||
|
err_t webserver_close(uint16 portn);
|
||||||
|
err_t webserver_reinit(uint16 portn);
|
||||||
|
|
||||||
|
BaseType_t webserver_qfn(web_ex_func_cb fnc, void * param, uint16 pause_ms); // вызов функции из task с low priority
|
||||||
|
|
||||||
|
#endif /* _INCLUDE_WEB_SRV_H_ */
|
48
RTLGDB/Project/web/web_srv_int.h
Normal file
48
RTLGDB/Project/web/web_srv_int.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* File: web_srv_int.h
|
||||||
|
* Description: The web server configration.
|
||||||
|
* Small WEB server ESP8266EX
|
||||||
|
*
|
||||||
|
* Author: PV` 12/2014
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_WEB_SRV_INT_H_
|
||||||
|
#define _INCLUDE_WEB_SRV_INT_H_
|
||||||
|
|
||||||
|
#include "web_srv.h"
|
||||||
|
|
||||||
|
#define WEB_NAME_VERSION "PVs/0.2"
|
||||||
|
|
||||||
|
// lifetime (sec) of static responses as string 60*60*24*14=1209600"
|
||||||
|
#define FILE_CACHE_MAX_AGE_SEC 3600 // время для кеша файлов, ставить 0 пока тест!
|
||||||
|
|
||||||
|
#define MAX_HTTP_HEAD_BUF TCP_SRV_SERVER_MAX_RXBUF // максимальный размер HTTP запроса (GET)
|
||||||
|
|
||||||
|
#define RESCHKS_SEND_SIZE 16
|
||||||
|
#define RESCHKE_SEND_SIZE 8
|
||||||
|
#define RESCHK_SEND_SIZE (RESCHKS_SEND_SIZE + RESCHKE_SEND_SIZE)
|
||||||
|
|
||||||
|
#define MIN_SEND_SIZE (256 + RESCHK_SEND_SIZE) // минимальный размер буфера для передачи файла
|
||||||
|
#define MAX_SEND_SIZE ((TCP_SND_BUF) + RESCHK_SEND_SIZE) // ((TCP_MSS*4) + RESCHK_SEND_SIZE) // максимальный размер буфера для передачи 4*MSS = 5840 (MSS=1460)
|
||||||
|
|
||||||
|
#define HTTP_SEND_SIZE 384 // минимальный размер буфера для передачи заголовка HTTP
|
||||||
|
#define SCB_SEND_SIZE 128 // минимальный резерв в буфере для callback
|
||||||
|
|
||||||
|
#define webfile bffiles[0] // File pointer for main file
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 *pvar);
|
||||||
|
void web_int_cookie(HTTP_CONN *CurHTTP, TCP_SERV_CONN *ts_conn);
|
||||||
|
void web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr);
|
||||||
|
|
||||||
|
void web_hexdump(TCP_SERV_CONN *ts_conn);
|
||||||
|
bool web_inc_fopen(TCP_SERV_CONN *ts_conn, uint8 *cFile);
|
||||||
|
bool web_inc_fclose(WEB_SRV_CONN *web_conn);
|
||||||
|
|
||||||
|
bool web_trim_bufi(TCP_SERV_CONN *ts_conn, uint8 *pdata, uint32 data_len);
|
||||||
|
bool web_feee_bufi(TCP_SERV_CONN *ts_conn);
|
||||||
|
//uint8 * head_find_ctr(HTTP_CONN *CurHTTP, const uint8 * c, int clen, int dlen);
|
||||||
|
uint8 UserAuthorization(uint8 *pbuf, size_t declen);
|
||||||
|
|
||||||
|
#endif /* _INCLUDE_WEB_SRV_INT_H_ */
|
680
RTLGDB/Project/web/web_utils.c
Normal file
680
RTLGDB/Project/web/web_utils.c
Normal file
|
@ -0,0 +1,680 @@
|
||||||
|
/*
|
||||||
|
* web_utils.c
|
||||||
|
*
|
||||||
|
* Created on: 25 дек. 2014 г.
|
||||||
|
* Author: PV`
|
||||||
|
*/
|
||||||
|
#include "user_config.h"
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
//#include "bios.h"
|
||||||
|
//#include "sdk/add_func.h"
|
||||||
|
//#include "ets_sys.h"
|
||||||
|
//#include "os_type.h"
|
||||||
|
//#include "osapi.h"
|
||||||
|
//#include "user_interface.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
|
||||||
|
#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* xstrcpy() из сегментов flash и IRAM с возвратом размера строки:
|
||||||
|
* на выходе размер строки, без учета терминатора '\0'
|
||||||
|
*******************************************************************************/
|
||||||
|
int ICACHE_RAM_ATTR rom_xstrcpy(char * pd, const char * ps)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
union {
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned int ud;
|
||||||
|
}tmp;
|
||||||
|
if(ps == 0 || pd == 0) return (0);
|
||||||
|
*pd = 0;
|
||||||
|
unsigned int len = 0;
|
||||||
|
unsigned int *p = (unsigned int *)((unsigned int)ps & (~3));
|
||||||
|
unsigned int xlen = (unsigned int)ps & 3;
|
||||||
|
while(1) {
|
||||||
|
tmp.ud = *p++;
|
||||||
|
do {
|
||||||
|
if((*pd++ = tmp.uc[xlen++]) == 0) return len;
|
||||||
|
len++;
|
||||||
|
xlen &= 3;
|
||||||
|
} while(xlen);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int len = 0;
|
||||||
|
while((*pd++ = *ps++) != 0) len++;
|
||||||
|
return len;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* сравнение строки в ram со строкой в сегменте flash и IRAM
|
||||||
|
* = 1 если шаблон совпадает
|
||||||
|
*******************************************************************************/
|
||||||
|
int ICACHE_RAM_ATTR rom_xstrcmp(char * pd, const char * ps)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
union {
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned int ud;
|
||||||
|
}tmp;
|
||||||
|
if(ps == 0 || pd == 0) return 0;
|
||||||
|
unsigned int *p = (unsigned int *)((unsigned int)ps & (~3));
|
||||||
|
unsigned int xlen = (unsigned int)ps & 3;
|
||||||
|
while(1) {
|
||||||
|
tmp.ud = *p++;
|
||||||
|
do {
|
||||||
|
if(tmp.uc[xlen] == 0) return 1;
|
||||||
|
if(tmp.uc[xlen++] != *pd || *pd++ == 0) return 0;
|
||||||
|
xlen &= 3;
|
||||||
|
} while(xlen);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
while(*ps) {
|
||||||
|
if(*pd++ != *ps++) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* rom_atoi
|
||||||
|
*******************************************************************************/
|
||||||
|
int ICACHE_FLASH_ATTR rom_atoi(const char *s)
|
||||||
|
{
|
||||||
|
int n=0, neg=0;
|
||||||
|
while (*s == ' ') s++;
|
||||||
|
switch (*s) {
|
||||||
|
case '-': neg=1;
|
||||||
|
case '+': s++;
|
||||||
|
}
|
||||||
|
/* Compute n as a negative number to avoid overflow on INT_MIN */
|
||||||
|
while (*s >= '0' && *s <= '9')
|
||||||
|
n = 10*n - (*s++ - '0');
|
||||||
|
return neg ? n : -n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* get_seg_id()
|
||||||
|
*******************************************************************************/
|
||||||
|
const char * const txt_tab_seg[] = {
|
||||||
|
"ROM" // 0
|
||||||
|
"SRAM", // 1
|
||||||
|
"TCM", // 2
|
||||||
|
"FLASH", // 3 // -> flash On
|
||||||
|
"SDRAM", // 4 // -> Test ChipID or HAL_PERI_ON_WRITE32(REG_SOC_FUNC_EN, HAL_PERI_ON_READ32(REG_SOC_FUNC_EN) | BIT(21)); // Flag SDRAM Off
|
||||||
|
"SOC", // 5 // protected !
|
||||||
|
"CPU", // 6 // protected !
|
||||||
|
"UNK", // 7
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint32 tab_seg_def[] = {
|
||||||
|
0x00000000, 0x00050000,
|
||||||
|
0x10000000, 0x10070000,
|
||||||
|
0x1fff0000, 0x20000000,
|
||||||
|
0x98000000, 0xA0000000,
|
||||||
|
0x30000000, 0x30200000,
|
||||||
|
0x40000000, 0x40800000,
|
||||||
|
0xE0000000, 0xE0010000,
|
||||||
|
0x00000000, 0xFFFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
SEG_ID get_seg_id(uint32 addr, int32 size) {
|
||||||
|
SEG_ID ret = SEG_ID_ERR;
|
||||||
|
uint32 * ptr = (uint32 *) &tab_seg_def;
|
||||||
|
if (size > 0) {
|
||||||
|
do {
|
||||||
|
ret++;
|
||||||
|
if (addr >= ptr[0] && addr + size <= ptr[1]) {
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
ptr += 2;
|
||||||
|
} while (ret < SEG_ID_MAX);
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* copy_align4
|
||||||
|
* копирует данные из области кеширования flash и т.д.
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR copy_align4(void *ptrd, void *ptrs, uint32 len)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
uint8 uc[4];
|
||||||
|
uint32 ud;
|
||||||
|
}tmp;
|
||||||
|
uint8 *pd = ptrd;
|
||||||
|
uint32 *p = (uint32 *)((uint32)ptrs & (~3));
|
||||||
|
uint32 xlen = ((uint32)ptrs) & 3;
|
||||||
|
if(xlen) {
|
||||||
|
if(((uint32)p >= 0x10000000)&&((uint32)p < 0x9A002000)) tmp.ud = *p++;
|
||||||
|
else {
|
||||||
|
tmp.ud = 0;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
while (len) {
|
||||||
|
*pd++ = tmp.uc[xlen++];
|
||||||
|
len--;
|
||||||
|
if(xlen >= 4) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xlen = len >> 2;
|
||||||
|
while(xlen) {
|
||||||
|
if(((uint32)p >= 0x10000000)&&((uint32)p < 0x9A002000)) tmp.ud = *p++;
|
||||||
|
else {
|
||||||
|
tmp.ud = 0;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
*pd++ = tmp.uc[0];
|
||||||
|
*pd++ = tmp.uc[1];
|
||||||
|
*pd++ = tmp.uc[2];
|
||||||
|
*pd++ = tmp.uc[3];
|
||||||
|
xlen--;
|
||||||
|
}
|
||||||
|
len &= 3;
|
||||||
|
if(len) {
|
||||||
|
if(((uint32)p >= 0x10000000)&&((uint32)p < 0x9A002000)) tmp.ud = *p;
|
||||||
|
else tmp.ud = 0;
|
||||||
|
uint8 * ptmp = tmp.uc;
|
||||||
|
while (len--) *pd++ = *ptmp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : hextoul
|
||||||
|
*******************************************************************************/
|
||||||
|
// bool conv_str_hex(uint32 * dest, uint8 *s);
|
||||||
|
uint32 ICACHE_FLASH_ATTR hextoul(uint8 *s)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
uint32 val;
|
||||||
|
if(!conv_str_hex(&val, s)) return 0;
|
||||||
|
return val;
|
||||||
|
*/
|
||||||
|
uint32 val = 0;
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
if (*s >= '0' && *s <= '9')
|
||||||
|
{
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - '0';
|
||||||
|
}
|
||||||
|
else if (*s >= 'A' && *s <= 'F')
|
||||||
|
{
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - 'A' + 10;
|
||||||
|
}
|
||||||
|
else if (*s >= 'a' && *s <= 'f')
|
||||||
|
{
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - 'a' + 10;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
s++;
|
||||||
|
};
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : ahextoul
|
||||||
|
*******************************************************************************/
|
||||||
|
// bool convert_para_str(uint32 * dest, uint8 *s);
|
||||||
|
uint32 ICACHE_FLASH_ATTR ahextoul(uint8 *s)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
uint32 ret;
|
||||||
|
if(!convert_para_str(&ret, s)) return 0;
|
||||||
|
return ret;
|
||||||
|
*/
|
||||||
|
if((s[0]=='0') && ((s[1] | 0x20) =='x')) return hextoul(s+2);
|
||||||
|
return rom_atoi(s);
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : cmpcpystr
|
||||||
|
* Description : выбирает слово из строки текста с заданными начальным символом
|
||||||
|
* и конечным терминатором. Терминатор и стартовый символ не копирует, если заданы.
|
||||||
|
* Parameters : При задании начального символа = '\0' берется любой символ (>' ').
|
||||||
|
Копирует до символа <' ' или терминатора.
|
||||||
|
Задается ограничение размера буфера для копируемого слова (с дописыванием в буфер '\0'!).
|
||||||
|
* Returns : Зависит от значения терминатора, указывает на терминатор в строке,
|
||||||
|
если терминатор найден.
|
||||||
|
Если NULL, то начальный или конечный терминатор не найден.
|
||||||
|
*******************************************************************************/
|
||||||
|
uint8 * ICACHE_FLASH_ATTR cmpcpystr(uint8 *pbuf, uint8 *pstr, uint8 a, uint8 b, uint16 len)
|
||||||
|
{
|
||||||
|
if(len == 0) pbuf = NULL;
|
||||||
|
if(pstr == NULL) {
|
||||||
|
if(pbuf != NULL) *pbuf='\0';
|
||||||
|
return NULL;
|
||||||
|
};
|
||||||
|
uint8 c;
|
||||||
|
do {
|
||||||
|
c = *pstr;
|
||||||
|
if(c < ' ') { // строка кончилась
|
||||||
|
if(pbuf != NULL) *pbuf='\0';
|
||||||
|
return NULL; // id не найден
|
||||||
|
};
|
||||||
|
if((a == '\0')&&(c > ' ')) break; // не задан -> любой символ
|
||||||
|
pstr++;
|
||||||
|
if(c == a) break; // нашли стартовый символ (некопируемый в буфер)
|
||||||
|
}while(1);
|
||||||
|
if(pbuf != NULL) {
|
||||||
|
while(len--) {
|
||||||
|
c = *pstr;
|
||||||
|
if(c == b) { // нашли терминирующий символ (некопируемый в буфер)
|
||||||
|
*pbuf='\0';
|
||||||
|
return pstr; // конечный терминатор найден
|
||||||
|
};
|
||||||
|
// if(c <= ' ') { // строка кончилась или пробел
|
||||||
|
if(c < ' ') { // строка кончилась или пробел
|
||||||
|
*pbuf='\0';
|
||||||
|
return NULL; // конечный терминатор не найден
|
||||||
|
};
|
||||||
|
pstr++;
|
||||||
|
*pbuf++ = c;
|
||||||
|
};
|
||||||
|
*--pbuf='\0'; // закрыть буфер
|
||||||
|
};
|
||||||
|
do {
|
||||||
|
c = *pstr;
|
||||||
|
if(c == b) return pstr; // нашли терминирующий символ
|
||||||
|
// if(c <= ' ') return NULL; // строка кончилась
|
||||||
|
if(c < ' ') return NULL; // строка кончилась
|
||||||
|
pstr++;
|
||||||
|
}while(1);
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : str_array
|
||||||
|
* Набирает из строки s массив слов в buf в кол-ве до max_buf
|
||||||
|
* возврат - кол-во переменных в строке
|
||||||
|
* Разделитель переменных в строке ','
|
||||||
|
* Если нет переменной, то пропускает изменение в buf
|
||||||
|
* Примеры:
|
||||||
|
* Строка "1,2,3,4" -> buf = 0x01 0x02 0x03 0x04
|
||||||
|
* Строка "1,,3," -> buf = 0x01 (не изменено) 0x03 (не изменено)
|
||||||
|
*******************************************************************************/
|
||||||
|
uint32 ICACHE_FLASH_ATTR str_array(uint8 *s, uint32 *buf, uint32 max_buf)
|
||||||
|
{
|
||||||
|
uint32 ret = 0;
|
||||||
|
uint8 *sval = NULL;
|
||||||
|
while(max_buf > ret) {
|
||||||
|
if(sval == NULL) {
|
||||||
|
if (*s == '-' && s[1] >= '0' && s[1] <= '9') {
|
||||||
|
sval = s;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else if (*s >= '0' && *s <= '9') sval = s;
|
||||||
|
}
|
||||||
|
if(*s == ',' || *s <= ')') {
|
||||||
|
if(sval != NULL) {
|
||||||
|
*buf = ahextoul(sval);
|
||||||
|
sval = NULL;
|
||||||
|
}
|
||||||
|
buf++;
|
||||||
|
ret++;
|
||||||
|
if(*s < ')') return ret;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
uint32 ICACHE_FLASH_ATTR str_array_w(uint8 *s, uint16 *buf, uint32 max_buf)
|
||||||
|
{
|
||||||
|
uint32 ret = 0;
|
||||||
|
uint8 *sval = NULL;
|
||||||
|
while(max_buf > ret) {
|
||||||
|
if(sval == NULL) {
|
||||||
|
if (*s == '-' && s[1] >= '0' && s[1] <= '9') {
|
||||||
|
sval = s;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else if (*s >= '0' && *s <= '9') sval = s;
|
||||||
|
}
|
||||||
|
if(*s == ',' || *s <= ')') {
|
||||||
|
if(sval != NULL) {
|
||||||
|
*buf = ahextoul(sval);
|
||||||
|
sval = NULL;
|
||||||
|
}
|
||||||
|
buf++;
|
||||||
|
ret++;
|
||||||
|
if(*s < ')') return ret;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
uint32 ICACHE_FLASH_ATTR str_array_b(uint8 *s, uint8 *buf, uint32 max_buf)
|
||||||
|
{
|
||||||
|
uint32 ret = 0;
|
||||||
|
uint8 *sval = NULL;
|
||||||
|
while(max_buf > ret) {
|
||||||
|
if(sval == NULL) {
|
||||||
|
if (*s == '-' && s[1] >= '0' && s[1] <= '9') {
|
||||||
|
sval = s;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else if (*s >= '0' && *s <= '9') sval = s;
|
||||||
|
}
|
||||||
|
if(*s == ',' || *s == '.' || *s <= ')') {
|
||||||
|
if(sval != NULL) {
|
||||||
|
*buf = ahextoul(sval);
|
||||||
|
sval = NULL;
|
||||||
|
}
|
||||||
|
buf++;
|
||||||
|
ret++;
|
||||||
|
if(*s < ')') return ret;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : strtmac
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR strtomac(uint8 *s, uint8 *macaddr)
|
||||||
|
{
|
||||||
|
uint8 pbuf[4];
|
||||||
|
s = cmpcpystr(pbuf, s, 0, ':', 3);
|
||||||
|
*macaddr++ = hextoul(pbuf);
|
||||||
|
int i = 4;
|
||||||
|
while(i--) {
|
||||||
|
s = cmpcpystr(pbuf, s, ':', ':', 3);
|
||||||
|
*macaddr++ = hextoul(pbuf);
|
||||||
|
}
|
||||||
|
s = cmpcpystr(pbuf, s, ':', ' ', 3);
|
||||||
|
*macaddr++ = hextoul(pbuf);
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : urldecode
|
||||||
|
*******************************************************************************/
|
||||||
|
int ICACHE_FLASH_ATTR urldecode(uint8 *d, uint8 *s, uint16 lend, uint16 lens)
|
||||||
|
{
|
||||||
|
uint16 ret = 0;
|
||||||
|
if(s != NULL) while ((lens--) && (lend--) && (*s > ' ')) {
|
||||||
|
if ((*s == '%')&&(lens > 1)) {
|
||||||
|
s++;
|
||||||
|
int i = 2;
|
||||||
|
uint8 val = 0;
|
||||||
|
while(i--) {
|
||||||
|
if (*s >= '0' && *s <= '9') {
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - '0';
|
||||||
|
} else if (*s >= 'A' && *s <= 'F') {
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - 'A' + 10;
|
||||||
|
} else if (*s >= 'a' && *s <= 'f') {
|
||||||
|
val <<= 4;
|
||||||
|
val |= *s - 'a' + 10;
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
s++;
|
||||||
|
lens--;
|
||||||
|
};
|
||||||
|
s--;
|
||||||
|
*d++ = val;
|
||||||
|
} else if (*s == '+')
|
||||||
|
*d++ = ' ';
|
||||||
|
else
|
||||||
|
*d++ = *s;
|
||||||
|
ret++;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
*d = '\0';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : urlencode
|
||||||
|
*******************************************************************************/
|
||||||
|
/*int ICACHE_FLASH_ATTR urlencode(uint8 *d, uint8 *s, uint16 lend, uint16 lens)
|
||||||
|
{
|
||||||
|
uint16 ret = 0;
|
||||||
|
if(s != NULL) while ((lens--) && (lend--) && (*s != '\0')) {
|
||||||
|
if ( (48 <= *s && *s <= 57) //0-9
|
||||||
|
|| (65 <= *s && *s <= 90) //abc...xyz
|
||||||
|
|| (97 <= *s && *s <= 122) //ABC...XYZ
|
||||||
|
|| (*s == '~' || *s == '!' || *s == '*' || *s == '(' || *s == ')' || *s == '\'')) {
|
||||||
|
*d++ = *s++;
|
||||||
|
ret++;
|
||||||
|
} else {
|
||||||
|
if(lend >= 3) {
|
||||||
|
ret += 3;
|
||||||
|
lend -= 3;
|
||||||
|
*d++ = '%';
|
||||||
|
uint8 val = *s >> 4;
|
||||||
|
if(val <= 9) val += '0';
|
||||||
|
else val += 0x41 - 10;
|
||||||
|
*d++ = val;
|
||||||
|
val = *s++ & 0x0F;
|
||||||
|
if(val <= 9) val += '0';
|
||||||
|
else val += 0x41 - 10;
|
||||||
|
*d++ = val;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*d = '\0';
|
||||||
|
return ret;
|
||||||
|
}*/
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : htmlcode
|
||||||
|
*******************************************************************************/
|
||||||
|
int ICACHE_FLASH_ATTR htmlcode(uint8 *d, uint8 *s, uint16 lend, uint16 lens)
|
||||||
|
{
|
||||||
|
uint16 ret = 0;
|
||||||
|
if(s != NULL) while ((lens--) && (lend--) && (*s != '\0')) {
|
||||||
|
if ( *s == 0x27 ) { // "'" '
|
||||||
|
if(lend >= 6) {
|
||||||
|
ret += 6;
|
||||||
|
lend -= 6;
|
||||||
|
s++;
|
||||||
|
*d++ = '&';
|
||||||
|
*d++ = 'a';
|
||||||
|
*d++ = 'p';
|
||||||
|
*d++ = 'o';
|
||||||
|
*d++ = 's';
|
||||||
|
*d++ = ';';
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
} else if ( *s == '"' ) { // "
|
||||||
|
if(lend >= 6) {
|
||||||
|
ret += 6;
|
||||||
|
lend -= 6;
|
||||||
|
s++;
|
||||||
|
*d++ = '&';
|
||||||
|
*d++ = 'q';
|
||||||
|
*d++ = 'u';
|
||||||
|
*d++ = 'o';
|
||||||
|
*d++ = 't';
|
||||||
|
*d++ = ';';
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
} else if ( *s == '&' ) { // &
|
||||||
|
if(lend >= 5) {
|
||||||
|
ret += 5;
|
||||||
|
lend -= 5;
|
||||||
|
s++;
|
||||||
|
*d++ = '&';
|
||||||
|
*d++ = 'a';
|
||||||
|
*d++ = 'm';
|
||||||
|
*d++ = 'p';
|
||||||
|
*d++ = ';';
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
} else if ( *s == '<' ) { // <
|
||||||
|
if(lend >= 4) {
|
||||||
|
ret += 4;
|
||||||
|
lend -= 4;
|
||||||
|
s++;
|
||||||
|
*d++ = '&';
|
||||||
|
*d++ = 'l';
|
||||||
|
*d++ = 't';
|
||||||
|
*d++ = ';';
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
} else if ( *s == '>' ) { // >
|
||||||
|
if(lend >= 4) {
|
||||||
|
ret += 4;
|
||||||
|
lend -= 4;
|
||||||
|
s++;
|
||||||
|
*d++ = '&';
|
||||||
|
*d++ = 'g';
|
||||||
|
*d++ = 't';
|
||||||
|
*d++ = ';';
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
} else {
|
||||||
|
*d++ = *s++;
|
||||||
|
ret++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*d = '\0';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
extern size_t rtl_strlen(const char *str);
|
||||||
|
extern int rtl_strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
|
||||||
|
uint8* ICACHE_FLASH_ATTR
|
||||||
|
web_strnstr(const uint8* buffer, const uint8* token, int len)
|
||||||
|
{
|
||||||
|
const uint8* p;
|
||||||
|
int tokenlen = rtl_strlen(token);
|
||||||
|
if (tokenlen == 0) {
|
||||||
|
return (uint8 *)buffer;
|
||||||
|
};
|
||||||
|
for (p = buffer; *p && (p + tokenlen <= buffer + len); p++) {
|
||||||
|
if ((*p == *token) && (rtl_strncmp(p, token, tokenlen) == 0)) {
|
||||||
|
return (uint8 *)p;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
static const uint8_t base64map[128] ICACHE_RODATA_ATTR =
|
||||||
|
{
|
||||||
|
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||||
|
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||||
|
255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
|
||||||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
|
||||||
|
255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||||
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
|
||||||
|
255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||||
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255
|
||||||
|
};
|
||||||
|
//=============================================================================
|
||||||
|
bool ICACHE_FLASH_ATTR base64decode(const uint8 *in, int len, uint8_t *out, int *outlen)
|
||||||
|
{
|
||||||
|
// uint8 *map = (uint8 *)UartDev.rcv_buff.pRcvMsgBuff;
|
||||||
|
// ets_memcpy(map, base64map, 128);
|
||||||
|
uint8 *map = (uint8 *) base64map;
|
||||||
|
int g, t, x, y, z;
|
||||||
|
uint8_t c;
|
||||||
|
g = 3;
|
||||||
|
for (x = y = z = t = 0; x < len; x++) {
|
||||||
|
if ((c = map[in[x]&0x7F]) == 0xff) continue;
|
||||||
|
if (c == 254) { /* this is the end... */
|
||||||
|
c = 0;
|
||||||
|
if (--g < 0) return false;
|
||||||
|
}
|
||||||
|
else if (g != 3) return false; /* only allow = at end */
|
||||||
|
t = (t<<6) | c;
|
||||||
|
if (++y == 4) {
|
||||||
|
out[z++] = (uint8_t)((t>>16)&255);
|
||||||
|
if (g > 1) out[z++] = (uint8_t)((t>>8)&255);
|
||||||
|
if (g > 2) out[z++] = (uint8_t)(t&255);
|
||||||
|
y = t = 0;
|
||||||
|
}
|
||||||
|
/* check that we don't go past the output buffer */
|
||||||
|
if (z > *outlen) return false;
|
||||||
|
}
|
||||||
|
if (y != 0) return false;
|
||||||
|
*outlen = z;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
/* Table 6-bit-index-to-ASCII used for base64-encoding */
|
||||||
|
const uint8_t base64_table[] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
||||||
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
|
||||||
|
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
|
||||||
|
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
'+', '/'
|
||||||
|
};
|
||||||
|
// ld: PROVIDE ( base64_table = 0x3FFFD600 );
|
||||||
|
//extern const uint8_t base64_table[];
|
||||||
|
//=============================================================================
|
||||||
|
/** Base64 encoding */
|
||||||
|
size_t ICACHE_FLASH_ATTR base64encode(char* target, size_t target_len, const char* source, size_t source_len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
sint8 j;
|
||||||
|
size_t target_idx = 0;
|
||||||
|
size_t longer = 3 - (source_len % 3);
|
||||||
|
size_t source_len_b64 = source_len + longer;
|
||||||
|
size_t len = (((source_len_b64) * 4) / 3);
|
||||||
|
uint8 x = 5;
|
||||||
|
uint8 current = 0;
|
||||||
|
|
||||||
|
if(target == NULL || target_len < len) return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < source_len_b64; i++) {
|
||||||
|
uint8 b = (i < source_len ? source[i] : 0);
|
||||||
|
for (j = 7; j >= 0; j--, x--) {
|
||||||
|
uint8 shift = ((b & (1 << j)) != 0) ? 1 : 0;
|
||||||
|
current |= shift << x;
|
||||||
|
if (x == 0) {
|
||||||
|
target[target_idx++] = base64_table[current];
|
||||||
|
x = 6;
|
||||||
|
current = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = len - longer; i < len; i++) {
|
||||||
|
target[i] = '=';
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
//=============================================================================
|
||||||
|
void ICACHE_FLASH_ATTR print_hex_dump(uint8 *buf, uint32 len, uint8 k)
|
||||||
|
{
|
||||||
|
if(!system_get_os_print()) return; // if(*((uint8 *)(0x3FFE8000)) == 0) return;
|
||||||
|
uint32 ss[2];
|
||||||
|
ss[0] = 0x78323025; // "%02x"
|
||||||
|
ss[1] = k; // ","...'\0'
|
||||||
|
uint8* ptr = buf;
|
||||||
|
while(len--) {
|
||||||
|
if(len == 0) ss[1] = 0;
|
||||||
|
ets_printf((uint8 *)&ss[0], *ptr++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
#define LowerCase(a) ((('A' <= a) && (a <= 'Z')) ? a + 32 : a)
|
||||||
|
|
||||||
|
char* ICACHE_FLASH_ATTR word_to_lower_case(char* text) {
|
||||||
|
for(; *text ==' '; text++);
|
||||||
|
char* p = text;
|
||||||
|
for (; *p >= ' '; p++) {
|
||||||
|
*p = LowerCase(*p);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
//=============================================================================
|
||||||
|
/* char UpperCase(char ch) {
|
||||||
|
return (('a' <= ch) && (ch <= 'z')) ? ch - 32 : ch; }*/
|
||||||
|
#define UpperCase(a) ((('a' <= a) && (a <= 'z')) ? a - 32 : a)
|
||||||
|
|
||||||
|
char* ICACHE_FLASH_ATTR str_to_upper_case(char* text) {
|
||||||
|
char* p = text;
|
||||||
|
for (; *p; ++p) {
|
||||||
|
*p = UpperCase(*p);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
48
RTLGDB/Project/web/web_utils.h
Normal file
48
RTLGDB/Project/web/web_utils.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: web_utils.h
|
||||||
|
* Alternate SDK
|
||||||
|
* Author: PV`
|
||||||
|
* (c) PV` 2015
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_WEB_UTILS_H_
|
||||||
|
#define _INCLUDE_WEB_UTILS_H_
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SEG_ID_ROM = 0,
|
||||||
|
SEG_ID_SRAM,
|
||||||
|
SEG_ID_TCM,
|
||||||
|
SEG_ID_FLASH,
|
||||||
|
SEG_ID_SDRAM,
|
||||||
|
SEG_ID_SOC,
|
||||||
|
SEG_ID_CPU,
|
||||||
|
SEG_ID_ERR,
|
||||||
|
SEG_ID_MAX
|
||||||
|
} SEG_ID;
|
||||||
|
|
||||||
|
extern const uint32 tab_seg_def[];
|
||||||
|
SEG_ID get_seg_id(uint32 addr, int32 size);
|
||||||
|
|
||||||
|
int rom_atoi(const char *s);
|
||||||
|
void copy_align4(void *ptrd, void *ptrs, uint32 len);
|
||||||
|
uint32 hextoul(uint8 *s);
|
||||||
|
uint32 ahextoul(uint8 *s);
|
||||||
|
uint8 * cmpcpystr(uint8 *pbuf, uint8 *pstr, uint8 a, uint8 b, uint16 len);
|
||||||
|
uint8 * web_strnstr(const uint8* buffer, const uint8* token, int n);
|
||||||
|
bool base64decode(const uint8 *in, int len, uint8_t *out, int *outlen);
|
||||||
|
size_t base64encode(char* target, size_t target_len, const char* source, size_t source_len);
|
||||||
|
void strtomac(uint8 *s, uint8 *macaddr);
|
||||||
|
//uint32 strtoip(uint8 *s); // ipaddr_addr();
|
||||||
|
int urldecode(uint8 *d, uint8 *s, uint16 lend, uint16 lens);
|
||||||
|
//int urlencode(uint8 *d, uint8 *s, uint16 lend, uint16 lens);
|
||||||
|
int htmlcode(uint8 *d, uint8 *s, uint16 lend, uint16 lens);
|
||||||
|
void print_hex_dump(uint8 *buf, uint32 len, uint8 k);
|
||||||
|
// char* str_to_upper_case(char* text);
|
||||||
|
uint32 str_array(uint8 *s, uint32 *buf, uint32 max_buf);
|
||||||
|
uint32 str_array_w(uint8 *s, uint16 *buf, uint32 max_buf);
|
||||||
|
uint32 str_array_b(uint8 *s, uint8 *buf, uint32 max_buf);
|
||||||
|
char* word_to_lower_case(char* text);
|
||||||
|
int rom_xstrcmp(char * pd, const char * ps);
|
||||||
|
int rom_xstrcpy(char * pd, const char * ps);
|
||||||
|
|
||||||
|
#endif /* _INCLUDE_WEB_UTILS_H_ */
|
352
RTLGDB/Project/web/web_websocket.c
Normal file
352
RTLGDB/Project/web/web_websocket.c
Normal file
|
@ -0,0 +1,352 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: web_websocket.c
|
||||||
|
* Description: websocket for web
|
||||||
|
* Author: pvvx
|
||||||
|
* 2016
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "user_config.h"
|
||||||
|
#ifdef WEBSOCKET_ENA
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
//#include "bios.h"
|
||||||
|
//#include "osapi.h"
|
||||||
|
//#include "sdk/rom2ram.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
#include "web_srv_int.h"
|
||||||
|
#include "web_srv.h"
|
||||||
|
#include "web_utils.h"
|
||||||
|
#include "web_websocket.h"
|
||||||
|
#include "websock.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#undef DEBUGSOO
|
||||||
|
#define DEBUGSOO 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define copy_s4d1 rtl_memcpy
|
||||||
|
|
||||||
|
//#define mMIN(a, b) ((a<b)?a:b)
|
||||||
|
|
||||||
|
#define MAX_RX_BUF_SIZE 8192
|
||||||
|
|
||||||
|
const char txt_wsping[] ICACHE_RODATA_ATTR = "ws:ping";
|
||||||
|
const char txt_wspong[] ICACHE_RODATA_ATTR = "ws:pong";
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// websock_tx_frame() - передача фрейма
|
||||||
|
//=============================================================================
|
||||||
|
err_t ICACHE_FLASH_ATTR
|
||||||
|
websock_tx_frame(TCP_SERV_CONN *ts_conn, uint32 opcode, uint8 *raw_data, uint32 raw_len)
|
||||||
|
{
|
||||||
|
err_t err = WebsocketTxFrame(ts_conn, opcode, raw_data, raw_len);
|
||||||
|
if(err != ERR_OK) {
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("ws%utx[%u] error %d!\n", opcode, raw_len, err);
|
||||||
|
#endif
|
||||||
|
((WEB_SRV_CONN *)ts_conn->linkd)->webflag |= SCB_DISCONNECT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if((opcode & WS_OPCODE_BITS) == WS_OPCODE_CLOSE) {
|
||||||
|
((WEB_SRV_CONN *)ts_conn->linkd)->ws.flg |= WS_FLG_CLOSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// websock_tx_close_err() - вывод сообщения закрытия или ошибки
|
||||||
|
//=============================================================================
|
||||||
|
err_t ICACHE_FLASH_ATTR
|
||||||
|
websock_tx_close_err(TCP_SERV_CONN *ts_conn, uint32 err)
|
||||||
|
{
|
||||||
|
uint8 uc[2];
|
||||||
|
uc[1] = err;
|
||||||
|
uc[0] = err>>8;
|
||||||
|
return websock_tx_frame(ts_conn, WS_OPCODE_CLOSE | WS_FRAGMENT_FIN, uc, 2);
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// websock_rx_data() прием данных
|
||||||
|
//=============================================================================
|
||||||
|
#define MAX_WS_DATA_BLK_SIZE (tcp_sndbuf(ts_conn->pcb)-8) // (TCP_MSS - 8)
|
||||||
|
//=============================================================================
|
||||||
|
bool ICACHE_FLASH_ATTR
|
||||||
|
websock_rx_data(TCP_SERV_CONN *ts_conn)
|
||||||
|
{
|
||||||
|
// HTTP_CONN *CurHTTP;
|
||||||
|
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
|
||||||
|
if(web_conn == NULL) return false;
|
||||||
|
WS_FRSTAT *ws = &web_conn->ws;
|
||||||
|
uint16 len;
|
||||||
|
uint8 *pstr;
|
||||||
|
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("ws_rx[%u]%u ", ts_conn->sizei, ts_conn->cntri);
|
||||||
|
#endif
|
||||||
|
if(ts_conn->sizei == 0) return true; // докачивать
|
||||||
|
tcpsrv_unrecved_win(ts_conn);
|
||||||
|
if((ws->flg & WS_FLG_CLOSE) != 0) {
|
||||||
|
// убить буфер ts_conn->pbufi, конец давно :)
|
||||||
|
web_feee_bufi(ts_conn);
|
||||||
|
SetSCB(SCB_DISCONNECT);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(ts_conn->sizei > MAX_RX_BUF_SIZE) {
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:rxbuf_full! ");
|
||||||
|
#endif
|
||||||
|
// убить буфер ts_conn->pbufi и ответить ошибкой WS_CLOSE_UNEXPECTED_ERROR
|
||||||
|
web_feee_bufi(ts_conn);
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_MESSAGE_TOO_BIG); // WS_CLOSE_UNEXPECTED_ERROR);
|
||||||
|
SetSCB(SCB_DISCONNECT);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pstr = ts_conn->pbufi;// + ts_conn->cntri;
|
||||||
|
len = ts_conn->sizei;// - ts_conn->cntri;
|
||||||
|
while(ts_conn->cntri < ts_conn->sizei || (ws->flg & WS_FLG_FIN) != 0) {
|
||||||
|
pstr = ts_conn->pbufi;// + ts_conn->cntri;
|
||||||
|
len = ts_conn->sizei;// - ts_conn->cntri;
|
||||||
|
if((ws->flg & WS_FLG_FIN) != 0 // обработка
|
||||||
|
|| ws->frame_len > ws->cur_len) {
|
||||||
|
ws->flg &= ~WS_FLG_FIN;
|
||||||
|
len = mMIN(ws->frame_len - ws->cur_len, mMIN(MAX_WS_DATA_BLK_SIZE, len));
|
||||||
|
// размаскировать
|
||||||
|
if((ws->flg & WS_FLG_MASK) != 0) WebsocketMask(ws, pstr, len);
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("wsfr[%u]blk[%u]at:%u ", ws->frame_len, len, ws->cur_len);
|
||||||
|
#endif
|
||||||
|
switch(ws->status) {
|
||||||
|
case sw_frs_binary:
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws:bin ");
|
||||||
|
#endif
|
||||||
|
if(ws->frame_len != 0) {
|
||||||
|
// пока просто эхо
|
||||||
|
uint32 opcode = WS_OPCODE_BINARY;
|
||||||
|
if(ws->cur_len != 0) opcode = WS_OPCODE_CONTINUE;
|
||||||
|
if(ws->frame_len == ws->cur_len + len) opcode |= WS_FRAGMENT_FIN;
|
||||||
|
if(websock_tx_frame(ts_conn, opcode, pstr, len) != ERR_OK) {
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ws->cur_len += len;
|
||||||
|
ts_conn->cntri += len;
|
||||||
|
break;
|
||||||
|
case sw_frs_text:
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws:txt ");
|
||||||
|
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
if(ws->frame_len != 0) {
|
||||||
|
uint8 tt = pstr[len];
|
||||||
|
pstr[len] = 0;
|
||||||
|
os_printf("'%s' ", pstr);
|
||||||
|
pstr[len] = tt;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
if(ws->frame_len == ws->cur_len + len && ws->frame_len != 0) { // полное соо
|
||||||
|
web_conn->msgbufsize = tcp_sndbuf(ts_conn->pcb); // сколько можем выввести сейчас?
|
||||||
|
if (web_conn->msgbufsize < MIN_SEND_SIZE) {
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:sndbuf=%u! ", web_conn->msgbufsize);
|
||||||
|
#endif
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_UNEXPECTED_ERROR);
|
||||||
|
SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
web_conn->msgbufsize -= 16;
|
||||||
|
if(ws->frame_len == (sizeof(txt_wsping)-1) && rom_xstrcmp(pstr, txt_wsping) != 0){
|
||||||
|
copy_s4d1(pstr, (void *)txt_wspong, sizeof(txt_wspong) - 1);
|
||||||
|
if(websock_tx_frame(ts_conn, WS_OPCODE_TEXT | WS_FRAGMENT_FIN, pstr, sizeof(txt_wspong) - 1) != ERR_OK) {
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(web_conn->msgbuf) os_free(web_conn->msgbuf);
|
||||||
|
web_conn->msgbuf = (uint8 *) os_malloc(web_conn->msgbufsize);
|
||||||
|
if (web_conn->msgbuf == NULL) {
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:mem!\n");
|
||||||
|
#endif
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_UNEXPECTED_ERROR);
|
||||||
|
SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
web_conn->msgbuflen = 0;
|
||||||
|
uint32 opcode;
|
||||||
|
if(CheckSCB(SCB_RETRYCB)) { // повторный callback? да
|
||||||
|
if(web_conn->func_web_cb != NULL) web_conn->func_web_cb(ts_conn);
|
||||||
|
if(!CheckSCB(SCB_RETRYCB)) {
|
||||||
|
// ClrSCB(SCB_FCLOSE | SCB_DISCONNECT);
|
||||||
|
opcode = WS_OPCODE_CONTINUE | WS_FRAGMENT_FIN;
|
||||||
|
}
|
||||||
|
else opcode = WS_OPCODE_CONTINUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pstr[len] = '\0';
|
||||||
|
uint8 *vstr = os_strchr(pstr, '=');
|
||||||
|
if(vstr != NULL) {
|
||||||
|
*vstr++ = '\0';
|
||||||
|
web_int_vars(ts_conn, pstr, vstr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
web_conn->msgbuf[0] = 0;
|
||||||
|
web_int_callback(ts_conn, pstr);
|
||||||
|
}
|
||||||
|
if(CheckSCB(SCB_RETRYCB)) opcode = WS_OPCODE_TEXT;
|
||||||
|
else {
|
||||||
|
// ClrSCB(SCB_FCLOSE | SCB_DISCONNECT);
|
||||||
|
opcode = WS_OPCODE_TEXT | WS_FRAGMENT_FIN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(web_conn->msgbuflen != 0) {
|
||||||
|
if(websock_tx_frame(ts_conn, opcode, web_conn->msgbuf, web_conn->msgbuflen) != ERR_OK) {
|
||||||
|
if(web_conn->msgbuf) os_free(web_conn->msgbuf);
|
||||||
|
web_conn->msgbuf = NULL;
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(web_conn->msgbuf) os_free(web_conn->msgbuf);
|
||||||
|
web_conn->msgbuf = NULL;
|
||||||
|
if(CheckSCB(SCB_RETRYCB)) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if(0) {
|
||||||
|
uint32 opcode = WS_OPCODE_TEXT;
|
||||||
|
if(ws->cur_len != 0) opcode = WS_OPCODE_CONTINUE;
|
||||||
|
if(ws->frame_len == ws->cur_len + len) opcode |= WS_FRAGMENT_FIN;
|
||||||
|
if(websock_tx_frame(ts_conn, opcode, pstr, len) != ERR_OK) {
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
ws->cur_len += len;
|
||||||
|
ts_conn->cntri += len;
|
||||||
|
return true; // докачивать
|
||||||
|
// break;
|
||||||
|
// break;
|
||||||
|
case sw_frs_ping:
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws:ping ");
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
uint32 opcode = WS_OPCODE_PONG;
|
||||||
|
if(ws->cur_len != 0) opcode = WS_OPCODE_CONTINUE;
|
||||||
|
if(ws->frame_len == ws->cur_len + len) opcode |= WS_FRAGMENT_FIN;
|
||||||
|
if(websock_tx_frame(ts_conn, opcode, pstr, len) != ERR_OK) {
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ws->cur_len += len;
|
||||||
|
ts_conn->cntri += len;
|
||||||
|
return true; // докачивать
|
||||||
|
// break;
|
||||||
|
case sw_frs_pong:
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws:pong ");
|
||||||
|
#endif
|
||||||
|
ws->cur_len += len;
|
||||||
|
ts_conn->cntri += len;
|
||||||
|
break;
|
||||||
|
// return true;
|
||||||
|
case sw_frs_close:
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws:close ");
|
||||||
|
#endif
|
||||||
|
// if((ws->flg & WS_FLG_CLOSE) == 0) {
|
||||||
|
{
|
||||||
|
if(len >= 2) {
|
||||||
|
uint32 close_code = (pstr[0]<<8) | pstr[1];
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("code:%d ", close_code);
|
||||||
|
#endif
|
||||||
|
if(close_code == WS_CLOSE_NORMAL) websock_tx_close_err(ts_conn, WS_CLOSE_NORMAL);
|
||||||
|
// else websock_tx_frame(ts_conn, WS_OPCODE_CLOSE | WS_FRAGMENT_FIN, NULL, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_NORMAL);
|
||||||
|
// websock_tx_frame(ts_conn, WS_OPCODE_CLOSE | WS_FRAGMENT_FIN, NULL, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ts_conn->flag.pcb_time_wait_free = 1;
|
||||||
|
SetSCB(SCB_DISCONNECT);
|
||||||
|
// ts_conn->cntri = ts_conn->sizei;
|
||||||
|
/* ws->cur_len += len;
|
||||||
|
ts_conn->cntri += len; */
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:f?! ");
|
||||||
|
#endif
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_UNEXPECTED_ERROR);
|
||||||
|
SetSCB(SCB_DISCONNECT);
|
||||||
|
// ts_conn->cntri = ts_conn->sizei;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(ws->cur_len >= ws->frame_len) { // прием и разбор нового фрейма
|
||||||
|
if((ws->flg & WS_FLG_FIN) != 0) { // обработка
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("ws_rx:fin=%u ", ws->cur_len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint32 ret = WebsocketHead(ws, pstr, len);
|
||||||
|
if(ret >= WS_CLOSE_NORMAL) { // error или close
|
||||||
|
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:txerr=%u ", ret);
|
||||||
|
#endif
|
||||||
|
websock_tx_close_err(ts_conn, ret);
|
||||||
|
// ts_conn->cntri = ts_conn->sizei; // убить буфер ts_conn->pbufi
|
||||||
|
return false; // error
|
||||||
|
}
|
||||||
|
else if(ret == 0) {
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("ws_rx... ");
|
||||||
|
#endif
|
||||||
|
return true; // докачивать
|
||||||
|
}
|
||||||
|
ts_conn->cntri += ws->head_len; // вычесть заголовок
|
||||||
|
/*
|
||||||
|
switch(ws->status) {
|
||||||
|
case sw_frs_binary:
|
||||||
|
break;
|
||||||
|
case sw_frs_text:
|
||||||
|
if(ws->frame_len > MAX_RX_BUF_SIZE) {
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_MESSAGE_TOO_BIG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("trim%u-%u ", ts_conn->sizei, ts_conn->sizei - ts_conn->cntri );
|
||||||
|
#endif
|
||||||
|
if(!web_trim_bufi(ts_conn, &ts_conn->pbufi[ts_conn->cntri], ts_conn->sizei - ts_conn->cntri)) {
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("ws:trim_err! ");
|
||||||
|
#endif
|
||||||
|
// убить буфер ts_conn->pbufi и ответить ошибкой WS_CLOSE_UNEXPECTED_ERROR
|
||||||
|
websock_tx_close_err(ts_conn, WS_CLOSE_UNEXPECTED_ERROR);
|
||||||
|
SetSCB(SCB_DISCONNECT);
|
||||||
|
// ts_conn->cntri = ts_conn->sizei;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return false; // не докачивать, ошибка или закрытие
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
//=============================================================================
|
||||||
|
#endif // WEBSOCKET_ENA
|
||||||
|
|
||||||
|
|
18
RTLGDB/Project/web/web_websocket.h
Normal file
18
RTLGDB/Project/web/web_websocket.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef _WEB_WEBSOCKET_H_
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: web_websocket.h
|
||||||
|
* Description: websocket for web ESP8266
|
||||||
|
* Author: PV`
|
||||||
|
* (c) PV` 2016
|
||||||
|
*******************************************************************************/
|
||||||
|
#define _WEB_WEBSOCKET_H_
|
||||||
|
#include "user_config.h"
|
||||||
|
#ifdef WEBSOCKET_ENA
|
||||||
|
#include "websock.h"
|
||||||
|
|
||||||
|
err_t websock_tx_close_err(TCP_SERV_CONN *ts_conn, uint32 err);
|
||||||
|
bool websock_rx_data(TCP_SERV_CONN *ts_conn);
|
||||||
|
err_t websock_tx_frame(TCP_SERV_CONN *ts_conn, uint32 opcode, uint8 *raw_data, uint32 raw_len);
|
||||||
|
|
||||||
|
#endif // WEBSOCKET_ENA
|
||||||
|
#endif /* _WEB_WEBSOCKET_H_ */
|
245
RTLGDB/Project/web/websock.c
Normal file
245
RTLGDB/Project/web/websock.c
Normal file
|
@ -0,0 +1,245 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* FileName: websock.c
|
||||||
|
* Description: websocket for web ESP8266
|
||||||
|
* Author: PV`
|
||||||
|
* (c) PV` 2016
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "user_config.h"
|
||||||
|
#ifdef WEBSOCKET_ENA
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
#include "web_utils.h" // base64encode()
|
||||||
|
#include "web_srv.h"
|
||||||
|
//#include "phy/phy.h"
|
||||||
|
#include "device_lock.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "websock.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
#include "hal_crypto.h"
|
||||||
|
|
||||||
|
// HTTP/1.1 101 Web Socket Protocol Handshake\r\n
|
||||||
|
const uint8 WebSocketHTTPOkKey[] ICACHE_RODATA_ATTR = "HTTP/1.1 101 Switching Protocols\r\nAccess-Control-Allow-Origin: *\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n";
|
||||||
|
const uint8 WebSocketAddKey[] ICACHE_RODATA_ATTR = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||||||
|
const uint8 *HTTPUpgrade = "Upgrade:";
|
||||||
|
const uint8 *HTTPwebsocket = "websocket";
|
||||||
|
const uint8 *HTTPSecWebSocketKey = "Sec-WebSocket-Key:";
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// WebSocketAcceptKey()
|
||||||
|
// 1) взять строковое значение из заголовка Sec-WebSocket-Key и объединить со
|
||||||
|
// строкой 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
|
||||||
|
// 2) вычислить бинарный хеш SHA-1 (бинарная строка из 20 символов) от полученной
|
||||||
|
// в первом пункте строки
|
||||||
|
// 3) закодировать хеш в Base64
|
||||||
|
// skey[24+36]:'dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
|
||||||
|
// cha:'b37a4f2cc0624f1690f64606cf385945b2bec4ea'
|
||||||
|
// key[28]:'s3pPLMBiTxaQ9kYGzzhZRbK+xOo='
|
||||||
|
//=============================================================================
|
||||||
|
uint8 buff[maxsizeWebSocketKey + sizeWebSocketAddKey]; // [68]
|
||||||
|
bool ICACHE_FLASH_ATTR WebSocketAcceptKey(uint8* dkey, uint8* skey)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
bool ret = false;
|
||||||
|
uint8 keybuf[CRYPTO_SHA1_DIGEST_LENGTH];
|
||||||
|
uint8 * buff = os_malloc(maxsizeWebSocketKey + sizeWebSocketAddKey);
|
||||||
|
if(buff) {
|
||||||
|
while(skey[len] >= '+' && len < maxsizeWebSocketKey) {
|
||||||
|
buff[len] = skey[len];
|
||||||
|
len++;
|
||||||
|
};
|
||||||
|
if(len > minsizeWebSocketKey) {
|
||||||
|
rtl_memcpy(&buff[len], WebSocketAddKey, sizeWebSocketAddKey+1);
|
||||||
|
device_mutex_lock(RT_DEV_LOCK_CRYPTO);
|
||||||
|
rtl_crypto_sha1(buff, len + sizeWebSocketAddKey, keybuf);
|
||||||
|
device_mutex_unlock(RT_DEV_LOCK_CRYPTO);
|
||||||
|
// rtl_cryptoEngine_info();
|
||||||
|
len = base64encode(dkey, FileNameSize, keybuf, CRYPTO_SHA1_DIGEST_LENGTH);
|
||||||
|
#if DEBUGSOO > 2
|
||||||
|
os_printf("\ncha:'");
|
||||||
|
print_hex_dump(keybuf, CRYPTO_SHA1_DIGEST_LENGTH, '\0');
|
||||||
|
os_printf("'\n");
|
||||||
|
os_printf("key[%u]:'%s'\n", len, dkey);
|
||||||
|
#endif
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
os_free(buff);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// websock_mask() размаскирование блока
|
||||||
|
//=============================================================================
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
WebsocketMask(WS_FRSTAT *ws, uint8 *raw_data, uint32 raw_len)
|
||||||
|
{
|
||||||
|
uint32 i, x = ws->cur_len;
|
||||||
|
#if DEBUGSOO > 3
|
||||||
|
os_printf("mask[%u]%u ", raw_len, x);
|
||||||
|
#endif
|
||||||
|
for (i = 0; i < raw_len; i++) {
|
||||||
|
raw_data[i] ^= ws->mask.uc[x++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// websock_head() разбор заголовка
|
||||||
|
//=============================================================================
|
||||||
|
uint32 ICACHE_FLASH_ATTR
|
||||||
|
WebsocketHead(WS_FRSTAT *ws, uint8 *raw_data, uint32 raw_len)
|
||||||
|
{
|
||||||
|
// определить размер заголовка фрейма
|
||||||
|
uint32 head_len = 2;
|
||||||
|
if(raw_len < head_len) return 0; // докачивать
|
||||||
|
uint32 data_len = raw_data[1] & WS_SIZE1_BITS;
|
||||||
|
if(data_len == 127) head_len = 10;
|
||||||
|
else if(data_len == 126) head_len = 4;
|
||||||
|
if(raw_data[1] & WS_MASK_FLG) head_len += 4;
|
||||||
|
if(raw_len < head_len) return 0; // докачивать
|
||||||
|
ws->head_len = head_len;
|
||||||
|
ws->cur_len = 0;
|
||||||
|
ws->flg = 0;
|
||||||
|
data_len = raw_data[1] & WS_SIZE1_BITS;
|
||||||
|
if(data_len >= 126) {
|
||||||
|
if(data_len == 127) {
|
||||||
|
uint32 i;
|
||||||
|
for(i = 3; i < 6; i++) {
|
||||||
|
if(raw_data[i] != 0) {
|
||||||
|
ws->status = sw_frs_close;
|
||||||
|
ws->frame_len = 0;
|
||||||
|
return WS_CLOSE_MESSAGE_TOO_BIG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data_len = (raw_data[6] << 24) | (raw_data[7] << 16) | (raw_data[8] << 8) | raw_data[9];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data_len = (raw_data[2] << 8) | raw_data[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(raw_data[1] & WS_MASK_FLG) {
|
||||||
|
ws->flg |= WS_FLG_MASK;
|
||||||
|
ws->mask.uc[0] = raw_data[head_len-4];
|
||||||
|
ws->mask.uc[1] = raw_data[head_len-3];
|
||||||
|
ws->mask.uc[2] = raw_data[head_len-2];
|
||||||
|
ws->mask.uc[3] = raw_data[head_len-1];
|
||||||
|
}
|
||||||
|
// else ws->mask = 0;
|
||||||
|
uint8 opcode = raw_data[0] & WS_OPCODE_BITS;
|
||||||
|
switch(opcode) {
|
||||||
|
case WS_OPCODE_PING: // эхо - дублировать прием
|
||||||
|
raw_data[0] &= ~WS_FRAGMENT_FIN;
|
||||||
|
raw_data[0] |= WS_OPCODE_PONG;
|
||||||
|
ws->status = sw_frs_pong;
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
case WS_OPCODE_PONG: // эхо - дублировать прием
|
||||||
|
ws->status = sw_frs_ping;
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
case WS_OPCODE_CONTINUE: // продолжить
|
||||||
|
if(ws->status == sw_frs_pong) {
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else ws->frame_len += data_len;
|
||||||
|
break;
|
||||||
|
case WS_OPCODE_CLOSE: //
|
||||||
|
ws->status = sw_frs_close;
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
case WS_OPCODE_TEXT:
|
||||||
|
ws->status = sw_frs_text;
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
case WS_OPCODE_BINARY:
|
||||||
|
ws->status = sw_frs_binary;
|
||||||
|
ws->frame_len = data_len;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ws->status = sw_frs_close;
|
||||||
|
ws->frame_len = 0;
|
||||||
|
return WS_CLOSE_WRONG_TYPE;
|
||||||
|
}
|
||||||
|
// uint32 len = mMIN(raw_len - head_len, data_len);
|
||||||
|
// if((ws->flg & WS_FLG_MASK) != 0) websock_mask(ws, &raw_data[head_len], mMIN(raw_len - head_len, len));
|
||||||
|
// ws->cur_len += len;
|
||||||
|
if((raw_data[0] & WS_FRAGMENT_FIN) != 0) { // конец - данные на обработку
|
||||||
|
ws->flg |= WS_FLG_FIN;
|
||||||
|
}
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws#%02xrx[%u] ", raw_data[0], data_len);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
/*
|
||||||
|
if(data_len + head_len <= raw_len) { // весь пакет уже в буфере?
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0; // докачивать */
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// websock_tx_frame() - передача фрейма
|
||||||
|
//=============================================================================
|
||||||
|
err_t ICACHE_FLASH_ATTR
|
||||||
|
WebsocketTxFrame(TCP_SERV_CONN *ts_conn, uint32 opcode, uint8 *raw_data, uint32 raw_len)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
uint8 uc[8];
|
||||||
|
uint16 uw[4];
|
||||||
|
uint32 ud[2];
|
||||||
|
}head;
|
||||||
|
union {
|
||||||
|
uint8 uc[4];
|
||||||
|
uint16 uw[2];
|
||||||
|
uint32 ud;
|
||||||
|
}mask;
|
||||||
|
if(raw_data == NULL) raw_len = 0;
|
||||||
|
head.ud[0] = opcode;
|
||||||
|
uint32 head_len;
|
||||||
|
if(raw_len > 126) {
|
||||||
|
head.uc[1] = 126;
|
||||||
|
head.uc[2] = raw_len>>8;
|
||||||
|
head.uc[3] = raw_len;
|
||||||
|
head_len = 4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
head.uc[1] = raw_len;
|
||||||
|
head_len = 2;
|
||||||
|
};
|
||||||
|
if(opcode & (WS_MASK_FLG << 8)) {
|
||||||
|
mask.ud ^= rand();
|
||||||
|
head.uc[1] |= WS_MASK_FLG;
|
||||||
|
head.uc[head_len] = mask.uc[0];
|
||||||
|
head.uc[head_len+1] = mask.uc[1];
|
||||||
|
head.uc[head_len+2] = mask.uc[2];
|
||||||
|
head.uc[head_len+3] = mask.uc[3];
|
||||||
|
head_len += 4;
|
||||||
|
}
|
||||||
|
uint32 len = tcp_sndbuf(ts_conn->pcb);
|
||||||
|
err_t err = 1; // ERR_BUF;
|
||||||
|
if(len >= raw_len + head_len) {
|
||||||
|
#if DEBUGSOO > 1
|
||||||
|
os_printf("ws#%02xtx[%u] ", head.uc[0], raw_len);
|
||||||
|
#endif
|
||||||
|
ts_conn->flag.nagle_disabled = 0;
|
||||||
|
tcp_nagle_disable(ts_conn->pcb);
|
||||||
|
err = tcpsrv_int_sent_data(ts_conn, head.uc, head_len);
|
||||||
|
ts_conn->flag.nagle_disabled = 1;
|
||||||
|
if(err == ERR_OK && raw_len != 0) {
|
||||||
|
if(opcode & (WS_MASK_FLG << 8)) {
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < raw_len; i++) {
|
||||||
|
raw_data[i] ^= mask.uc[i & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = tcpsrv_int_sent_data(ts_conn, raw_data, raw_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // WEBSOCKET_ENA
|
||||||
|
|
110
RTLGDB/Project/web/websock.h
Normal file
110
RTLGDB/Project/web/websock.h
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* File: websock.h
|
||||||
|
* Small WEB server ESP8266EX
|
||||||
|
* Author: PV`
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WEBSOCK_H_
|
||||||
|
#define _WEBSOCK_H_
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "tcpsrv/tcp_srv_conn.h"
|
||||||
|
|
||||||
|
//#define WS_NONBLOCK 0x02
|
||||||
|
|
||||||
|
/*
|
||||||
|
0 1 2 3
|
||||||
|
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
|
||||||
|
+-+-+-+-+-------+-+-------------+-------------------------------+
|
||||||
|
|F|R|R|R| опкод |М| Длина тела | Расширенная длина тела |
|
||||||
|
|I|S|S|S|(4бита)|А| (7бит) | (2 байта) |
|
||||||
|
|N|V|V|V| |С| |(если длина тела==126 или 127) |
|
||||||
|
| |1|2|3| |К| | |
|
||||||
|
| | | | | |А| | |
|
||||||
|
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|
||||||
|
|4 5 6 7 |
|
||||||
|
| Продолжение расширенной длины тела, если длина тела = 127 |
|
||||||
|
+ - - - - - - - - - - - - - - - +-------------------------------+
|
||||||
|
|8 9 10 11 |
|
||||||
|
| | Ключ маски, если МАСКА = 1 |
|
||||||
|
+-------------------------------+-------------------------------+
|
||||||
|
|12 13 14 15 |
|
||||||
|
| Ключ маски (продолжение) | Данные фрейма ("тело") |
|
||||||
|
+-------------------------------- - - - - - - - - - - - - - - - +
|
||||||
|
|16 17 18 19 |
|
||||||
|
: Данные продолжаются ... :
|
||||||
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
||||||
|
| Данные продолжаются ... |
|
||||||
|
+---------------------------------------------------------------+
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WS_FRAGMENT_FIN 0x80
|
||||||
|
//#define WS_RSVD_BITS (7 << 4)
|
||||||
|
#define WS_OPCODE_BITS 0x7F
|
||||||
|
#define WS_OPCODE_CONTINUE 0x0 // фрейм-продолжение для фрагментированного сообщения
|
||||||
|
#define WS_OPCODE_TEXT 0x1 // текстовый фрейм
|
||||||
|
#define WS_OPCODE_BINARY 0x2 // двоичный фрейм
|
||||||
|
#define WS_OPCODE_CLOSE 0x8 // закрытие соединения
|
||||||
|
#define WS_OPCODE_PING 0x9
|
||||||
|
#define WS_OPCODE_PONG 0xa
|
||||||
|
#define WS_MASK_FLG (1 << 7)
|
||||||
|
#define WS_SIZE1_BITS 0x7F
|
||||||
|
|
||||||
|
|
||||||
|
#define WS_CLOSE_NORMAL 1000
|
||||||
|
#define WS_CLOSE_GOING_AWAY 1001
|
||||||
|
#define WS_CLOSE_PROTOCOL_ERROR 1002
|
||||||
|
#define WS_CLOSE_NOT_ALLOWED 1003
|
||||||
|
#define WS_CLOSE_RESERVED 1004
|
||||||
|
#define WS_CLOSE_NO_CODE 1005
|
||||||
|
#define WS_CLOSE_DIRTY 1006
|
||||||
|
#define WS_CLOSE_WRONG_TYPE 1007
|
||||||
|
#define WS_CLOSE_POLICY_VIOLATION 1008
|
||||||
|
#define WS_CLOSE_MESSAGE_TOO_BIG 1009
|
||||||
|
#define WS_CLOSE_UNEXPECTED_ERROR 1011
|
||||||
|
|
||||||
|
typedef struct _WS_FRSTAT
|
||||||
|
{
|
||||||
|
uint32 frame_len; // размер данных в заголовке фрейма
|
||||||
|
uint32 cur_len; // счетчик обработанных данных
|
||||||
|
union {
|
||||||
|
unsigned char uc[4];
|
||||||
|
unsigned int ud;
|
||||||
|
} mask; // маска принимаемых данных
|
||||||
|
uint8 status;
|
||||||
|
uint8 flg;
|
||||||
|
uint8 head_len;
|
||||||
|
} WS_FRSTAT; // __attribute__((packed))
|
||||||
|
|
||||||
|
#define WS_FLG_MASK 0x01
|
||||||
|
#define WS_FLG_FIN 0x02
|
||||||
|
#define WS_FLG_CLOSE 0x04 // уже передано WS_CLOSE
|
||||||
|
|
||||||
|
enum WS_FRAME_STATE {
|
||||||
|
sw_frs_none = 0,
|
||||||
|
sw_frs_text,
|
||||||
|
sw_frs_binary,
|
||||||
|
sw_frs_close,
|
||||||
|
sw_frs_ping,
|
||||||
|
sw_frs_pong
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const uint8 WebSocketHTTPOkKey[]; // ICACHE_RODATA_ATTR = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept:%s\r\n\r\n"
|
||||||
|
extern const uint8 WebSocketAddKey[]; // ICACHE_RODATA_ATTR = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||||||
|
#define sizeWebSocketAddKey 36
|
||||||
|
#define maxsizeWebSocketKey 64
|
||||||
|
#define minsizeWebSocketKey 8
|
||||||
|
extern const uint8 *HTTPUpgrade; // = "Upgrade:";
|
||||||
|
#define sizeHTTPUpgrade 8
|
||||||
|
extern const uint8 *HTTPwebsocket; // = "websocket";
|
||||||
|
#define sizeHTTPwebsocket 9
|
||||||
|
extern const uint8 *HTTPSecWebSocketKey; // = "Sec-WebSocket-Key:";
|
||||||
|
#define sizeHTTPSecWebSocketKey 18
|
||||||
|
|
||||||
|
|
||||||
|
bool WebSocketAcceptKey(uint8* dkey, uint8* skey);
|
||||||
|
void WebsocketMask(WS_FRSTAT *ws, uint8 *raw_data, uint32 raw_len);
|
||||||
|
uint32 WebsocketHead(WS_FRSTAT *ws, uint8 *raw_data, uint32 raw_len);
|
||||||
|
err_t WebsocketTxFrame(TCP_SERV_CONN *ts_conn, uint32 opcode, uint8 *raw_data, uint32 raw_len);
|
||||||
|
|
||||||
|
#endif /* _WEBSOCK_H_ */
|
483
RTLGDB/Project/webfs/webfs.c
Normal file
483
RTLGDB/Project/webfs/webfs.c
Normal file
|
@ -0,0 +1,483 @@
|
||||||
|
/*********************************************************************
|
||||||
|
* WEBFS.c
|
||||||
|
* RTL871x Flash WEB File System v1.0
|
||||||
|
********************************************************************/
|
||||||
|
#include "autoconf.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "diag.h"
|
||||||
|
#include <osdep_api.h>
|
||||||
|
#include <osdep_service.h>
|
||||||
|
#include "device_lock.h"
|
||||||
|
#include "flash_api.h"
|
||||||
|
//#include "flash_eep.h"
|
||||||
|
|
||||||
|
#include "webfs/webfs.h"
|
||||||
|
#include "rtl8195a/rtl_libc.h"
|
||||||
|
#include "esp_comp.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define WEBFS_CODE_ATTR
|
||||||
|
#define WEBFS_DATA_ATTR
|
||||||
|
|
||||||
|
#define web_mutex_lock() device_mutex_lock(RT_DEV_LOCK_FLASH)
|
||||||
|
#define web_mutex_unlock() device_mutex_unlock(RT_DEV_LOCK_FLASH)
|
||||||
|
|
||||||
|
// Supports long file names to 64 characters
|
||||||
|
#define MAX_FILE_NAME_LEN 64 // VarNameSize
|
||||||
|
uint32 disk_base_addr WEBFS_DATA_ATTR;
|
||||||
|
#define WEBFS_HEAD_ADDR disk_base_addr
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Structure:
|
||||||
|
*
|
||||||
|
* [F][W][E][B][uint8 Ver Hi][uint8 Ver Lo] // заголовок диска
|
||||||
|
* [uint16 Number of Files] // кол-во файлов на диске
|
||||||
|
* [Name Hash 0]...[Name Hash N] // uint16 типа хеш на каждое имя файла
|
||||||
|
* [File Record 0]...[File Record N] // uint32 указатели на адреса структур файлов, относительно начала диска
|
||||||
|
*
|
||||||
|
* File Record Structure:
|
||||||
|
* [uint32 Len] размер файла с заголовком
|
||||||
|
* [uint16 HeadLen] длина заголовка, включая размер, флаг, имя (адрес данных - адрес позиции len)
|
||||||
|
* [uint16 Flags] бит 0 =1 - файл сжат GZIP, бит 1 = 1 - парсится - имеет динамические переменные
|
||||||
|
* [File Name, 0] Имя файла с "СИ" терминатором
|
||||||
|
* [File Data] данные файла
|
||||||
|
*
|
||||||
|
* Name hash (2 uint8s) is calculated as follows:
|
||||||
|
* hash = 0
|
||||||
|
* for each(uint8 in name)
|
||||||
|
* hash += uint8
|
||||||
|
* hash <<= 1
|
||||||
|
*
|
||||||
|
* Technically this means the hash only includes the
|
||||||
|
* final 15 characters of a name.
|
||||||
|
*
|
||||||
|
* String FileNmae Structure (1 to 64 uint8s):
|
||||||
|
* ["path/to/file.ext"][0x00]
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Current version is 1.0
|
||||||
|
*/
|
||||||
|
// Lock WEBFS access during the upgrade
|
||||||
|
volatile bool isWEBFSLocked WEBFS_DATA_ATTR;
|
||||||
|
// Track the WEBFS File Handles
|
||||||
|
// WEBFSStubs[0] is reserved for internal use (FAT access)
|
||||||
|
WEBFS_STUB WEBFSStubs[MAX_WEBFS_OPENFILES+1] WEBFS_DATA_ATTR; // + HANDLE = 0
|
||||||
|
// FAT record cache
|
||||||
|
WEBFS_FAT_RECORD fatCache WEBFS_DATA_ATTR;
|
||||||
|
// ID of currently loaded fatCache
|
||||||
|
static uint32 fatCacheID WEBFS_DATA_ATTR;
|
||||||
|
// Number of files in this WEBFS image
|
||||||
|
uint16 numFiles WEBFS_DATA_ATTR;
|
||||||
|
|
||||||
|
static void GetFATRecord(uint16 fatID);
|
||||||
|
static void WEBFS_Update(void);
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
Function:
|
||||||
|
void WEBFSInit(void)
|
||||||
|
Description:
|
||||||
|
Web Disk Init
|
||||||
|
*****************************************************************************/
|
||||||
|
void WEBFS_CODE_ATTR WEBFSInit(void)
|
||||||
|
{
|
||||||
|
disk_base_addr = WEBFS_base_addr();
|
||||||
|
os_memset((char *) &WEBFSStubs, 0xff, sizeof(WEBFSStubs));
|
||||||
|
// Validate the image and load numFiles
|
||||||
|
WEBFS_Update();
|
||||||
|
#if DEBUGSOO > 0
|
||||||
|
os_printf("\nDisk init: %d files, addr = %p\n", numFiles, disk_base_addr);
|
||||||
|
#endif
|
||||||
|
// тут надо расчет контрольки тела диска или другой контроль...
|
||||||
|
if(numFiles == 0) isWEBFSLocked = true;
|
||||||
|
else isWEBFSLocked = false;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function:
|
||||||
|
WEBFS_HANDLE WEBFSOpen(uint8* cFile)
|
||||||
|
|
||||||
|
Description:
|
||||||
|
Opens a file in the WEBFS2 file system.
|
||||||
|
|
||||||
|
Precondition:
|
||||||
|
None
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
cFile - a null terminated file name to open
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An WEBFS_HANDLE to the opened file if found, or WEBFS_INVALID_HANDLE
|
||||||
|
if the file could not be found or no free handles exist.
|
||||||
|
***************************************************************************/
|
||||||
|
WEBFS_HANDLE WEBFS_CODE_ATTR WEBFSOpen(uint8* cFile)
|
||||||
|
{
|
||||||
|
WEBFS_HANDLE hWEBFS;
|
||||||
|
uint16 nameHash;
|
||||||
|
int i, len = 0;
|
||||||
|
uint16 hashCache[16];
|
||||||
|
uint8 bufname[MAX_FILE_NAME_LEN];
|
||||||
|
uint8 *ptr;
|
||||||
|
|
||||||
|
// Make sure WEBFS is unlocked and we got a filename
|
||||||
|
if(*cFile == '\0' || isWEBFSLocked == true)
|
||||||
|
return WEBFS_INVALID_HANDLE;
|
||||||
|
|
||||||
|
// Calculate the name hash to speed up searching
|
||||||
|
for(nameHash = 0, ptr = cFile; *ptr != '\0'; ptr++)
|
||||||
|
{
|
||||||
|
nameHash += *ptr;
|
||||||
|
nameHash <<= 1;
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
// Find a free file handle to use
|
||||||
|
for(hWEBFS = 1; hWEBFS <= MAX_WEBFS_OPENFILES; hWEBFS++)
|
||||||
|
if(WEBFSStubs[hWEBFS].addr == WEBFS_INVALID) break;
|
||||||
|
if(hWEBFS == MAX_WEBFS_OPENFILES)
|
||||||
|
return WEBFS_INVALID_HANDLE;
|
||||||
|
// Read in hashes, and check remainder on a match. Store 8 in cache for performance
|
||||||
|
for(i = 0; i < numFiles; i++) {
|
||||||
|
// For new block of 8, read in data
|
||||||
|
if((i & 0x0F) == 0) {
|
||||||
|
WEBFSStubs[0].addr = 12 + i*2;
|
||||||
|
WEBFSStubs[0].bytesRem = 32;
|
||||||
|
WEBFSGetArray(0, (uint8*)hashCache, 32);
|
||||||
|
}
|
||||||
|
// If the hash matches, compare the full filename
|
||||||
|
if(hashCache[i&0x0F] == nameHash)
|
||||||
|
{
|
||||||
|
GetFATRecord(i);
|
||||||
|
// filename comparison
|
||||||
|
WEBFSStubs[0].addr = fatCache.string;
|
||||||
|
WEBFSStubs[0].bytesRem = MAX_FILE_NAME_LEN;
|
||||||
|
WEBFSGetArray(0, bufname, MAX_FILE_NAME_LEN);
|
||||||
|
if(os_strncmp(cFile, bufname, len) == 0) { // Filename matches, so return true
|
||||||
|
WEBFSStubs[hWEBFS].addr = fatCache.data;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem = fatCache.len;
|
||||||
|
WEBFSStubs[hWEBFS].fatID = i;
|
||||||
|
return hWEBFS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No file name matched, so return nothing
|
||||||
|
return WEBFS_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: void WEBFSClose(WEBFS_HANDLE hWEBFS)
|
||||||
|
Summary: Closes a file.
|
||||||
|
Returns: None
|
||||||
|
***************************************************************************/
|
||||||
|
void WEBFS_CODE_ATTR WEBFSClose(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
if(hWEBFS != 0 && hWEBFS <= MAX_WEBFS_OPENFILES)
|
||||||
|
WEBFSStubs[hWEBFS].addr = WEBFS_INVALID;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: uint16 WEBFSGetArray(WEBFS_HANDLE hWEBFS, uint8* cData, uint16 wLen)
|
||||||
|
Description: Reads a series of uint8s from a file.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters:
|
||||||
|
hWEBFS - the file handle from which to read
|
||||||
|
cData - where to store the uint8s that were read
|
||||||
|
wLen - how many uint8s to read
|
||||||
|
Returns:
|
||||||
|
The number of uint8s successfully read. If this is less than wLen,
|
||||||
|
an EOF occurred while attempting to read.
|
||||||
|
***************************************************************************/
|
||||||
|
uint16 WEBFS_CODE_ATTR WEBFSGetArray(WEBFS_HANDLE hWEBFS, uint8* cData, uint16 wLen)
|
||||||
|
{
|
||||||
|
// Make sure we're reading a valid address
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES) return 0;
|
||||||
|
|
||||||
|
// Determine how many we can actually read
|
||||||
|
if(wLen > WEBFSStubs[hWEBFS].bytesRem) wLen = WEBFSStubs[hWEBFS].bytesRem;
|
||||||
|
// Make sure we're reading a valid address
|
||||||
|
if(WEBFSStubs[hWEBFS].addr == WEBFS_INVALID || wLen == 0) return 0;
|
||||||
|
|
||||||
|
if(cData != NULL) {
|
||||||
|
|
||||||
|
// Read the data
|
||||||
|
web_mutex_lock();
|
||||||
|
// if(wLen < 16)
|
||||||
|
flash_stream_read(&flashobj, WEBFSStubs[hWEBFS].addr + WEBFS_HEAD_ADDR, wLen, cData);
|
||||||
|
// else flash_burst_read(&flashobj, WEBFSStubs[hWEBFS].addr + WEBFS_HEAD_ADDR, wLen, cData);
|
||||||
|
web_mutex_unlock();
|
||||||
|
|
||||||
|
// if(spi_flash_read(WEBFSStubs[hWEBFS].addr+WEBFS_HEAD_ADDR, cData, wLen) != SPI_FLASH_RESULT_OK)
|
||||||
|
// return 0;
|
||||||
|
};
|
||||||
|
WEBFSStubs[hWEBFS].addr += wLen;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem -= wLen;
|
||||||
|
return wLen;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function:
|
||||||
|
bool WEBFSSeek(WEBFS_HANDLE hWEBFS, uint32 dwOffset, WEBFS_SEEK_MODE tMode)
|
||||||
|
Description: Moves the current read pointer to a new location.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters:
|
||||||
|
hWEBFS - the file handle to seek with
|
||||||
|
dwOffset - offset from the specified position in the specified direction
|
||||||
|
tMode - one of the WEBFS_SEEK_MODE constants
|
||||||
|
Returns:
|
||||||
|
true - the seek was successful
|
||||||
|
false - either the new location or the handle itself was invalid
|
||||||
|
***************************************************************************/
|
||||||
|
bool WEBFS_CODE_ATTR WEBFSSeek(WEBFS_HANDLE hWEBFS, uint32 dwOffset, WEBFS_SEEK_MODE tMode)
|
||||||
|
{
|
||||||
|
uint32 temp;
|
||||||
|
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch(tMode)
|
||||||
|
{
|
||||||
|
// Seek offset uint8s from start
|
||||||
|
case WEBFS_SEEK_START:
|
||||||
|
temp = WEBFSGetSize(hWEBFS);
|
||||||
|
if(dwOffset > temp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
WEBFSStubs[hWEBFS].addr = WEBFSGetStartAddr(hWEBFS) + dwOffset;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem = temp - dwOffset;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Seek forwards offset uint8s
|
||||||
|
case WEBFS_SEEK_FORWARD:
|
||||||
|
if(dwOffset > WEBFSStubs[hWEBFS].bytesRem)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
WEBFSStubs[hWEBFS].addr += dwOffset;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem -= dwOffset;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Seek backwards offset uint8s
|
||||||
|
case WEBFS_SEEK_REWIND:
|
||||||
|
temp = WEBFSGetStartAddr(hWEBFS);
|
||||||
|
if(WEBFSStubs[hWEBFS].addr < temp + dwOffset)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
WEBFSStubs[hWEBFS].addr -= dwOffset;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem += dwOffset;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Seek so that offset uint8s remain in file
|
||||||
|
case WEBFS_SEEK_END:
|
||||||
|
temp = WEBFSGetSize(hWEBFS);
|
||||||
|
if(dwOffset > temp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
WEBFSStubs[hWEBFS].addr = WEBFSGetEndAddr(hWEBFS) - dwOffset;
|
||||||
|
WEBFSStubs[hWEBFS].bytesRem = dwOffset;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: static void GetFATRecord(uint16 fatID)
|
||||||
|
Description: Loads the FAT record for a specified handle.
|
||||||
|
Precondition: None
|
||||||
|
Parameters: fatID - the ID of the file whose FAT is to be loaded
|
||||||
|
Returns: None
|
||||||
|
Remarks: The FAT record will be stored in fatCache.
|
||||||
|
***************************************************************************/
|
||||||
|
static void WEBFS_CODE_ATTR GetFATRecord(uint16 fatID)
|
||||||
|
{
|
||||||
|
WEBFS_FHEADER fhead;
|
||||||
|
if(fatID == fatCacheID || fatID >= numFiles) return;
|
||||||
|
// Read the FAT record to the cache
|
||||||
|
WEBFSStubs[0].bytesRem = sizeof(fhead) + 4;
|
||||||
|
WEBFSStubs[0].addr = 12 + numFiles*2 + fatID *4;
|
||||||
|
WEBFSGetArray(0, (uint8 *)&fatCache.data, 4);
|
||||||
|
WEBFSStubs[0].addr = fatCache.data;
|
||||||
|
WEBFSGetArray(0, (uint8 *)&fhead, sizeof(fhead));
|
||||||
|
fatCache.len = fhead.blksize - fhead.headlen;
|
||||||
|
fatCache.string = fatCache.data + 8;
|
||||||
|
fatCache.flags = fhead.flags;
|
||||||
|
fatCache.data = fatCache.data + fhead.headlen;
|
||||||
|
fatCacheID = fatID;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: uint16 WEBFSGetFlags(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Reads a file's flags.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle from which to read the metadata
|
||||||
|
Returns: The flags that were associated with the file
|
||||||
|
***************************************************************************/
|
||||||
|
uint16 WEBFS_CODE_ATTR WEBFSGetFlags(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
//move to the point for reading
|
||||||
|
GetFATRecord(WEBFSStubs[hWEBFS].fatID);
|
||||||
|
return fatCache.flags;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: uint32 WEBFSGetSize(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Reads the size of a file.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle from which to read the metadata
|
||||||
|
Returns: The size that was read as a uint32
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFSGetSize(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Move to the point for reading
|
||||||
|
GetFATRecord(WEBFSStubs[hWEBFS].fatID);
|
||||||
|
return fatCache.len;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: uint32 WEBFSGetBytesRem(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Determines how many uint8s remain to be read.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle from which to read the metadata
|
||||||
|
Returns: The number of uint8s remaining in the file as a uint32
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFSGetBytesRem(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return 0;
|
||||||
|
return WEBFSStubs[hWEBFS].bytesRem;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: WEBFS_PTR WEBFSGetStartAddr(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Reads the starting address of a file.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle from which to read the metadata
|
||||||
|
Returns: The starting address of the file in the WEBFS image
|
||||||
|
***************************************************************************/
|
||||||
|
WEBFS_PTR WEBFS_CODE_ATTR WEBFSGetStartAddr(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return 0;
|
||||||
|
// Move to the point for reading
|
||||||
|
GetFATRecord(WEBFSStubs[hWEBFS].fatID);
|
||||||
|
return fatCache.data;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: WEBFS_PTR WEBFSGetEndAddr(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Determines the ending address of a file.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle from which to read the metadata
|
||||||
|
Returns: The address just after the file ends (start address of next file)
|
||||||
|
***************************************************************************/
|
||||||
|
WEBFS_PTR WEBFS_CODE_ATTR WEBFSGetEndAddr(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return WEBFS_INVALID;
|
||||||
|
// Move to the point for reading
|
||||||
|
GetFATRecord(WEBFSStubs[hWEBFS].fatID);
|
||||||
|
return fatCache.data + fatCache.len;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: bool WEBFSGetFilename(WEBFS_HANDLE hWEBFS, uint8* cName, uint16 wLen)
|
||||||
|
Description: Reads the file name of a file that is already open.
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters:
|
||||||
|
hWEBFS - the file handle from which to determine the file name
|
||||||
|
cName - where to store the name of the file
|
||||||
|
wLen - the maximum length of data to store in cName
|
||||||
|
Returns:
|
||||||
|
true - the file name was successfully located
|
||||||
|
false - the file handle provided is not currently open
|
||||||
|
***************************************************************************/
|
||||||
|
bool WEBFS_CODE_ATTR WEBFSGetFilename(WEBFS_HANDLE hWEBFS, uint8* cName, uint16 wLen)
|
||||||
|
{
|
||||||
|
uint32 addr;
|
||||||
|
|
||||||
|
// Make sure a valid file is open
|
||||||
|
if(hWEBFS > MAX_WEBFS_OPENFILES || WEBFSStubs[hWEBFS].addr == WEBFS_INVALID)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Move to the point for reading
|
||||||
|
GetFATRecord(WEBFSStubs[hWEBFS].fatID);
|
||||||
|
addr = fatCache.string;
|
||||||
|
WEBFSStubs[0].addr = addr;
|
||||||
|
WEBFSStubs[0].bytesRem = 255;
|
||||||
|
|
||||||
|
// Read the value and return
|
||||||
|
WEBFSGetArray(0, cName, wLen);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: uint32 WEBFSGetPosition(WEBFS_HANDLE hWEBFS)
|
||||||
|
Description: Determines the current position in the file
|
||||||
|
Precondition: The file handle referenced by hWEBFS is already open.
|
||||||
|
Parameters: hWEBFS - the file handle for which to determine position
|
||||||
|
Returns: The position in the file as a uint32 (or WEBFS_PTR)
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFSGetPosition(WEBFS_HANDLE hWEBFS)
|
||||||
|
{
|
||||||
|
return WEBFSStubs[hWEBFS].addr - WEBFSGetStartAddr(hWEBFS);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
Function: void WEBFS_Update(void)
|
||||||
|
Summary: Validates the WEBFS Image
|
||||||
|
Description: Verifies that the WEBFS image is valid, and reads the number of
|
||||||
|
available files from the image header. This function is called on
|
||||||
|
boot, and again after any image is written.
|
||||||
|
Parameters: None
|
||||||
|
Returns: None
|
||||||
|
***************************************************************************/
|
||||||
|
static void WEBFS_CODE_ATTR WEBFS_Update(void)
|
||||||
|
{
|
||||||
|
// Update numFiles
|
||||||
|
WEBFS_DISK_HEADER dhead;
|
||||||
|
WEBFSStubs[0].addr = 0;
|
||||||
|
WEBFSStubs[0].bytesRem = sizeof(dhead);
|
||||||
|
WEBFSGetArray(0, (uint8*)&dhead, sizeof(dhead));
|
||||||
|
if(dhead.id == WEBFS_DISK_ID && dhead.ver == WEBFS_DISK_VER) { //"FWEB"1,0 ?
|
||||||
|
numFiles = dhead.numFiles;
|
||||||
|
}
|
||||||
|
else numFiles = 0;
|
||||||
|
fatCacheID = WEBFS_INVALID_FAT;
|
||||||
|
}
|
||||||
|
/****************************************************************************
|
||||||
|
* WEBFS_max_size()
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFS_max_size(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
uint32 size = spi_flash_real_size();
|
||||||
|
if(size > WEBFS_DISK_ADDR_BIGFLASH) size -= WEBFS_DISK_ADDR_BIGFLASH;
|
||||||
|
else {
|
||||||
|
size = WEBFS_DISK_ADDR_MINFLASH_END - WEBFS_DISK_ADDR_MINFLASH_START;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
*/
|
||||||
|
return spi_flash_real_size() - WEBFS_DISK_FADDR;
|
||||||
|
}
|
||||||
|
/****************************************************************************
|
||||||
|
* WEBFS_size()
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFS_curent_size(void)
|
||||||
|
{
|
||||||
|
uint32 size = 0;
|
||||||
|
web_mutex_lock();
|
||||||
|
if(numFiles) flash_read_word(&flashobj, disk_base_addr + 8, (uint32_t *) &size);
|
||||||
|
web_mutex_unlock();
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
/****************************************************************************
|
||||||
|
* WEBFS_size()
|
||||||
|
***************************************************************************/
|
||||||
|
uint32 WEBFS_CODE_ATTR WEBFS_base_addr(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
uint32 webfs_faddr;
|
||||||
|
if(flash_get_size(&flashobj) <= WEBFS_DISK_ADDR_BIGFLASH) webfs_faddr = WEBFS_DISK_ADDR_MINFLASH_START;
|
||||||
|
else webfs_faddr = WEBFS_DISK_ADDR_BIGFLASH;
|
||||||
|
return webfs_faddr;
|
||||||
|
*/
|
||||||
|
return WEBFS_DISK_FADDR;
|
||||||
|
}
|
116
RTLGDB/Project/webfs/webfs.h
Normal file
116
RTLGDB/Project/webfs/webfs.h
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* FileName: WEBFS.h
|
||||||
|
* Basis of MPFS2 (Microchip File System).
|
||||||
|
* WEBFS has its differences Based.
|
||||||
|
*
|
||||||
|
********************************************************************/
|
||||||
|
#ifndef __WEBFS1_H
|
||||||
|
#define __WEBFS1_H
|
||||||
|
|
||||||
|
#include "flash_eep.h"
|
||||||
|
|
||||||
|
extern uint32 _irom0_text_end;
|
||||||
|
|
||||||
|
#define WEBFS_DISK_FADDR 0x0D0000
|
||||||
|
|
||||||
|
#define WEBFS_DISK_ID 0x42455746 // заголовок WEBFiles.bin
|
||||||
|
#define WEBFS_DISK_VER 0x0001 // версия
|
||||||
|
|
||||||
|
#define MAX_FILE_NAME_SIZE 64
|
||||||
|
|
||||||
|
#ifndef MAX_WEBFS_OPENFILES
|
||||||
|
#define MAX_WEBFS_OPENFILES 31
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WEBFS_FLAG_ISZIPPED 0x0001 // Indicates a file is compressed with GZIP compression
|
||||||
|
#define WEBFS_FLAG_HASINDEX 0x0002 // Indicates a file has an associated index of dynamic variables
|
||||||
|
#define WEBFS_INVALID 0xffffffff // Indicates a position pointer is invalid
|
||||||
|
#define WEBFS_INVALID_FAT 0xffff // Indicates an invalid FAT cache
|
||||||
|
typedef uint32 WEBFS_PTR; // WEBFS Pointers are currently uint32s
|
||||||
|
typedef uint8 WEBFS_HANDLE; // WEBFS Handles are currently stored as uint8s
|
||||||
|
#define WEBFS_INVALID_HANDLE 0xff // Indicates that a handle is not valid
|
||||||
|
|
||||||
|
|
||||||
|
// Stores each file handle's information
|
||||||
|
// Handles are free when addr = WEBFS_INVALID
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
WEBFS_PTR addr; // Current address in the file system
|
||||||
|
uint32 bytesRem; // How many uint8s remain in this file
|
||||||
|
#ifdef USE_MAX_IRAM
|
||||||
|
uint32 fatID; // ID of which file in the FAT was accessed
|
||||||
|
#else
|
||||||
|
uint16 fatID; // ID of which file in the FAT was accessed
|
||||||
|
#endif
|
||||||
|
} WEBFS_STUB;
|
||||||
|
|
||||||
|
// Indicates the method for WEBFSSeek
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
WEBFS_SEEK_START = 0, // Seek forwards from the front of the file
|
||||||
|
WEBFS_SEEK_END, // Seek backwards from the end of the file
|
||||||
|
WEBFS_SEEK_FORWARD, // Seek forward from the current position
|
||||||
|
WEBFS_SEEK_REWIND // See backwards from the current position
|
||||||
|
} WEBFS_SEEK_MODE;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
uint32 id;
|
||||||
|
uint16 ver;
|
||||||
|
uint16 numFiles;
|
||||||
|
uint32 disksize;
|
||||||
|
} WEBFS_DISK_HEADER ;
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
uint32 blksize; // Length of file data - headlen
|
||||||
|
uint16 headlen; // headlen (Length of File Name + 0)
|
||||||
|
uint16 flags; // Flags for this file
|
||||||
|
} WEBFS_FHEADER;
|
||||||
|
|
||||||
|
// Stores the data for an WEBFS1 FAT record
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32 string; // Pointer to the file name
|
||||||
|
uint32 data; // Address of the file data
|
||||||
|
uint32 len; // Length of file data
|
||||||
|
#ifdef USE_MAX_IRAM
|
||||||
|
uint32 flags; // Flags for this file
|
||||||
|
#else
|
||||||
|
uint16 flags; // Flags for this file
|
||||||
|
#endif
|
||||||
|
} WEBFS_FAT_RECORD ;
|
||||||
|
|
||||||
|
|
||||||
|
void WEBFSInit(void);
|
||||||
|
WEBFS_HANDLE WEBFSOpen(uint8* cFile);
|
||||||
|
void WEBFSClose(WEBFS_HANDLE hWEBFS);
|
||||||
|
|
||||||
|
uint16 WEBFSGetArray(WEBFS_HANDLE hWEBFS, uint8* cData, uint16 wLen);
|
||||||
|
|
||||||
|
uint16 WEBFSGetFlags(WEBFS_HANDLE hWEBFS);
|
||||||
|
uint32 WEBFSGetSize(WEBFS_HANDLE hWEBFS);
|
||||||
|
uint32 WEBFSGetBytesRem(WEBFS_HANDLE hWEBFS);
|
||||||
|
WEBFS_PTR WEBFSGetStartAddr(WEBFS_HANDLE hWEBFS);
|
||||||
|
WEBFS_PTR WEBFSGetEndAddr(WEBFS_HANDLE hWEBFS);
|
||||||
|
bool WEBFSGetFilename(WEBFS_HANDLE hWEBFS, uint8* cName, uint16 wLen);
|
||||||
|
uint32 WEBFSGetPosition(WEBFS_HANDLE hWEBFS);
|
||||||
|
uint32 WEBFS_max_size(void);
|
||||||
|
uint32 WEBFS_curent_size(void);
|
||||||
|
uint32 WEBFS_base_addr(void);
|
||||||
|
|
||||||
|
#ifdef USE_MAX_IRAM
|
||||||
|
extern int isWEBFSLocked; // Lock WEBFS access during the upgrade
|
||||||
|
extern uint32 numFiles;
|
||||||
|
#else
|
||||||
|
extern volatile bool isWEBFSLocked; // Lock WEBFS access during the upgrade
|
||||||
|
extern uint16 numFiles;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern WEBFS_FAT_RECORD fatCache;
|
||||||
|
extern WEBFS_STUB WEBFSStubs[MAX_WEBFS_OPENFILES+1];
|
||||||
|
extern uint32 disk_base_addr;
|
||||||
|
|
||||||
|
#endif
|
78
RTLGDB/Project/wifi_user_set.h
Normal file
78
RTLGDB/Project/wifi_user_set.h
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* wifi_user_set.h
|
||||||
|
*
|
||||||
|
* Created on: 01/04/2017
|
||||||
|
* Author: pvvx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WIFI_USER_SET_H_
|
||||||
|
#define _WIFI_USER_SET_H_
|
||||||
|
|
||||||
|
// ====================================================================================================================================
|
||||||
|
// ============================================ Wlan Config ===========================================================================
|
||||||
|
#define DEF_WIFI_MODE RTW_MODE_STA // Стартовый режим WiFi: RTW_MODE_STA_AP, RTW_MODE_AP, RTW_MODE_STA, RTW_MODE_NONE
|
||||||
|
#define DEF_WIFI_AP_STATIONS 3 // Max number of STAs, should be 1..3, default is 3
|
||||||
|
#define DEF_WIFI_COUNTRY RTW_COUNTRY_RU // Регион использования WiFi...
|
||||||
|
#define DEF_WIFI_TX_PWR RTW_TX_PWR_PERCENTAGE_12_5 // RTW_TX_PWR_PERCENTAGE_75 // RTW_TX_PWR_PERCENTAGE_100
|
||||||
|
#define DEF_WIFI_BGN RTW_NETWORK_BGN // rtw_network_mode_t
|
||||||
|
#define DEF_WIFI_ADAPTIVITY RTW_ADAPTIVITY_DISABLE // RTW_ADAPTIVITY_NORMAL // RTW_ADAPTIVITY_DISABLE/RTW_ADAPTIVITY_NORMAL/RTW_ADAPTIVITY_CARRIER_SENSE
|
||||||
|
|
||||||
|
/* Опции загрузки конфигов по старту */
|
||||||
|
//#define DEF_LOAD_CFG 0 // старт в назначенном режиме по умолчанию
|
||||||
|
#define DEF_LOAD_CFG BID_ALL_WIFI_CFG // старт в назначенном общем режиме по умолчанию, с загрузками последних конфигураций ST и AP
|
||||||
|
//#define DEF_LOAD_CFG (BID_ALL_WIFI_CFG | BID_WIFI_CFG) // старт в записанном режиме
|
||||||
|
|
||||||
|
/* Опции разрешения записи конфигов по упсешному соединению или выполнению операции установок режимов WiFi без ошибок */
|
||||||
|
#define DEF_SAVE_CFG (BID_ALL_WIFI_CFG | BID_WIFI_CFG) // сохранение по успешному соединению/выполненю для всех конфигов:
|
||||||
|
// (для ST или AP пишутся раздельно) с проверкой на изменения
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================ Interface 0 - wlan0 = AP =============================================================
|
||||||
|
#define DEF_AP_SSID "PICH-18"
|
||||||
|
#define DEF_AP_PASSWORD "0123456789"
|
||||||
|
/* Варианты типов Security для AP:
|
||||||
|
RTW_SECURITY_OPEN - Open Security
|
||||||
|
RTW_SECURITY_WPA_TKIP_PSK - WPA Security
|
||||||
|
RTW_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher
|
||||||
|
RTW_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers */
|
||||||
|
#define DEF_AP_SECURITY RTW_ENCRYPTION_WPA2_MIXED // WEP security is NOT IMPLEMENTED. It is NOT SECURE!
|
||||||
|
#define DEF_AP_BEACON 100 // 100...6000 ms
|
||||||
|
#define DEF_AP_CHANNEL 1 // 1..14
|
||||||
|
#define DEF_AP_CHANNEL 1 // 1..14
|
||||||
|
#define DEF_AP_DHCP_MODE 1 // =0 dhcp off, =1 - dhcp on
|
||||||
|
#define DEF_AP_IP IP4ADDR(192,168,4,1)
|
||||||
|
#define DEF_AP_MSK IP4ADDR(255,255,255,0)
|
||||||
|
#define DEF_AP_GW IP4ADDR(192,168,4,1)
|
||||||
|
// if not defined DHCP_START && DHCP_STOP -> 2..255
|
||||||
|
//#define DEF_AP_DHCP_START 2 // DHCP ip start xx.xx.xx.2
|
||||||
|
//#define DEF_AP_DHCP_STOP 15 // DHCP ip stop xx.xx.xx.15
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================ Interface 1 - wlan1 = STA =============================================================
|
||||||
|
#define DEF_ST_SSID "APNAME" // Имя SSID AP (роутера) для присоединения по умолчанию (первый старт)
|
||||||
|
#define DEF_ST_PASSWORD "1234567890" // Пароль AP (роутера) для присоединения по умолчанию (первый старт)
|
||||||
|
#define DEF_ST_SECURITY RTW_ENCRYPTION_WPA2_MIXED // Тип Security
|
||||||
|
#define DEF_ST_BSSID { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } // If bssid set is not ff.ff.ff.ff.ff.ff,
|
||||||
|
#define DEF_ST_USE_BSSID 0 // station will connect to the router with both ssid[] and bssid[] matched.
|
||||||
|
#define DEF_ST_CHANNEL 1 // 1..14
|
||||||
|
#define DEF_ST_AUTORECONNECT 1 // 0 - none, 1..254 - count, 255 - all
|
||||||
|
#define DEF_ST_RECONNECT_PAUSE 1 // 5 sec
|
||||||
|
#define DEF_ST_SLEEP 3 // 0 - Off, 1 - IPS, 2 - LPS, 3 - IPS/LPS mode
|
||||||
|
#define DEF_ST_LPS_DTIM 1 // LPS DTIM
|
||||||
|
#define DEF_ST_DHCP_MODE 1 // =0 dhcp off,
|
||||||
|
// =1 - dhcp on, - динамический ip
|
||||||
|
// =2 Static ip, - fixed ip
|
||||||
|
// =3 - auto fix - старт в режиме "dhcp on", после получения ip - фиксация и переключение в режим рестартов со "Static ip"
|
||||||
|
#define DEF_ST_IP IP4ADDR(192,168,1,100)
|
||||||
|
#define DEF_ST_MSK IP4ADDR(255,255,255,0)
|
||||||
|
#define DEF_ST_GW IP4ADDR(192,168,1,1)
|
||||||
|
|
||||||
|
// ============================================ Interface 2 - eth0 =============================================================
|
||||||
|
|
||||||
|
#define DEF_EH_DHCP_MODE 1 // =0 dhcp off, =1 - dhcp on
|
||||||
|
#define DEF_EH_IP IP4ADDR(192,168,7,200)
|
||||||
|
#define DEF_EH_MSK IP4ADDR(255,255,255,0)
|
||||||
|
#define DEF_EH_GW IP4ADDR(192,168,7,1)
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _WIFI_USER_SET_H_ */
|
660
RTLGDB/RTLGDB.vcxproj
Normal file
660
RTLGDB/RTLGDB.vcxproj
Normal file
|
@ -0,0 +1,660 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ApplicationType>LinuxDebugger</ApplicationType>
|
||||||
|
<SecureShellExecutable>ssh</SecureShellExecutable>
|
||||||
|
<RemoteDebuggerExecutable>gdb</RemoteDebuggerExecutable>
|
||||||
|
<LocalDebuggerExecutable>gdb</LocalDebuggerExecutable>
|
||||||
|
<OCDDebuggerServerAddress>localhost:3333</OCDDebuggerServerAddress>
|
||||||
|
<Keyword>IoT</Keyword>
|
||||||
|
<ProjectGuid>{3D8B16B6-9763-48AD-A514-F45680E8613B}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Makefile</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Makefile</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Makefile</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Makefile</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Assets\LinuxDebugger.xaml" />
|
||||||
|
<None Include="Assets\LocalDebugger.xaml" />
|
||||||
|
<None Include="Assets\OCDDebugger.xaml" />
|
||||||
|
<None Include="Assets\linux_nmake.xaml" />
|
||||||
|
<None Include="makefile" />
|
||||||
|
<None Include="project.mk" />
|
||||||
|
<None Include="USDK\flasher.mk" />
|
||||||
|
<None Include="USDK\Makefile" />
|
||||||
|
<None Include="USDK\paths.mk" />
|
||||||
|
<None Include="USDK\sdkbuild.mk" />
|
||||||
|
<None Include="USDK\sdkset.mk" />
|
||||||
|
<None Include="userset.mk" />
|
||||||
|
<None Include="WEBFiles\basic_style.css" />
|
||||||
|
<None Include="WEBFiles\config_success.html" />
|
||||||
|
<None Include="WEBFiles\index.html" />
|
||||||
|
<None Include="WEBFiles\index_en.html" />
|
||||||
|
<None Include="WEBFiles\index_style.css" />
|
||||||
|
<None Include="WEBFiles\main.html" />
|
||||||
|
<None Include="WEBFiles\main.js" />
|
||||||
|
<None Include="WEBFiles\main_en.html" />
|
||||||
|
<None Include="WEBFiles\rawdata.html" />
|
||||||
|
<None Include="WEBFiles\rawdata.js" />
|
||||||
|
<None Include="WEBFiles\sys_set.html" />
|
||||||
|
<None Include="WEBFiles\sys_set.js" />
|
||||||
|
<None Include="WEBFiles\wifi_set.html" />
|
||||||
|
<None Include="WEBFiles\wifi_set.js" />
|
||||||
|
<None Include="webfs.mk" />
|
||||||
|
</ItemGroup>
|
||||||
|
<!--Import Project="$(MSBuildThisFileDirectory)\Microsoft.cpp.Linux.targets" /-->
|
||||||
|
<!-- To Enable linux debugger -->
|
||||||
|
<PropertyGroup>
|
||||||
|
<UseDefaultDebuggersPropertyPageSchemas>false</UseDefaultDebuggersPropertyPageSchemas>
|
||||||
|
<UseDefaultPropertyPageSchemas>false</UseDefaultPropertyPageSchemas>
|
||||||
|
<_ApplicableDebuggers>Desktop</_ApplicableDebuggers>
|
||||||
|
<DebuggerFlavor>LinuxDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\ProjectItemsSchema.xml" />
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\directories.xml" />
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\debugger_general.xml" />
|
||||||
|
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)\Assets\LinuxDebugger.xaml" />
|
||||||
|
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)\Assets\LocalDebugger.xaml" />
|
||||||
|
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)\Assets\OCDDebugger.xaml" />
|
||||||
|
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)\Assets\linux_nmake.xaml" />
|
||||||
|
<!-- project only rules -->
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general_makefile.xml">
|
||||||
|
<Context>Project</Context>
|
||||||
|
</PropertyPageSchema>
|
||||||
|
<!-- Property sheet only rules -->
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general_makefile_ps.xml;$(VCTargetsPath)$(LangID)\usermacros.xml">
|
||||||
|
<Context>PropertySheet</Context>
|
||||||
|
</PropertyPageSchema>
|
||||||
|
<!-- File only rules -->
|
||||||
|
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general_file.xml">
|
||||||
|
<Context>File</Context>
|
||||||
|
</PropertyPageSchema>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<DesktopDebuggerPages Include="$(MSBuildThisFileDirectory)\Assets\LinuxDebugger.xaml" />
|
||||||
|
<DesktopDebuggerPages Include="$(MSBuildThisFileDirectory)\Assets\LocalDebugger.xaml" />
|
||||||
|
<DesktopDebuggerPages Include="$(MSBuildThisFileDirectory)\Assets\OCDDebugger.xaml" />
|
||||||
|
<DesktopDebuggerPages Include="$(MSBuildThisFileDirectory)\Assets\linux_nmake.xaml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectCapability Include="Linux" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Project\build_info.h" />
|
||||||
|
<ClInclude Include="Project\driver\adc_drv.h" />
|
||||||
|
<ClInclude Include="Project\driver\i2c_drv.h" />
|
||||||
|
<ClInclude Include="Project\efuse_tst.h" />
|
||||||
|
<ClInclude Include="Project\feep_config.h" />
|
||||||
|
<ClInclude Include="Project\flashconf_tst.h" />
|
||||||
|
<ClInclude Include="Project\FreeRTOSConfig.h" />
|
||||||
|
<ClInclude Include="Project\ina219\ina219.h" />
|
||||||
|
<ClInclude Include="Project\ina219\ina219buf.h" />
|
||||||
|
<ClInclude Include="Project\ina219\ina219drv.h" />
|
||||||
|
<ClInclude Include="Project\lwipopts.h" />
|
||||||
|
<ClInclude Include="Project\main.h" />
|
||||||
|
<ClInclude Include="Project\MPU6050\kalman.h" />
|
||||||
|
<ClInclude Include="Project\MPU6050\MPU6050.h" />
|
||||||
|
<ClInclude Include="Project\platform_autoconf.h" />
|
||||||
|
<ClInclude Include="Project\platform_opts.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\c_types.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\os.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\queue.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\rom_wps_os.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\rtl_common.h" />
|
||||||
|
<ClInclude Include="Project\rtl8195a\rtl_libc.h" />
|
||||||
|
<ClInclude Include="Project\sys_cfg.h" />
|
||||||
|
<ClInclude Include="Project\tcpsrv\tcp_srv_conn.h" />
|
||||||
|
<ClInclude Include="Project\user_config.h" />
|
||||||
|
<ClInclude Include="Project\webfs\webfs.h" />
|
||||||
|
<ClInclude Include="Project\web\websock.h" />
|
||||||
|
<ClInclude Include="Project\web\web_srv.h" />
|
||||||
|
<ClInclude Include="Project\web\web_srv_int.h" />
|
||||||
|
<ClInclude Include="Project\web\web_utils.h" />
|
||||||
|
<ClInclude Include="Project\web\web_websocket.h" />
|
||||||
|
<ClInclude Include="Project\wifi_user_set.h" />
|
||||||
|
<ClInclude Include="Project\WS2812\WS2812.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\lwip_netconf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\sdk_ver.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\rtw_wowlan\wifi_wowlan.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\src\utils\os.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\src\utils\rom\rom_wps_os.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\src\wps\wps_defs.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\wifi_conf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\wifi_ind.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\wifi_simple_config.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\wifi_simple_config_parser.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi\wifi_util.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\api\wifi_interactive_ext.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\autoconf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\byteorder\generic.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\byteorder\little_endian.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\byteorder\swab.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\drv_conf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\drv_types.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\ethernet.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\HalPwrSeqCmd.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\HalVerDef.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_com.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_com_phycfg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_com_reg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_intf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_pg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_phy.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\hal_phy_reg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\ieee80211.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\if_ether.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\ip.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\lxbus_hal.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\lxbus_ops.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\lxbus_osintf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\pack_begin.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\pack_end.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_aes.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_arc4.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_ieee80211.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_md5.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_rc4.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_rtw_message.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_rtw_message_e.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_rtw_psk.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_rtw_security.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rom_sha1.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtl8195a_hal.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtl8711b_hal.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_ap.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_byteorder.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_cmd.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_debug.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_eeprom.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_efuse.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_event.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_ht.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_intfs.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_io.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_ioctl_set.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_led.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_mlme.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_mlme_ext.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_mp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_p2p.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_promisc.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_psk.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_pwrctrl.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_qos.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_recv.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_rf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_security.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\rtw_xmit.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\sta_info.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wifi.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wifi_constants.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wifi_lib.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wifi_structures.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wlan_basic_types.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wlan_bssdef.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\include\wlan_lib.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\hci\gspi\gspi_spec.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\hci\hci_intfs.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\hci\hci_spec.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\hci\lxbus\lxbus_spec.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\hci\sdio\sdio_spec.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\freertos\freertos_intfs.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\freertos\freertos_recv.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\freertos\freertos_skbuff.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\freertos\freertos_xmit.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\freertos\wrapper.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\lwip_intf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\netdev.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\osdep_intf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\skbuff.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\wireless.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\drivers\wlan\realtek\src\osdep\wlan_intf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\analogin_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\analogout_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\can_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\ethernet_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\gpio_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\gpio_irq_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\i2c_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\pinmap.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\port_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\pwmout_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\rtc_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\serial_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\sleep_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\spi_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal\us_ticker_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\dma_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\efuse_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\ethernet_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\flash_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\flash_eep.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\gpio_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\gpio_irq_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\i2c_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\i2s_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\log_uart_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\nfc_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\serial_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\sleep_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\spdio_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\spi_ex_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\sys_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\hal_ext\wdt_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\device.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\gpio_object.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\objects.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\PeripheralNames.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\PinNames.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\PortNames.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\mbed\targets\hal\rtl8195a\timer_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\port\realtek\freertos\ethernetif.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\port\realtek\freertos\sys_arch.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\autoip.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\icmp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\igmp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\inet.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\inet_chksum.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\ip.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\ip_addr.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\ipv4\lwip\ip_frag.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\api.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\api_msg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\arch.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\debug.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\def.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\dhcp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\dns.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\err.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\init.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\lwip_timers.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\mem.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\memp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\memp_std.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\netbuf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\netdb.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\netif.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\netifapi.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\opt.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\pbuf.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\raw.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\sio.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\snmp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\snmp_asn1.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\snmp_msg.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\snmp_structs.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\sockets.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\stats.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\sys.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\tcp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\tcpip.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\tcp_impl.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\lwip\udp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\netif\etharp.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\netif\loopif.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\netif\ppp_oe.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\netif\slipif.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\posix\netdb.h" />
|
||||||
|
<ClInclude Include="USDK\component\common\network\lwip\src\include\posix\sys\socket.h" />
|
||||||
|
<ClInclude Include="USDK\component\os\freertos\freertos_service.h" />
|
||||||
|
<ClInclude Include="USDK\component\os\os_dep\include\device_lock.h" />
|
||||||
|
<ClInclude Include="USDK\component\os\os_dep\include\osdep_service.h" />
|
||||||
|
<ClInclude Include="USDK\component\os\os_dep\include\os_support.h" />
|
||||||
|
<ClInclude Include="USDK\component\os\os_dep\include\tcm_heap.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\cmsis.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\cmsis_nvic.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\diag.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\rand.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\rtl_stdlib.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\rtl_utility.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\strproc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\system_8195a.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\cmsis\device\va_list.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\bitband_io.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_adc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_common.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_crypto.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_dac.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_diag.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_efuse.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_gdma.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_gpio.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_i2c.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_i2s.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_irqn.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_log_uart.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_mii.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_misc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_nfc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_pcm.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_peri_on.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_pinmux.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_platform.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_pwm.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_sdio.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_sdio_host.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_sdr_controller.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_soc_ps_monitor.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_spi_flash.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_ssi.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_timer.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_uart.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_usb.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_util.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\hal_vector_table.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_adc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_dac.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_gdma.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_gpio.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_gspi.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_i2c.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_i2s.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_mii.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_nfc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_pcm.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_peri_on.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_pwm.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdio.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdio_host.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdr.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_spi_flash.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_ssi.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sys_on.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_timer.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_uart.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_usb.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_wdt.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\driver\rtl_consol.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\driver\rtl_sec.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\os\freertos_pmu_8195a.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\os\mailbox.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\os\osdep_api.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\os\os_support.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\os\os_timer.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\include\rtl_bios_data.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\include\rtl_lib.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\include\rtl_rr_libc.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\include\rt_lib_rom.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\common\bsp\basic_types.h" />
|
||||||
|
<ClInclude Include="USDK\component\soc\realtek\common\bsp\section_config.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Project\console\adc_tst.c" />
|
||||||
|
<ClCompile Include="Project\console\atcmd_user.c" />
|
||||||
|
<ClCompile Include="Project\console\flash_tst.c" />
|
||||||
|
<ClCompile Include="Project\console\gpio_irq_test.c" />
|
||||||
|
<ClCompile Include="Project\console\power_tst.c" />
|
||||||
|
<ClCompile Include="Project\console\pwm_tst.c" />
|
||||||
|
<ClCompile Include="Project\console\sd_fat.c" />
|
||||||
|
<ClCompile Include="Project\console\spi_tst.c" />
|
||||||
|
<ClCompile Include="Project\console\wifi_console.c" />
|
||||||
|
<ClCompile Include="Project\console\wlan_tst.c" />
|
||||||
|
<ClCompile Include="Project\driver\adc_drv.c" />
|
||||||
|
<ClCompile Include="Project\driver\i2c_drv.c" />
|
||||||
|
<ClCompile Include="Project\efuse_tst.c" />
|
||||||
|
<ClCompile Include="Project\flashconf_tst.c" />
|
||||||
|
<ClCompile Include="Project\ina219\ina219buf.c" />
|
||||||
|
<ClCompile Include="Project\ina219\ina219drv.c" />
|
||||||
|
<ClCompile Include="Project\main.c" />
|
||||||
|
<ClCompile Include="Project\MPU6050\kalman.c" />
|
||||||
|
<ClCompile Include="Project\MPU6050\MPU6050.c" />
|
||||||
|
<ClCompile Include="Project\tcpsrv\tcp_srv_conn.c" />
|
||||||
|
<ClCompile Include="Project\user_start.c" />
|
||||||
|
<ClCompile Include="Project\webfs\webfs.c" />
|
||||||
|
<ClCompile Include="Project\web\websock.c" />
|
||||||
|
<ClCompile Include="Project\web\web_auth.c" />
|
||||||
|
<ClCompile Include="Project\web\web_int_callbacks.c" />
|
||||||
|
<ClCompile Include="Project\web\web_int_vars.c" />
|
||||||
|
<ClCompile Include="Project\web\web_srv.c" />
|
||||||
|
<ClCompile Include="Project\web\web_utils.c" />
|
||||||
|
<ClCompile Include="Project\web\web_websocket.c" />
|
||||||
|
<ClCompile Include="Project\WS2812\WS2812.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\lwip_netconf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\lwip_netconf1.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\rtw_wowlan\dev_wowlan.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\src\utils\os_freertos.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\wpa_supplicant\wifi_eap_config.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\wpa_supplicant\wifi_p2p_config.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\rtw_wpa_supplicant\wpa_supplicant\wifi_wps_config.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\wifi_conf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\wifi_ind.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\wifi_promisc.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\wifi_simple_config.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi\wifi_util.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi_api_scan.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\api\wifi_interactive_mode.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\gspi\gspi_intf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\gspi\gspi_io.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\gspi\gspi_isr.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\sdio\sdio_drvio.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\sdio\sdio_intf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\hci\sdio\sdio_isr.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\drivers\wlan\realtek\src\osdep\lwip_intf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\analogin_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\dma_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\efuse_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\ethernet_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\flash_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\flash_eep.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\gpio_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\gpio_irq_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\i2c_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\i2s_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\log_uart_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\nfc_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\pinmap.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\pinmap_common.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\port_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\pwmout_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\rtc_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\serial_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\sleep.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\spdio_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\spi_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\sys_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\timer_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\us_ticker.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\mbed\targets\hal\rtl8195a\wdt_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\port\realtek\freertos\ethernetif.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\port\realtek\freertos\sys_arch.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\api_lib.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\api_msg.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\err.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\netbuf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\netdb.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\netifapi.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\sockets.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\api\tcpip.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\def.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\dhcp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\dns.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\init.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\autoip.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\icmp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\igmp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\inet.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\inet_chksum.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\ip.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\ip_addr.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\ipv4\ip_frag.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\lwip_timers.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\mem.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\memp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\netif.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\pbuf.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\raw.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\asn1_dec.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\asn1_enc.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\mib2.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\mib_structs.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\msg_in.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\snmp\msg_out.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\stats.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\sys.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\tcp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\tcp_in.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\tcp_out.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\core\udp.c" />
|
||||||
|
<ClCompile Include="USDK\component\common\network\lwip\src\netif\etharp.c" />
|
||||||
|
<ClCompile Include="USDK\component\os\freertos\freertos_service.c" />
|
||||||
|
<ClCompile Include="USDK\component\os\os_dep\device_lock.c" />
|
||||||
|
<ClCompile Include="USDK\component\os\os_dep\osdep_service.c" />
|
||||||
|
<ClCompile Include="USDK\component\os\os_dep\tcm_heap.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\cmsis\device\app_start.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\cmsis\device\cmsis_nvic.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\cmsis\device\system_8195a.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\bitband_io.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_32k.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_adc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_common.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_dac.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_efuse.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_gdma.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_gpio.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_i2c.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_i2s.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_log_uart.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_mii.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_misc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_nfc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_pcm.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_pinmux.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_pwm.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_sdio_host.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_sdr_controller.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_soc_ps_monitor.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_spi_flash_ram.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_ssi.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_timer.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\hal_uart.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\fw_loader_main.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\hal_misc_v0.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\low_level_io.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\rtl_bios_data.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\rtl_boot.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\rtl_boot_min.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\rtl_boot_ram.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\rtl_boot_tst.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\startup.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\ram_lib\startup_old.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_adc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_dac.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_gdma.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_gpio.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_i2c.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_i2s.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_mii.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_nfc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_pcm.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_pwm.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdio_device.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdio_host.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_sdio_host_open.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_ssi.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_timer.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\fwlib\rtl8195a\rtl8195a_uart.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\driver\console_hs_uart.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\driver\console_i2c.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\driver\low_level_io.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\driver\rtl_consol.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\driver\rtl_console_new.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\os\freertos_pmu_8195a.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\os\mailbox.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\os\osdep_api.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\c_stdio.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\ram_libc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\ram_libgloss_retarget.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\ram_pvvx_libc.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\rtl_eabi_cast_ram.c" />
|
||||||
|
<ClCompile Include="USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd\rtl_math_ram.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- To Enable linux debugger End -->
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<NMakeBuildCommandLine>mingw32-make -s -j 6 all</NMakeBuildCommandLine>
|
||||||
|
<IncludePath>C:\RTL\6-2017-q2\arm-none-eabi\include;$(ProjectDir)USDK\component\common\mbed\targets\hal\rtl8195a;$(ProjectDir)USDK\component\common\mbed\common;$(ProjectDir)USDK\component\common\mbed\hal;$(ProjectDir)USDK\component\common\mbed\hal_ext;$(ProjectDir)USDK\component\common\mbed\api;$(ProjectDir)USDK\component\common\api;$(ProjectDir)USDK\component\common\api\at_cmd;$(ProjectDir)USDK\component\common\api\network;$(ProjectDir)USDK\component\common\api\platform;$(ProjectDir)USDK\component\common\api\wifi\rtw_wowlan;$(ProjectDir)USDK\component\common\api\wifi;$(ProjectDir)USDK\component\common\network;$(ProjectDir)USDK\component\common\network\lwip\port\realtek;$(ProjectDir)USDK\component\common\network\lwip\port\realtek\arch;$(ProjectDir)USDK\component\common\network\lwip\port\realtek\freertos;$(ProjectDir)USDK\component\common\network\lwip\src\api;$(ProjectDir)USDK\component\common\network\lwip\src\core\ipv4;$(ProjectDir)USDK\component\common\network\lwip\src\core\snmp;$(ProjectDir)USDK\component\common\network\lwip\src\core;$(ProjectDir)USDK\component\common\network\lwip\src\include;$(ProjectDir)USDK\component\common\network\lwip\src\include\ipv4;$(ProjectDir)USDK\component\common\network\lwip\src\include\ipv4\lwip;$(ProjectDir)USDK\component\common\network\lwip\src\include\lwip;$(ProjectDir)USDK\component\common\network\lwip\src\include\netif;$(ProjectDir)USDK\component\common\network\lwip\src\include\posix\sys;$(ProjectDir)USDK\component\common\network\lwip\src\include\posix;$(ProjectDir)USDK\component\common\network\lwip\src\netif;$(ProjectDir)USDK\component\common\drivers\wlan\realtek\include;$(ProjectDir)USDK\component\common\drivers\wlan\realtek\include\byteorder;$(ProjectDir)USDK\component\common\drivers\wlan\realtek\src\osdep;$(ProjectDir)USDK\component\common\drivers\wlan\realtek\src\osdep\freertos;$(ProjectDir)USDK\component\os\freertos\freertos\Source;$(ProjectDir)USDK\component\os\freertos\freertos\Source\portable\GCC\ARM_CM3;$(ProjectDir)USDK\component\os\freertos\freertos\Source\include;$(ProjectDir)USDK\component\os\freertos;$(ProjectDir)USDK\component\os\os_dep\include;$(ProjectDir)USDK\component\os\os_dep;$(ProjectDir)USDK\component\os\rtx;$(ProjectDir)USDK\component\soc\realtek\common\bsp;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\src;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\rtl8195a;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\rtl8195a\src;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\ram_lib;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\ram_lib\wlan\realtek\wlan_ram_map\rom;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\ram_lib\usb_otg\include;$(ProjectDir)USDK\component\soc\realtek\8195a\fwlib\ram_lib\usb_otg\include\usb_otg_inc;$(ProjectDir)USDK\component\soc\realtek\8195a\cmsis;$(ProjectDir)USDK\component\soc\realtek\8195a\cmsis\device;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\driver;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\platform;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\os;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\rtl_std_lib;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\rtl_std_lib\include;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\rtl_std_lib\lib_rtlstd;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\rtl_std_lib\libc\rom\string;$(ProjectDir)USDK\component\soc\realtek\8195a\misc\rtl_std_lib\libgloss\rtl8195a\rom;$(ProjectDir)Project;$(ProjectDir)Project\web;$(ProjectDir)Project\webfs;$(ProjectDir)Project\tcpsrv;$(ProjectDir)Project\driver;$(ProjectDir)Project\rtl8195a;$(ProjectDir)Project\ina219;$(ProjectDir)Project\adc_ws;$(ProjectDir)Project\MPU6050;$(ProjectDir)Project\SSD1306;$(ProjectDir)Project\MLX90614;$(ProjectDir)Project\WS2812;$(IncludePath)</IncludePath>
|
||||||
|
<NMakeReBuildCommandLine>mingw32-make -s -j 6 rebuild</NMakeReBuildCommandLine>
|
||||||
|
<NMakeCleanCommandLine>mingw32-make -s clean</NMakeCleanCommandLine>
|
||||||
|
<NMakeOutput>ram_all.bin</NMakeOutput>
|
||||||
|
<OutDir>$(ProjectDir)Debug\bin\</OutDir>
|
||||||
|
<IntDir>$(ProjectDir)Debug</IntDir>
|
||||||
|
<NMakePreprocessorDefinitions>CONFIG_PLATFORM_8195A=1;GCC_ARMCM3;M3;F_CPU=166666666L;__STDC__;__extension__=</NMakePreprocessorDefinitions>
|
||||||
|
<ExecutablePath>$(PATH)</ExecutablePath>
|
||||||
|
<ReferencePath />
|
||||||
|
<LibraryPath />
|
||||||
|
<LibraryWPath />
|
||||||
|
<ExcludePath>
|
||||||
|
</ExcludePath>
|
||||||
|
<SourcePath>$(SourcePath)</SourcePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<NMakeBuildCommandLine>
|
||||||
|
</NMakeBuildCommandLine>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<BuildLog>
|
||||||
|
<Path>$(ProjectDir)Debug\$(MSBuildProjectName).log</Path>
|
||||||
|
</BuildLog>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
1794
RTLGDB/RTLGDB.vcxproj.filters
Normal file
1794
RTLGDB/RTLGDB.vcxproj.filters
Normal file
File diff suppressed because it is too large
Load diff
12
RTLGDB/RTLGDB.vcxproj.user
Normal file
12
RTLGDB/RTLGDB.vcxproj.user
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<OCDDebuggerExecutable>C:\RTL\6-2017-q2\bin\arm-none-eabi-gdb.exe</OCDDebuggerExecutable>
|
||||||
|
<OCDDebugBinary>$(ProjectDir)Debug\obj\Debug.axf</OCDDebugBinary>
|
||||||
|
<DebuggerFlavor>OCDDebugger</DebuggerFlavor>
|
||||||
|
<OCDDebuggerServerAddress>localhost:2331</OCDDebuggerServerAddress>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<DebuggerFlavor>OCDDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
60
RTLGDB/USDK/Makefile
Normal file
60
RTLGDB/USDK/Makefile
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
include userset.mk
|
||||||
|
|
||||||
|
all: ram_all
|
||||||
|
mp: ram_all_mp
|
||||||
|
|
||||||
|
.PHONY: ram_all
|
||||||
|
ram_all:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)sdkbuild.mk
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk genbin1 genbin23
|
||||||
|
|
||||||
|
.PHONY: ram_all_mp
|
||||||
|
ram_all_mp:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)sdkbuild.mk mp
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk mp
|
||||||
|
|
||||||
|
.PHONY: clean clean_all
|
||||||
|
clean:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)sdkbuild.mk clean
|
||||||
|
|
||||||
|
clean_all:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)sdkbuild.mk clean_all
|
||||||
|
|
||||||
|
.PHONY: flashburn runram reset test readfullflash flashwebfs flashboot
|
||||||
|
flashboot:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk flashboot
|
||||||
|
|
||||||
|
flashburn:
|
||||||
|
#JLinkGDB-WrFlash.bat
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk flashburn
|
||||||
|
|
||||||
|
flash_OTA:
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk flash_OTA
|
||||||
|
|
||||||
|
webfs:
|
||||||
|
@$(MAKE) -f webfs.mk
|
||||||
|
|
||||||
|
flashwebfs:
|
||||||
|
@$(MAKE) -f webfs.mk
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk flashwebfs
|
||||||
|
#JLinkGDB-WrWebFs.bat
|
||||||
|
|
||||||
|
runram:
|
||||||
|
#JLink-RunRAM.bat
|
||||||
|
@$(MAKE) --f $(SDK_PATH)flasher.mk runram
|
||||||
|
|
||||||
|
runsdram:
|
||||||
|
#JLink-RunRAM.bat
|
||||||
|
@$(MAKE) --f $(SDK_PATH)flasher.mk runsdram
|
||||||
|
|
||||||
|
reset:
|
||||||
|
#JLink-Reset.bat
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk reset
|
||||||
|
|
||||||
|
test:
|
||||||
|
JLink-RTL00ConsoleROM.bat
|
||||||
|
#@make -f flasher.mk test
|
||||||
|
|
||||||
|
readfullflash:
|
||||||
|
#JLink-RdFullFlash.bat
|
||||||
|
@$(MAKE) -f $(SDK_PATH)flasher.mk readfullflash
|
175
RTLGDB/USDK/component/common/api/at_cmd/atcmd_cloud.c
Normal file
175
RTLGDB/USDK/component/common/api/at_cmd/atcmd_cloud.c
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "log_service.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
|
||||||
|
#if CONFIG_JOYLINK
|
||||||
|
#if 1
|
||||||
|
void fATCJ(void *arg)
|
||||||
|
{
|
||||||
|
extern void joylink_erase(void);
|
||||||
|
printf("\r\n[ATCJ] Erase wifi and joylink info.");
|
||||||
|
if(arg){
|
||||||
|
printf("\r\n[ATCJ]Usage : ATCJ");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
joylink_erase();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void fATCJ(void *arg)
|
||||||
|
{
|
||||||
|
extern void cmd_jd_smart(int argc, char **argv);
|
||||||
|
int argc;
|
||||||
|
char *argv[MAX_ARGC] = {0};
|
||||||
|
printf("[ATCJ]:simple config command for jdsmart\n\r");
|
||||||
|
if(!arg){
|
||||||
|
printf("[ATCJ]Usage: ATCJ=simple_config\n\r");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
argv[0] = "simple_config";
|
||||||
|
if((argc = parse_param(arg, argv)) > 1){
|
||||||
|
cmd_jd_smart(argc, argv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("[ATCJ]Usage: ATCJ=simple_config\n\r");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_GAGENT
|
||||||
|
void fATCG(void *arg)
|
||||||
|
{
|
||||||
|
example_gagent();
|
||||||
|
}
|
||||||
|
void fATCE(void *arg)
|
||||||
|
{//Erase gagent config flash
|
||||||
|
extern int GAgent_DevEraseConfigData();
|
||||||
|
GAgent_DevEraseConfigData();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_QQ_LINK
|
||||||
|
void fATCQ(void *arg)
|
||||||
|
{
|
||||||
|
int argc;
|
||||||
|
unsigned char *argv[MAX_ARGC] = {0};
|
||||||
|
extern void device_write_sn_license(int argc, unsigned char **argv);
|
||||||
|
extern void device_erase_all(int argc, unsigned char **argv);
|
||||||
|
|
||||||
|
if(!arg)
|
||||||
|
{
|
||||||
|
printf("\r\n[ATCQ] Write sn/license into flash or Erase all info\r\n");
|
||||||
|
printf("\r\n[ATCQ] Usage: ATCQ=erase");
|
||||||
|
printf("\r\n[ATCQ] Usage: ATCQ=sn,xxxxxxxx\r\n ATCQ=licensepart1,xxxxxxxx\r\n ATCQ=licensepart2,xxxxxxxx");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
argv[0] = "sn&&license&&erase";
|
||||||
|
argc = parse_param(arg, argv);
|
||||||
|
if(argc == 3) // Write sn&&license
|
||||||
|
{
|
||||||
|
device_write_sn_license(argc, argv);
|
||||||
|
}
|
||||||
|
else if(argc == 2) // Erase all info : ATCQ=erase
|
||||||
|
{
|
||||||
|
device_erase_all(argc, argv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("\r\n[ATCQ] Usage: ATCQ=erase");
|
||||||
|
printf("\r\n[ATCQ]Usage: ATCQ=sn,xxxxxxxx\r\n ATCQ=licensepart1,xxxxxxxx\r\n ATCQ=licensepart2,xxxxxxxx");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_AIRKISS_CLOUD
|
||||||
|
void fATCW(void *arg)
|
||||||
|
{
|
||||||
|
int argc;
|
||||||
|
unsigned char *argv[MAX_ARGC] = {0};
|
||||||
|
extern void airkiss_cloud_write_device_info(int argc, unsigned char **argv);
|
||||||
|
extern void airkiss_cloud_erase_ap_profile(int argc, unsigned char **argv);
|
||||||
|
|
||||||
|
if(!arg) goto USAGE;
|
||||||
|
|
||||||
|
argv[0] = "type/id/licese/erase";
|
||||||
|
argc = parse_param(arg, argv);
|
||||||
|
if(argc == 3) // Write typw/id/license
|
||||||
|
{
|
||||||
|
airkiss_cloud_write_device_info(argc, argv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(argc == 2) // Erase wifi profile : ATCW=erase
|
||||||
|
{
|
||||||
|
airkiss_cloud_erase_ap_profile(argc, argv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto USAGE;
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
printf("\r\n[ATCW] Write ORDERLY device's type/id/license into flash or Erase wifi profile");
|
||||||
|
printf("\r\n[ATCW] Usage: ATCW=type,xxxxxxxx");
|
||||||
|
printf("\r\n[ATCW] Usage: ATCW=id,xxxxxxxx");
|
||||||
|
printf("\r\n[ATCW] Usage: ATCW=licensepart1,xxxxxxxx\t(80-Byte long)");
|
||||||
|
printf("\r\n[ATCW] Usage: ATCW=licensepart2,xxxxxxxx\t(80-Byte long)");
|
||||||
|
printf("\r\n[ATCW] Usage: ATCW=erase");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_ALINK
|
||||||
|
extern void example_alink(void);
|
||||||
|
extern int alink_erase_wifi_config();
|
||||||
|
extern void alink_reset_to_factory(void *arg);
|
||||||
|
|
||||||
|
void fATCA(void *arg)
|
||||||
|
{
|
||||||
|
example_alink();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATCZ(void *arg)
|
||||||
|
{
|
||||||
|
//Erase alink config flash
|
||||||
|
alink_erase_wifi_config();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATCT(void *arg)
|
||||||
|
{
|
||||||
|
alink_reset_to_factory(NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void fATCx(void *arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
log_item_t at_cloud_items[ ] = {
|
||||||
|
#if CONFIG_JOYLINK
|
||||||
|
{"ATCJ", fATCJ,},
|
||||||
|
#endif
|
||||||
|
#if CONFIG_GAGENT
|
||||||
|
{"ATCG", fATCG,},
|
||||||
|
{"ATCE", fATCE,},
|
||||||
|
#endif
|
||||||
|
#if CONFIG_QQ_LINK
|
||||||
|
{"ATCQ", fATCQ,},
|
||||||
|
#endif
|
||||||
|
#if CONFIG_AIRKISS_CLOUD
|
||||||
|
{"ATCW", fATCW},
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ALINK
|
||||||
|
{"ATCA", fATCA,},
|
||||||
|
{"ATCZ", fATCZ,},
|
||||||
|
{"ATCT", fATCT,},
|
||||||
|
#endif
|
||||||
|
{"ATC?", fATCx,},
|
||||||
|
};
|
||||||
|
void at_cloud_init(void)
|
||||||
|
{
|
||||||
|
log_service_add_table(at_cloud_items, sizeof(at_cloud_items)/sizeof(at_cloud_items[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SUPPORT_LOG_SERVICE
|
||||||
|
log_module_init(at_cloud_init);
|
||||||
|
#endif
|
91
RTLGDB/USDK/component/common/api/at_cmd/atcmd_ethernet.c
Normal file
91
RTLGDB/USDK/component/common/api/at_cmd/atcmd_ethernet.c
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "log_service.h"
|
||||||
|
#include "platform_opts.h"
|
||||||
|
#include <lwip_netconf.h>
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
#include <lwip/sockets.h>
|
||||||
|
#include <lwip/tcpip.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define _AT_DHCP_ETHERNET_MII_ "ATE0"
|
||||||
|
#define _AT_SET_DEFAULT_INTERFACE "ATE1"
|
||||||
|
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
extern int dhcp_ethernet_mii;
|
||||||
|
extern int ethernet_if_default;
|
||||||
|
extern struct netif xnetif[NET_IF_NUM];
|
||||||
|
|
||||||
|
void fATE0(void *arg)
|
||||||
|
{
|
||||||
|
int argc;
|
||||||
|
char *argv[MAX_ARGC] = {0};
|
||||||
|
printf("[ATE0]:DHCP configure for ethernet\n\r");
|
||||||
|
if(!arg){
|
||||||
|
printf("[ATE0]Usage to disable DHCP: ATE0=0\n");
|
||||||
|
printf("[ATE0]Usage to enable DHCP: ATE0=1\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if('0' == *(char *)arg)
|
||||||
|
{
|
||||||
|
dhcp_ethernet_mii = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if('1' == *(char *)arg)
|
||||||
|
{
|
||||||
|
dhcp_ethernet_mii = 1;
|
||||||
|
LwIP_DHCP(NET_IF_NUM - 1, DHCP_START);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("[ATE0]Usage to disable DHCP: ATE0=0\n");
|
||||||
|
printf("[ATE0]Usage to enable DHCP: ATE0=1\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATE1(void *arg)
|
||||||
|
{
|
||||||
|
int argc;
|
||||||
|
char *argv[MAX_ARGC] = {0};
|
||||||
|
printf("[ATE1]:Set/check the default interface\n\r");
|
||||||
|
if(!arg){
|
||||||
|
if(ethernet_if_default)
|
||||||
|
printf("Ethernet is the default interface\n");
|
||||||
|
else
|
||||||
|
printf("wlan is the default interface\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if('0' == *(char *)arg)
|
||||||
|
{
|
||||||
|
ethernet_if_default = 0;
|
||||||
|
printf("wlan is set to the default interface\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
else if('1' == *(char *)arg)
|
||||||
|
{
|
||||||
|
ethernet_if_default = 1;
|
||||||
|
printf("ethernet is set to the default interface\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("[ATE0]Usage to check the default interface: ATE1\n");
|
||||||
|
printf("[ATE0]Usage to set ethernet as default interface: ATE1=1\n");
|
||||||
|
printf("[ATE0]Usage to set wlan as default interface: ATE1=0\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_item_t at_ethernet_items[ ] = {
|
||||||
|
{"ATE0", fATE0,},
|
||||||
|
{"ATE1", fATE1,}
|
||||||
|
};
|
||||||
|
|
||||||
|
void at_ethernet_init(void)
|
||||||
|
{
|
||||||
|
log_service_add_table(at_ethernet_items, sizeof(at_ethernet_items)/sizeof(at_ethernet_items[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
log_module_init(at_ethernet_init);
|
||||||
|
|
||||||
|
#endif
|
2263
RTLGDB/USDK/component/common/api/at_cmd/atcmd_lwip.c
Normal file
2263
RTLGDB/USDK/component/common/api/at_cmd/atcmd_lwip.c
Normal file
File diff suppressed because it is too large
Load diff
100
RTLGDB/USDK/component/common/api/at_cmd/atcmd_lwip.h
Normal file
100
RTLGDB/USDK/component/common/api/at_cmd/atcmd_lwip.h
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
#ifndef __ATCMD_LWIP_H__
|
||||||
|
#define __ATCMD_LWIP_H__
|
||||||
|
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#ifdef CONFIG_AT_LWIP
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include <lwip/opt.h>
|
||||||
|
#include "lwip/sockets.h"
|
||||||
|
#include "lwip/api.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/igmp.h"
|
||||||
|
#include "lwip/inet.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "lwip/raw.h"
|
||||||
|
#include "lwip/udp.h"
|
||||||
|
#include "lwip/tcpip.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/netdb.h"
|
||||||
|
#include "lwip_netconf.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define _AT_TRANSPORT_MODE_ "ATP1"
|
||||||
|
#define _AT_TRANSPORT_LOCAL_PORT_ "ATP2"
|
||||||
|
#define _AT_TRANSPORT_REMOTE_IP_ "ATP3"
|
||||||
|
#define _AT_TRANSPORT_REMOTE_PORT_ "ATP4"
|
||||||
|
#define _AT_TRANSPORT_START_SERVER_ "ATP5"
|
||||||
|
#define _AT_TRANSPORT_START_CLIENT_ "ATP6"
|
||||||
|
#define _AT_TRANSPORT_SHOW_SETTING_ "ATP?"
|
||||||
|
#define _AT_TRANSPORT_RECEIVE_DATA_ "ATR0"
|
||||||
|
#define _AT_TRANSPORT_RECEIVE_PACKET_SIZE_ "ATR1"
|
||||||
|
#define _AT_TRANSPORT_WRITE_DATA_ "ATRA"
|
||||||
|
#define _AT_TRANSPORT_WRITE_PACKET_SIZE_ "ATRB"
|
||||||
|
|
||||||
|
#define NODE_MODE_TCP 0
|
||||||
|
#define NODE_MODE_UDP 1
|
||||||
|
|
||||||
|
#define NODE_ROLE_SERVER 0
|
||||||
|
#define NODE_ROLE_CLIENT 1
|
||||||
|
#define NODE_ROLE_SEED 2
|
||||||
|
|
||||||
|
#define INVALID_SOCKET_ID (-1)
|
||||||
|
|
||||||
|
//parameters
|
||||||
|
#ifndef NET_IF_NUM
|
||||||
|
#define NET_IF_NUM 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ATCMD_LWIP_TASK_PRIORITY (tskIDLE_PRIORITY + 1)
|
||||||
|
|
||||||
|
#if ATCMD_VER == ATVER_2
|
||||||
|
|
||||||
|
#define SERVER "127.0.0.1"
|
||||||
|
|
||||||
|
#define NUM_NS (MEMP_NUM_NETCONN) //maximum number of node and seed, same as NUM_SOCKETS
|
||||||
|
|
||||||
|
#define ETH_MAX_MTU 1500
|
||||||
|
|
||||||
|
#define INVALID_CON_ID (-1)
|
||||||
|
|
||||||
|
#define RECV_SELECT_TIMEOUT_SEC (0)
|
||||||
|
#define RECV_SELECT_TIMEOUT_USEC (20000) //20ms
|
||||||
|
|
||||||
|
typedef struct ns
|
||||||
|
{
|
||||||
|
int con_id;
|
||||||
|
int sockfd;
|
||||||
|
s8_t role;
|
||||||
|
int protocol;
|
||||||
|
u32_t addr;
|
||||||
|
u16_t port;
|
||||||
|
u32_t local_addr;
|
||||||
|
u16_t local_port;
|
||||||
|
xTaskHandle handletask;
|
||||||
|
struct ns* next;
|
||||||
|
struct ns* nextseed;
|
||||||
|
} node;
|
||||||
|
|
||||||
|
extern xTaskHandle atcmd_lwip_tt_task;
|
||||||
|
extern xSemaphoreHandle atcmd_lwip_tt_sema;
|
||||||
|
extern volatile int atcmd_lwip_tt_datasize;
|
||||||
|
extern volatile int atcmd_lwip_tt_lasttickcnt;
|
||||||
|
#define ATCMD_LWIP_TT_MAX_DELAY_TIME_MS (20) //transparent transmission interval
|
||||||
|
|
||||||
|
extern int atcmd_lwip_is_tt_mode(void);
|
||||||
|
extern void atcmd_lwip_set_tt_mode(int enable);
|
||||||
|
int atcmd_lwip_send_data(node *curnode, u8 *data, u16 data_sz, struct sockaddr_in cli_addr);
|
||||||
|
int atcmd_lwip_receive_data(node *curnode, u8 *buffer, u16 buffer_size, int *recv_size,
|
||||||
|
u8_t *udp_clientaddr, u16_t *udp_clientport);
|
||||||
|
node* create_node(int mode, s8_t role);
|
||||||
|
void init_node_pool(void);
|
||||||
|
void delete_node(node *n);
|
||||||
|
int hang_node(node* insert_node);
|
||||||
|
int hang_seednode(node* main_node ,node* insert_node);
|
||||||
|
node *seek_node(int con_id);
|
||||||
|
node *tryget_node(int n);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //#ifdef CONFIG_AT_LWIP
|
||||||
|
#endif //#ifndef __ATCMD_LWIP_H__
|
195
RTLGDB/USDK/component/common/api/at_cmd/atcmd_mp.c
Normal file
195
RTLGDB/USDK/component/common/api/at_cmd/atcmd_mp.c
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
#include <platform_stdlib.h>
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include <gpio_api.h>
|
||||||
|
#include "log_service.h"
|
||||||
|
#include "atcmd_mp.h"
|
||||||
|
|
||||||
|
#if CONFIG_ATCMD_MP_EXT0
|
||||||
|
extern void fATM0(void *arg); // MP ext0 AT command
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_ATCMD_MP
|
||||||
|
//-------- AT MP commands ---------------------------------------------------------------
|
||||||
|
void fATMG(void *arg)
|
||||||
|
{
|
||||||
|
gpio_t gpio_test;
|
||||||
|
int argc = 0, val, cnts, i, write=0, data=0;
|
||||||
|
char *argv[MAX_ARGC] = {0}, port, num;
|
||||||
|
PinName pin = NC;
|
||||||
|
u32 tConfigDebugInfo = ConfigDebugInfo;
|
||||||
|
|
||||||
|
AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "[ATMG]: _AT_MP_GPIO_TEST_");
|
||||||
|
if(!arg){
|
||||||
|
AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "[ATMG] Usage: ATSG=w,PINNAMES(ex:A0B1C2...),VALUE(0/1)");
|
||||||
|
AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "[ATMG] Usage: ATSG=r,PINNAMES(ex:A0B1C2...)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
argc = parse_param(arg, argv);
|
||||||
|
cnts = strlen(argv[2]);
|
||||||
|
if(cnts % 2) return;
|
||||||
|
cnts /= 2;
|
||||||
|
if(cnts == 0) return;
|
||||||
|
|
||||||
|
if(strcmp(argv[1], "w") == 0){
|
||||||
|
write = 1;
|
||||||
|
if(strcmp(argv[3], "1") == 0)
|
||||||
|
data = 1;
|
||||||
|
}
|
||||||
|
// Remove debug info massage
|
||||||
|
_AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "[ATMG] %s: ", argv[1]);
|
||||||
|
ConfigDebugInfo = 0;
|
||||||
|
for(i=0; i<(cnts*2); i+=2){
|
||||||
|
pin = NC;
|
||||||
|
port = argv[2][i];
|
||||||
|
num = argv[2][i+1];
|
||||||
|
if(port >= 'a' && port <= 'z')
|
||||||
|
port -= ('a' - 'A');
|
||||||
|
if(num >= 'a' && num <= 'z')
|
||||||
|
num -= ('a' - 'A');
|
||||||
|
switch(port){
|
||||||
|
case 'A':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PA_0; break; case '1': pin = PA_1; break; case '2': pin = PA_2; break; case '3': pin = PA_3; break;
|
||||||
|
case '4': pin = PA_4; break; case '5': pin = PA_5; break; case '6': pin = PA_6; break; case '7': pin = PA_7; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PB_0; break; case '1': pin = PB_1; break; case '2': pin = PB_2; break; case '3': pin = PB_3; break;
|
||||||
|
case '4': pin = PB_4; break; case '5': pin = PB_5; break; case '6': pin = PB_6; break; case '7': pin = PB_7; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PC_0; break; case '1': pin = PC_1; break; case '2': pin = PC_2; break; case '3': pin = PC_3; break;
|
||||||
|
case '4': pin = PC_4; break; case '5': pin = PC_5; break; case '6': pin = PC_6; break; case '7': pin = PC_7; break;
|
||||||
|
case '8': pin = PC_8; break; case '9': pin = PC_9; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PD_0; break; case '1': pin = PD_1; break; case '2': pin = PD_2; break; case '3': pin = PD_3; break;
|
||||||
|
case '4': pin = PD_4; break; case '5': pin = PD_5; break; case '6': pin = PD_6; break; case '7': pin = PD_7; break;
|
||||||
|
case '8': pin = PD_8; break; case '9': pin = PD_9; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PE_0; break; case '1': pin = PE_1; break; case '2': pin = PE_2; break; case '3': pin = PE_3; break;
|
||||||
|
case '4': pin = PE_4; break; case '5': pin = PE_5; break; case '6': pin = PE_6; break; case '7': pin = PE_7; break;
|
||||||
|
case '8': pin = PE_8; break; case '9': pin = PE_9; break; case 'A': pin = PE_A; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PF_0; break; case '1': pin = PF_1; break; case '2': pin = PF_2; break; case '3': pin = PF_3; break;
|
||||||
|
case '4': pin = PF_4; break; case '5': pin = PF_5; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'G':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PG_0; break; case '1': pin = PG_1; break; case '2': pin = PG_2; break; case '3': pin = PG_3; break;
|
||||||
|
case '4': pin = PG_4; break; case '5': pin = PG_5; break; case '6': pin = PG_6; break; case '7': pin = PG_7; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PH_0; break; case '1': pin = PH_1; break; case '2': pin = PH_2; break; case '3': pin = PH_3; break;
|
||||||
|
case '4': pin = PH_4; break; case '5': pin = PH_5; break; case '6': pin = PH_6; break; case '7': pin = PH_7; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PI_0; break; case '1': pin = PI_1; break; case '2': pin = PI_2; break; case '3': pin = PI_3; break;
|
||||||
|
case '4': pin = PI_4; break; case '5': pin = PI_5; break; case '6': pin = PI_6; break; case '7': pin = PI_7; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'J':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PJ_0; break; case '1': pin = PJ_1; break; case '2': pin = PJ_2; break; case '3': pin = PJ_3; break;
|
||||||
|
case '4': pin = PJ_4; break; case '5': pin = PJ_5; break; case '6': pin = PJ_6; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
switch(num){
|
||||||
|
case '0': pin = PK_0; break; case '1': pin = PK_1; break; case '2': pin = PK_2; break; case '3': pin = PK_3; break;
|
||||||
|
case '4': pin = PK_4; break; case '5': pin = PK_5; break; case '6': pin = PK_6; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(pin == NC){
|
||||||
|
_AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "X,");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Initial input control pin
|
||||||
|
gpio_init(&gpio_test, pin);
|
||||||
|
if(write){
|
||||||
|
gpio_dir(&gpio_test, PIN_OUTPUT); // Direction: Output
|
||||||
|
gpio_mode(&gpio_test, PullNone); // No pull
|
||||||
|
gpio_write(&gpio_test, data);
|
||||||
|
_AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "%d,", data);
|
||||||
|
}else{
|
||||||
|
gpio_dir(&gpio_test, PIN_INPUT); // Direction: Input
|
||||||
|
gpio_mode(&gpio_test, PullUp); // Pull-High
|
||||||
|
val = gpio_read(&gpio_test);
|
||||||
|
_AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "%d,", val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_AT_DBG_MSG(AT_FLAG_GPIO, AT_DBG_ALWAYS, "\n");
|
||||||
|
// Recover debug info massage
|
||||||
|
ConfigDebugInfo = tConfigDebugInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATMR(void *arg)
|
||||||
|
{
|
||||||
|
u32 idx;
|
||||||
|
|
||||||
|
AT_PRINTK("[ATMR]: _AT_MP_SDR_TEST_");
|
||||||
|
#ifdef CONFIG_SDR_EN
|
||||||
|
for (idx = 0; idx < 0x200000; idx = idx+4){
|
||||||
|
HAL_WRITE32(0x30000000, idx, 0x12345678);
|
||||||
|
if (HAL_READ32(0x30000000, idx) != 0x12345678) {
|
||||||
|
AT_PRINTK("[ATMR]: SDR test fail addr 0x08x, value 0x08%x",(0x30000000+idx),HAL_READ32(0x30000000, idx));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AT_PRINTK("[ATMR]: SDR test success");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATMt(void *arg)
|
||||||
|
{
|
||||||
|
int argc = 0;
|
||||||
|
char *argv[MAX_ARGC] = {0};
|
||||||
|
|
||||||
|
AT_PRINTK("[ATM#]: _AT_MP_TEST_");
|
||||||
|
argc = parse_param(arg, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fATMx(void *arg)
|
||||||
|
{
|
||||||
|
AT_PRINTK("[ATM?]: _AT_MP_HELP_");
|
||||||
|
}
|
||||||
|
|
||||||
|
log_item_t at_mp_items[] = {
|
||||||
|
{"ATMG", fATMG,}, // MP GPIO test
|
||||||
|
{"ATMR", fATMR,}, // MP SDR test
|
||||||
|
{"ATM#", fATMt,}, // test command
|
||||||
|
{"ATM?", fATMx,}, // Help
|
||||||
|
#if CONFIG_ATCMD_MP_EXT0
|
||||||
|
{"ATM0", fATM0,}, // MP ext0 AT command
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
void at_mp_init(void)
|
||||||
|
{
|
||||||
|
log_service_add_table(at_mp_items, sizeof(at_mp_items)/sizeof(at_mp_items[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SUPPORT_LOG_SERVICE
|
||||||
|
log_module_init(at_mp_init);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // #if CONFIG_ATCMD_MP
|
||||||
|
|
12
RTLGDB/USDK/component/common/api/at_cmd/atcmd_mp.h
Normal file
12
RTLGDB/USDK/component/common/api/at_cmd/atcmd_mp.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef __ATCMD_MP_H__
|
||||||
|
#define __ATCMD_MP_H__
|
||||||
|
|
||||||
|
#define CONFIG_ATCMD_MP_EXT0 0 //support MP ext0 AT command
|
||||||
|
|
||||||
|
typedef struct _at_command_mp_ext_item_{
|
||||||
|
char *mp_ext_cmd;
|
||||||
|
int (*mp_ext_fun)(void **argv, int argc);
|
||||||
|
char *mp_ext_usage;
|
||||||
|
}at_mp_ext_item_t;
|
||||||
|
|
||||||
|
#endif
|
1434
RTLGDB/USDK/component/common/api/at_cmd/atcmd_sys.c
Normal file
1434
RTLGDB/USDK/component/common/api/at_cmd/atcmd_sys.c
Normal file
File diff suppressed because it is too large
Load diff
6
RTLGDB/USDK/component/common/api/at_cmd/atcmd_sys.h
Normal file
6
RTLGDB/USDK/component/common/api/at_cmd/atcmd_sys.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef __ATCMD_SYS_H__
|
||||||
|
#define __ATCMD_SYS_H__
|
||||||
|
#ifdef CONFIG_AT_SYS
|
||||||
|
#endif //
|
||||||
|
|
||||||
|
#endif
|
2836
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi.c
Normal file
2836
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi.c
Normal file
File diff suppressed because it is too large
Load diff
166
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi.h
Normal file
166
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi.h
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
#ifndef __ATCMD_WIFI_H__
|
||||||
|
#define __ATCMD_WIFI_H__
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "lwip_netconf.h"
|
||||||
|
#ifdef USE_FLASH_EEP
|
||||||
|
#include "flash_eep.h"
|
||||||
|
#include "feep_config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WLAN0_NAME
|
||||||
|
#define WLAN0_NAME "wlan0"
|
||||||
|
#endif
|
||||||
|
#ifndef WLAN1_NAME
|
||||||
|
#define WLAN1_NAME "wlan1"
|
||||||
|
#endif
|
||||||
|
/* Give default value if not defined */
|
||||||
|
#ifndef NET_IF_NUM
|
||||||
|
#ifdef CONFIG_CONCURRENT_MODE
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN) + 1)
|
||||||
|
#else
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN))
|
||||||
|
#endif // end of CONFIG_CONCURRENT_MODE
|
||||||
|
#endif // end of NET_IF_NUM
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef IP_ADDR0
|
||||||
|
#define IP_ADDR0 192
|
||||||
|
#define IP_ADDR1 168
|
||||||
|
#define IP_ADDR2 3
|
||||||
|
#define IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef NETMASK_ADDR0
|
||||||
|
#define NETMASK_ADDR0 255
|
||||||
|
#define NETMASK_ADDR1 255
|
||||||
|
#define NETMASK_ADDR2 255
|
||||||
|
#define NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef GW_ADDR0
|
||||||
|
#define GW_ADDR0 192
|
||||||
|
#define GW_ADDR1 168
|
||||||
|
#define GW_ADDR2 3
|
||||||
|
#define GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef AP_IP_ADDR0
|
||||||
|
#define AP_IP_ADDR0 192
|
||||||
|
#define AP_IP_ADDR1 168
|
||||||
|
#define AP_IP_ADDR2 43
|
||||||
|
#define AP_IP_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef AP_NETMASK_ADDR0
|
||||||
|
#define AP_NETMASK_ADDR0 255
|
||||||
|
#define AP_NETMASK_ADDR1 255
|
||||||
|
#define AP_NETMASK_ADDR2 255
|
||||||
|
#define AP_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef AP_GW_ADDR0
|
||||||
|
#define AP_GW_ADDR0 192
|
||||||
|
#define AP_GW_ADDR1 168
|
||||||
|
#define AP_GW_ADDR2 43
|
||||||
|
#define AP_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
#include "wifi_structures.h"
|
||||||
|
#include <wlan_fast_connect/example_wlan_fast_connect.h>
|
||||||
|
typedef struct _UART_LOG_CONF_{
|
||||||
|
u32 BaudRate;
|
||||||
|
u8 DataBits;
|
||||||
|
u8 StopBits;
|
||||||
|
u8 Parity;
|
||||||
|
u8 FlowControl;
|
||||||
|
}UART_LOG_CONF, *PUART_LOG_CONF;
|
||||||
|
|
||||||
|
#define ATCMD_WIFI_CONN_STORE_MAX_NUM (1)
|
||||||
|
struct atcmd_wifi_conf{
|
||||||
|
int32_t auto_enable;
|
||||||
|
rtw_wifi_setting_t setting;
|
||||||
|
int32_t reconn_num;
|
||||||
|
int32_t reconn_last_index;
|
||||||
|
struct wlan_fast_reconnect reconn[ATCMD_WIFI_CONN_STORE_MAX_NUM];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ATCMD_LWIP_CONN_STORE_MAX_NUM (1)
|
||||||
|
struct atcmd_lwip_conn_info{
|
||||||
|
int32_t role; //client, server or seed
|
||||||
|
uint32_t protocol; //tcp or udp
|
||||||
|
uint32_t remote_addr; //remote ip
|
||||||
|
uint32_t remote_port; //remote port
|
||||||
|
uint32_t local_addr; //locale ip, not used yet
|
||||||
|
uint32_t local_port; //locale port, not used yet
|
||||||
|
uint32_t reserved; //reserve for further use
|
||||||
|
};
|
||||||
|
struct atcmd_lwip_conf {
|
||||||
|
int32_t enable; //enable or not
|
||||||
|
int32_t conn_num;
|
||||||
|
int32_t last_index;
|
||||||
|
int32_t reserved; //reserve for further use
|
||||||
|
struct atcmd_lwip_conn_info conn[ATCMD_LWIP_CONN_STORE_MAX_NUM];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AT_PARTITION_ALL = 0,
|
||||||
|
AT_PARTITION_UART = 1,
|
||||||
|
AT_PARTITION_WIFI = 2,
|
||||||
|
AT_PARTITION_LWIP = 3
|
||||||
|
} AT_PARTITION;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AT_PARTITION_READ = 0,
|
||||||
|
AT_PARTITION_WRITE = 1,
|
||||||
|
AT_PARTITION_ERASE = 2
|
||||||
|
} AT_PARTITION_OP;
|
||||||
|
|
||||||
|
//first segment for uart
|
||||||
|
#define UART_SETTING_BACKUP_SECTOR (0x8000)
|
||||||
|
#define UART_CONF_DATA_OFFSET (0)
|
||||||
|
#define UART_CONF_DATA_SIZE ((((sizeof(UART_LOG_CONF)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
//second segment for wifi config
|
||||||
|
#define WIFI_CONF_DATA_OFFSET (UART_CONF_DATA_OFFSET+UART_CONF_DATA_SIZE)
|
||||||
|
#define WIFI_CONF_DATA_SIZE ((((sizeof(struct atcmd_wifi_conf)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
//fouth segment for lwip config
|
||||||
|
#define LWIP_CONF_DATA_OFFSET (WIFI_CONF_DATA_OFFSET+WIFI_CONF_DATA_SIZE)
|
||||||
|
#define LWIP_CONF_DATA_SIZE ((((sizeof(struct atcmd_lwip_conf)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
extern void atcmd_update_partition_info(AT_PARTITION id, AT_PARTITION_OP ops, u8 *data, u16 len);
|
||||||
|
|
||||||
|
#define ATSTRING_LEN (LOG_SERVICE_BUFLEN)
|
||||||
|
extern char at_string[ATSTRING_LEN];
|
||||||
|
|
||||||
|
extern unsigned char gAT_Echo; // default echo on
|
||||||
|
//extern void uart_at_lock(void);
|
||||||
|
//extern void uart_at_unlock(void);
|
||||||
|
extern void uart_at_send_string(char *str);
|
||||||
|
extern void uart_at_send_buf(u8 *buf, u32 len);
|
||||||
|
|
||||||
|
#define at_printf(fmt, args...) do{\
|
||||||
|
/*uart_at_lock();*/\
|
||||||
|
snprintf(at_string, ATSTRING_LEN, fmt, ##args); \
|
||||||
|
uart_at_send_string(at_string);\
|
||||||
|
/*uart_at_unlock();*/\
|
||||||
|
}while(0)
|
||||||
|
#define at_print_data(data, size) do{\
|
||||||
|
/*uart_at_lock();*/\
|
||||||
|
uart_at_send_buf(data, size);\
|
||||||
|
/*uart_at_unlock();*/\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define at_printf(fmt, args...) do{printf(fmt, ##args);}while(0)
|
||||||
|
#define at_print_data(data, size) do{__rtl_memDump(data, size, NULL);}while(0)
|
||||||
|
#endif//#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
|
||||||
|
#endif
|
2873
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi1.c
Normal file
2873
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi1.c
Normal file
File diff suppressed because it is too large
Load diff
171
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi1.h
Normal file
171
RTLGDB/USDK/component/common/api/at_cmd/atcmd_wifi1.h
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
#ifndef __ATCMD_WIFI_H__
|
||||||
|
#define __ATCMD_WIFI_H__
|
||||||
|
#include <platform_opts.h>
|
||||||
|
#ifdef CONFIG_AT_WIFI
|
||||||
|
#include "main.h"
|
||||||
|
#include "lwip_netconf.h"
|
||||||
|
#ifdef USE_FLASH_EEP
|
||||||
|
#include "flash_eep.h"
|
||||||
|
#include "feep_config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WLAN0_NAME
|
||||||
|
#define WLAN0_NAME "wlan0"
|
||||||
|
#endif
|
||||||
|
#ifndef WLAN1_NAME
|
||||||
|
#define WLAN1_NAME "wlan1"
|
||||||
|
#endif
|
||||||
|
/* Give default value if not defined */
|
||||||
|
#ifndef NET_IF_NUM
|
||||||
|
#ifdef CONFIG_CONCURRENT_MODE
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN) + 1)
|
||||||
|
#else
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN))
|
||||||
|
#endif // end of CONFIG_CONCURRENT_MODE
|
||||||
|
#endif // end of NET_IF_NUM
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef IP_ADDR0
|
||||||
|
#define IP_ADDR0 192
|
||||||
|
#define IP_ADDR1 168
|
||||||
|
#define IP_ADDR2 3
|
||||||
|
#define IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef NETMASK_ADDR0
|
||||||
|
#define NETMASK_ADDR0 255
|
||||||
|
#define NETMASK_ADDR1 255
|
||||||
|
#define NETMASK_ADDR2 255
|
||||||
|
#define NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef GW_ADDR0
|
||||||
|
#define GW_ADDR0 192
|
||||||
|
#define GW_ADDR1 168
|
||||||
|
#define GW_ADDR2 3
|
||||||
|
#define GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef AP_IP_ADDR0
|
||||||
|
#define AP_IP_ADDR0 192
|
||||||
|
#define AP_IP_ADDR1 168
|
||||||
|
#define AP_IP_ADDR2 43
|
||||||
|
#define AP_IP_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef AP_NETMASK_ADDR0
|
||||||
|
#define AP_NETMASK_ADDR0 255
|
||||||
|
#define AP_NETMASK_ADDR1 255
|
||||||
|
#define AP_NETMASK_ADDR2 255
|
||||||
|
#define AP_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef AP_GW_ADDR0
|
||||||
|
#define AP_GW_ADDR0 192
|
||||||
|
#define AP_GW_ADDR1 168
|
||||||
|
#define AP_GW_ADDR2 43
|
||||||
|
#define AP_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // CONFIG_AT_WIFI
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
|
||||||
|
#include "wifi_structures.h"
|
||||||
|
#include <wlan_fast_connect/example_wlan_fast_connect.h>
|
||||||
|
typedef struct _UART_LOG_CONF_{
|
||||||
|
u32 BaudRate;
|
||||||
|
u8 DataBits;
|
||||||
|
u8 StopBits;
|
||||||
|
u8 Parity;
|
||||||
|
u8 FlowControl;
|
||||||
|
}UART_LOG_CONF, *PUART_LOG_CONF;
|
||||||
|
|
||||||
|
#define ATCMD_WIFI_CONN_STORE_MAX_NUM (1)
|
||||||
|
struct atcmd_wifi_conf{
|
||||||
|
struct wlan_fast_reconnect reconn[ATCMD_WIFI_CONN_STORE_MAX_NUM];
|
||||||
|
int32_t auto_enable;
|
||||||
|
rtw_wifi_setting_t setting;
|
||||||
|
int32_t reconn_num;
|
||||||
|
int32_t reconn_last_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ATCMD_LWIP_CONN_STORE_MAX_NUM (1)
|
||||||
|
struct atcmd_lwip_conn_info{
|
||||||
|
int32_t role; //client, server or seed
|
||||||
|
uint32_t protocol; //tcp or udp
|
||||||
|
uint32_t remote_addr; //remote ip
|
||||||
|
uint32_t remote_port; //remote port
|
||||||
|
uint32_t local_addr; //locale ip, not used yet
|
||||||
|
uint32_t local_port; //locale port, not used yet
|
||||||
|
uint32_t reserved; //reserve for further use
|
||||||
|
};
|
||||||
|
struct atcmd_lwip_conf {
|
||||||
|
int32_t enable; //enable or not
|
||||||
|
int32_t conn_num;
|
||||||
|
int32_t last_index;
|
||||||
|
int32_t reserved; //reserve for further use
|
||||||
|
struct atcmd_lwip_conn_info conn[ATCMD_LWIP_CONN_STORE_MAX_NUM];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AT_PARTITION_ALL = 0,
|
||||||
|
AT_PARTITION_UART = FEEP_ID_UART_CFG,
|
||||||
|
AT_PARTITION_WIFI = FEEP_ID_WIFI_CFG,
|
||||||
|
AT_PARTITION_LWIP = FEEP_ID_LWIP_CFG
|
||||||
|
} AT_PARTITION;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AT_PARTITION_READ = 0,
|
||||||
|
AT_PARTITION_WRITE = 1,
|
||||||
|
AT_PARTITION_ERASE = 2
|
||||||
|
} AT_PARTITION_OP;
|
||||||
|
|
||||||
|
//first segment for uart
|
||||||
|
#define UART_SETTING_BACKUP_SECTOR (0x8000)
|
||||||
|
#define UART_CONF_DATA_OFFSET (0)
|
||||||
|
#define UART_CONF_DATA_SIZE ((((sizeof(UART_LOG_CONF)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
//second segment for wifi config
|
||||||
|
#define WIFI_CONF_DATA_OFFSET (UART_CONF_DATA_OFFSET+UART_CONF_DATA_SIZE)
|
||||||
|
#define WIFI_CONF_DATA_SIZE ((((sizeof(struct atcmd_wifi_conf)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
//fouth segment for lwip config
|
||||||
|
#define LWIP_CONF_DATA_OFFSET (WIFI_CONF_DATA_OFFSET+WIFI_CONF_DATA_SIZE)
|
||||||
|
#define LWIP_CONF_DATA_SIZE ((((sizeof(struct atcmd_lwip_conf)-1)>>2) + 1)<<2)
|
||||||
|
|
||||||
|
extern void atcmd_update_partition_info(AT_PARTITION id, AT_PARTITION_OP ops, u8 *data, u16 len);
|
||||||
|
|
||||||
|
#define ATSTRING_LEN (LOG_SERVICE_BUFLEN)
|
||||||
|
extern char at_string[ATSTRING_LEN];
|
||||||
|
|
||||||
|
extern unsigned char gAT_Echo; // default echo on
|
||||||
|
//extern void uart_at_lock(void);
|
||||||
|
//extern void uart_at_unlock(void);
|
||||||
|
extern void uart_at_send_string(char *str);
|
||||||
|
extern void uart_at_send_buf(u8 *buf, u32 len);
|
||||||
|
|
||||||
|
#define at_printf(fmt, args...) do{\
|
||||||
|
/*uart_at_lock();*/\
|
||||||
|
snprintf(at_string, ATSTRING_LEN, fmt, ##args); \
|
||||||
|
uart_at_send_string(at_string);\
|
||||||
|
/*uart_at_unlock();*/\
|
||||||
|
}while(0)
|
||||||
|
#define at_print_data(data, size) do{\
|
||||||
|
/*uart_at_lock();*/\
|
||||||
|
uart_at_send_buf(data, size);\
|
||||||
|
/*uart_at_unlock();*/\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define at_printf(fmt, args...) do{printf(fmt, ##args);}while(0)
|
||||||
|
#define at_print_data(data, size) do{__rtl_memDump(data, size, NULL);}while(0)
|
||||||
|
#endif//#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
|
||||||
|
#endif
|
497
RTLGDB/USDK/component/common/api/at_cmd/log_service.c
Normal file
497
RTLGDB/USDK/component/common/api/at_cmd/log_service.c
Normal file
|
@ -0,0 +1,497 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1)
|
||||||
|
#include "freertos_pmu.h"
|
||||||
|
#endif
|
||||||
|
#include "log_service.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "semphr.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "wifi_util.h"
|
||||||
|
#include "atcmd_wifi.h"
|
||||||
|
#include "osdep_api.h"
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
#include "atcmd_lwip.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SUPPORT_LOG_SERVICE
|
||||||
|
//======================================================
|
||||||
|
struct list_head log_hash[ATC_INDEX_NUM];
|
||||||
|
#ifdef CONFIG_AT_USR
|
||||||
|
extern void at_user_init(void);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_AT_WIFI
|
||||||
|
extern void at_wifi_init(void);
|
||||||
|
#endif
|
||||||
|
//extern void at_fs_init(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_AT_SYS
|
||||||
|
extern void at_sys_init(void);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
extern void at_ethernet_init(void);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_GOOGLE_NEST
|
||||||
|
extern void at_google_init(void);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_AT_LWIP
|
||||||
|
extern void at_transport_init(void);
|
||||||
|
#endif
|
||||||
|
//extern void at_app_init(void);
|
||||||
|
#if CONFIG_ALINK
|
||||||
|
extern void at_cloud_init(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
char log_buf[LOG_SERVICE_BUFLEN];
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
char log_history[LOG_HISTORY_LEN][LOG_SERVICE_BUFLEN];
|
||||||
|
static unsigned int log_history_count = 0;
|
||||||
|
#endif
|
||||||
|
xSemaphoreHandle log_rx_interrupt_sema = NULL;
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
xSemaphoreHandle log_service_sema = NULL;
|
||||||
|
#endif
|
||||||
|
extern xSemaphoreHandle uart_rx_interrupt_sema;
|
||||||
|
|
||||||
|
#if CONFIG_INIC_EN
|
||||||
|
extern unsigned char inic_cmd_ioctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__ICCARM__)
|
||||||
|
#pragma section=".data.log_init"
|
||||||
|
|
||||||
|
unsigned int __log_init_begin__;
|
||||||
|
unsigned int __log_init_end__;
|
||||||
|
#elif defined ( __CC_ARM ) || defined(__GNUC__)
|
||||||
|
//#pragma section=".data.log_init"
|
||||||
|
log_init_t* __log_init_begin__;
|
||||||
|
log_init_t* __log_init_end__;
|
||||||
|
log_init_t log_init_table[] = {
|
||||||
|
|
||||||
|
#ifdef CONFIG_AT_WIFI
|
||||||
|
at_wifi_init,
|
||||||
|
#endif
|
||||||
|
// at_fs_init,
|
||||||
|
#ifdef CONFIG_AT_SYS
|
||||||
|
at_sys_init,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
at_ethernet_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_GOOGLE_NEST
|
||||||
|
at_google_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_TRANSPORT
|
||||||
|
at_transport_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_ALINK
|
||||||
|
at_cloud_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_AT_USR
|
||||||
|
at_user_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// at_app_init
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#error "not implement, add to linker script"
|
||||||
|
extern unsigned int __log_init_begin__;
|
||||||
|
extern unsigned int __log_init_end__;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define USE_STRSEP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//======================================================
|
||||||
|
int hash_index(char *str)
|
||||||
|
{
|
||||||
|
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
|
||||||
|
unsigned int hash = 0;
|
||||||
|
|
||||||
|
while (*str)
|
||||||
|
{
|
||||||
|
hash = hash * seed + (*str++);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (hash & 0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_add_new_command(log_item_t *new)
|
||||||
|
{
|
||||||
|
int index = hash_index(new->log_cmd)%ATC_INDEX_NUM;
|
||||||
|
|
||||||
|
list_add(&new->node, &log_hash[index]);
|
||||||
|
}
|
||||||
|
void start_log_service(void);
|
||||||
|
void log_service_init(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#if defined (__ICCARM__)
|
||||||
|
log_init_t *log_init_table;
|
||||||
|
__log_init_begin__ = (unsigned int)__section_begin(".data.log_init");
|
||||||
|
__log_init_end__ = (unsigned int)__section_end(".data.log_init");
|
||||||
|
log_init_table = (log_init_t *)__log_init_begin__;
|
||||||
|
#elif defined(__CC_ARM) || defined(__GNUC__)
|
||||||
|
__log_init_begin__ = log_init_table;
|
||||||
|
__log_init_end__ = log_init_table + sizeof(log_init_table);
|
||||||
|
#else
|
||||||
|
#error "not implement"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
for(i=0;i<ATC_INDEX_NUM;i++)
|
||||||
|
INIT_LIST_HEAD(&log_hash[i]);
|
||||||
|
|
||||||
|
for(i=0;i<(__log_init_end__-__log_init_begin__)/sizeof(log_init_t); i++)
|
||||||
|
log_init_table[i]();
|
||||||
|
|
||||||
|
/* Initial uart rx swmaphore*/
|
||||||
|
vSemaphoreCreateBinary(log_rx_interrupt_sema);
|
||||||
|
xSemaphoreTake(log_rx_interrupt_sema, 1/portTICK_RATE_MS);
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
log_service_lock_init();
|
||||||
|
#endif
|
||||||
|
start_log_service();
|
||||||
|
}
|
||||||
|
|
||||||
|
//sizeof(log_items)/sizeof(log_items[0])
|
||||||
|
void log_service_add_table(log_item_t *tbl, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0;i<len;i++)
|
||||||
|
log_add_new_command(&tbl[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* log_action(char *cmd)
|
||||||
|
{
|
||||||
|
int search_cnt=0;
|
||||||
|
int index = hash_index(cmd)%ATC_INDEX_NUM;
|
||||||
|
struct list_head *head = &log_hash[index];
|
||||||
|
struct list_head *iterator;
|
||||||
|
log_item_t *item;
|
||||||
|
void *act = NULL;
|
||||||
|
|
||||||
|
list_for_each(iterator, head) {
|
||||||
|
item = list_entry(iterator, log_item_t, node);
|
||||||
|
search_cnt++;
|
||||||
|
if( strcmp(item->log_cmd, cmd) == 0){
|
||||||
|
//printf("%s match %s, search cnt %d\n\r", cmd, item->log_cmd, search_cnt);
|
||||||
|
act = (void*)item->at_act;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return act;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* log_handler(char *cmd)
|
||||||
|
{
|
||||||
|
log_act_t action=NULL;
|
||||||
|
char buf[LOG_SERVICE_BUFLEN] = {0};
|
||||||
|
char *copy=buf;
|
||||||
|
char *token = NULL;
|
||||||
|
char *param = NULL;
|
||||||
|
char tok[5] = {0};//'\0'
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
strcpy(log_history[((log_history_count++)%LOG_HISTORY_LEN)], log_buf);
|
||||||
|
#endif
|
||||||
|
strncpy(copy, cmd,LOG_SERVICE_BUFLEN-1);
|
||||||
|
|
||||||
|
#if defined(USE_STRSEP)
|
||||||
|
token = _strsep(©, "=");
|
||||||
|
param = copy;
|
||||||
|
#else
|
||||||
|
token = strtok(copy, "=");
|
||||||
|
param = strtok(NULL, NULL);
|
||||||
|
#endif
|
||||||
|
if(token && (strlen(token) <= 4))
|
||||||
|
strcpy(tok, token);
|
||||||
|
else{
|
||||||
|
//printf("\n\rAT Cmd format error!\n");
|
||||||
|
return NULL;
|
||||||
|
};
|
||||||
|
//printf(" Command %s \n\r ", tok);
|
||||||
|
//printf(" Param %s \n\r", param);
|
||||||
|
action = (log_act_t)log_action(tok);
|
||||||
|
|
||||||
|
if(action){
|
||||||
|
action(param);
|
||||||
|
}
|
||||||
|
return (void*)action;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_param(char *buf, char **argv)
|
||||||
|
{
|
||||||
|
int argc = 1;
|
||||||
|
char str_buf[LOG_SERVICE_BUFLEN] = "\0";
|
||||||
|
int str_count = 0;
|
||||||
|
int buf_cnt = 0;
|
||||||
|
|
||||||
|
if(buf == NULL)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
while((argc < MAX_ARGC) && (*buf != '\0')) {
|
||||||
|
while((*buf == ',') || (*buf == '[') || (*buf == ']')){
|
||||||
|
if((*buf == ',') && (*(buf+1) == ',')){
|
||||||
|
argv[argc] = NULL;
|
||||||
|
argc++;
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*buf == '\0')
|
||||||
|
break;
|
||||||
|
else if(*buf == '"'){
|
||||||
|
memset(str_buf,'\0',LOG_SERVICE_BUFLEN);
|
||||||
|
str_count = 0;
|
||||||
|
buf_cnt = 0;
|
||||||
|
*buf = '\0';
|
||||||
|
buf ++;
|
||||||
|
if(*buf == '\0')
|
||||||
|
break;
|
||||||
|
argv[argc] = buf;
|
||||||
|
while((*buf != '"')&&(*buf != '\0')){
|
||||||
|
if(*buf == '\\'){
|
||||||
|
buf ++;
|
||||||
|
buf_cnt++;
|
||||||
|
}
|
||||||
|
str_buf[str_count] = *buf;
|
||||||
|
str_count++;
|
||||||
|
buf_cnt++;
|
||||||
|
buf ++;
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
memcpy(buf-buf_cnt,str_buf,buf_cnt);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
argv[argc] = buf;
|
||||||
|
}
|
||||||
|
argc++;
|
||||||
|
buf++;
|
||||||
|
|
||||||
|
while( (*buf != ',')&&(*buf != '\0')&&(*buf != '[')&&(*buf != ']') )
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
return argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char gDbgLevel = AT_DBG_ERROR;
|
||||||
|
unsigned int gDbgFlag = 0xFFFFFFFF;
|
||||||
|
void at_set_debug_level(unsigned char newDbgLevel)
|
||||||
|
{
|
||||||
|
gDbgLevel = newDbgLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void at_set_debug_mask(unsigned int newDbgFlag)
|
||||||
|
{
|
||||||
|
gDbgFlag = newDbgFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SUPPORT_INTERACTIVE_MODE
|
||||||
|
extern char uart_buf[64];
|
||||||
|
void legency_interactive_handler(unsigned char argc, unsigned char **argv)
|
||||||
|
{
|
||||||
|
#if 0 //defined(CONFIG_PLATFORM_8195A)
|
||||||
|
if(argc<1)
|
||||||
|
{
|
||||||
|
DiagPrintf("Wrong argument number!\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DiagPrintf("Wlan Normal Mode\n");
|
||||||
|
|
||||||
|
WlanNormal( argc, argv);
|
||||||
|
#else
|
||||||
|
strncpy(uart_buf, log_buf, 63);//uart_buf[64]
|
||||||
|
xSemaphoreGive(uart_rx_interrupt_sema);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
#ifndef WLAN0_NAME
|
||||||
|
#define WLAN0_NAME "wlan0"
|
||||||
|
#endif
|
||||||
|
#ifndef WLAN1_NAME
|
||||||
|
#define WLAN1_NAME "wlan1"
|
||||||
|
#endif
|
||||||
|
int mp_commnad_handler(char *cmd)
|
||||||
|
{
|
||||||
|
char buf[64] = {0};
|
||||||
|
char *token = NULL;
|
||||||
|
|
||||||
|
//strcpy(buf, cmd);
|
||||||
|
strncpy(buf, cmd, (64-1));
|
||||||
|
token = strtok(buf, " ");
|
||||||
|
if(token && (strcmp(buf, "iwpriv") == 0)){
|
||||||
|
token = strtok(NULL, "");
|
||||||
|
wext_private_command(WLAN0_NAME, token, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
void print_help_msg(void){
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
extern void print_wlan_help(void);
|
||||||
|
print_wlan_help();
|
||||||
|
#endif
|
||||||
|
//add other help message print here
|
||||||
|
}
|
||||||
|
|
||||||
|
int print_help_handler(char *cmd){
|
||||||
|
if(strcmp(cmd, "help") == 0){
|
||||||
|
print_help_msg();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
void log_service_lock(void)
|
||||||
|
{
|
||||||
|
rtw_down_sema(&log_service_sema);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 log_service_lock_timeout(u32 ms)
|
||||||
|
{
|
||||||
|
return rtw_down_timeout_sema(&log_service_sema, ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_service_unlock(void)
|
||||||
|
{
|
||||||
|
rtw_up_sema(&log_service_sema);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_service_lock_init(void){
|
||||||
|
rtw_init_sema(&log_service_sema, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void log_service(void *param)
|
||||||
|
{
|
||||||
|
_AT_DBG_MSG(AT_FLAG_COMMON, AT_DBG_ALWAYS, "\n\rStart LOG SERVICE MODE\n\r");
|
||||||
|
_AT_DBG_MSG(AT_FLAG_COMMON, AT_DBG_ALWAYS, "\n\r# ");
|
||||||
|
while(1){
|
||||||
|
while(xSemaphoreTake(log_rx_interrupt_sema, portMAX_DELAY) != pdTRUE);
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
log_service_lock();
|
||||||
|
#endif
|
||||||
|
if(log_handler((char *)log_buf) == NULL){
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
if(mp_commnad_handler((char *)log_buf) < 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#if SUPPORT_INTERACTIVE_MODE
|
||||||
|
print_help_handler((char *)log_buf);
|
||||||
|
legency_interactive_handler(NULL, NULL);
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
log_service_unlock();
|
||||||
|
#endif
|
||||||
|
continue;
|
||||||
|
#else
|
||||||
|
if(print_help_handler((char *)log_buf) < 0){
|
||||||
|
at_printf("\r\nunknown command '%s'", log_buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_buf[0] = '\0';
|
||||||
|
#if CONFIG_INIC_EN
|
||||||
|
inic_cmd_ioctl = 0;
|
||||||
|
#endif
|
||||||
|
_AT_DBG_MSG(AT_FLAG_COMMON, AT_DBG_ALWAYS, "\n\r[MEM] After do cmd, available heap %d+%d\n\r", xPortGetFreeHeapSize(), tcm_heap_freeSpace());
|
||||||
|
_AT_DBG_MSG(AT_FLAG_COMMON, AT_DBG_ALWAYS, "\r\n\n# "); //"#" is needed for mp tool
|
||||||
|
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||||
|
if(atcmd_lwip_is_tt_mode())
|
||||||
|
at_printf(STR_END_OF_ATDATA_RET);
|
||||||
|
else
|
||||||
|
at_printf(STR_END_OF_ATCMD_RET);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
log_service_unlock();
|
||||||
|
#endif
|
||||||
|
#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1)
|
||||||
|
release_wakelock(WAKELOCK_LOGUART);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define STACKSIZE 1280
|
||||||
|
void start_log_service(void)
|
||||||
|
{
|
||||||
|
xTaskHandle CreatedTask;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
#if 0 // CONFIG_USE_TCM_HEAP
|
||||||
|
extern void *tcm_heap_malloc(int size);
|
||||||
|
void *stack_addr = tcm_heap_malloc(STACKSIZE * sizeof(int));
|
||||||
|
|
||||||
|
if(stack_addr == NULL){
|
||||||
|
}
|
||||||
|
|
||||||
|
result = xTaskGenericCreate(
|
||||||
|
log_service,
|
||||||
|
( signed portCHAR * ) "log_srv",
|
||||||
|
STACKSIZE,
|
||||||
|
NULL,
|
||||||
|
tskIDLE_PRIORITY + 5,
|
||||||
|
&CreatedTask,
|
||||||
|
stack_addr,
|
||||||
|
NULL);
|
||||||
|
#else
|
||||||
|
result = xTaskCreate( log_service, ( signed portCHAR * ) "log_srv", STACKSIZE, NULL, tskIDLE_PRIORITY + 5, &CreatedTask );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(result != pdPASS) {
|
||||||
|
printf("\n\r%s xTaskCreate failed", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void fAT_exit(void *arg){
|
||||||
|
printf("\n\rLeave LOG SERVICE");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
void fAT_log(void *arg){
|
||||||
|
int i = 0;
|
||||||
|
printf("[AT]log history:\n\n\r");
|
||||||
|
if(log_history_count > LOG_HISTORY_LEN){
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
printf(" %s\n\r", log_history[((log_history_count+i)%LOG_HISTORY_LEN)]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
for(i=0; i<(log_history_count-1); i++)
|
||||||
|
printf(" %s\n\r", log_history[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
log_item_t at_log_items[ ] = {
|
||||||
|
{"AT--", fAT_exit,},
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
{"AT??", fAT_log,},
|
||||||
|
#endif
|
||||||
|
{"ATxx", fAT_exit,}
|
||||||
|
};
|
||||||
|
void at_log_init(void)
|
||||||
|
{
|
||||||
|
log_service_add_table(at_log_items, sizeof(at_log_items)/sizeof(at_log_items[0]));
|
||||||
|
}
|
||||||
|
log_module_init(at_log_init);
|
||||||
|
#endif
|
123
RTLGDB/USDK/component/common/api/at_cmd/log_service.h
Normal file
123
RTLGDB/USDK/component/common/api/at_cmd/log_service.h
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#ifndef LOG_SERVICE_H
|
||||||
|
#define LOG_SERVICE_H
|
||||||
|
|
||||||
|
#include "dlist.h"
|
||||||
|
/*
|
||||||
|
* Include user defined options first. Anything not defined in these files
|
||||||
|
* will be set to standard values. Override anything you dont like!
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B)
|
||||||
|
#include "platform_opts.h"
|
||||||
|
#include "platform_stdlib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __ICCARM__
|
||||||
|
#define STRINGIFY(s) #s
|
||||||
|
#define SECTION(_name) _Pragma( STRINGIFY(location=_name))
|
||||||
|
#define log_module_init(fn) \
|
||||||
|
SECTION(".data.log_init") __root static void* log_##fn = (void*)fn
|
||||||
|
#elif defined(__CC_ARM)
|
||||||
|
#define log_module_init(fn) \
|
||||||
|
static void* log_##fn __attribute__((section(".data.log_init"))) = (void*)fn;
|
||||||
|
#define DiagPrintf printf
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#define log_module_init(fn) \
|
||||||
|
static void* log_##fn __attribute__((section(".data.log_init"))) = (void*)fn;
|
||||||
|
#else
|
||||||
|
#error "not implement"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ATC_INDEX_NUM 32
|
||||||
|
|
||||||
|
#ifndef SUPPORT_LOG_SERVICE
|
||||||
|
#define SUPPORT_LOG_SERVICE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//LOG_SERVICE_BUFLEN: default, only 63 bytes could be used for keeping input
|
||||||
|
// cmd, the last byte is for string end ('\0').
|
||||||
|
#ifndef LOG_SERVICE_BUFLEN
|
||||||
|
#define LOG_SERVICE_BUFLEN 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_LOG_HISTORY
|
||||||
|
#define CONFIG_LOG_HISTORY 0
|
||||||
|
#if CONFIG_LOG_HISTORY
|
||||||
|
#define LOG_HISTORY_LEN 5
|
||||||
|
#endif
|
||||||
|
#endif //#ifndef CONFIG_LOG_HISTORY
|
||||||
|
|
||||||
|
#ifndef MAX_ARGC
|
||||||
|
#define MAX_ARGC 12
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_LOG_SERVICE_LOCK
|
||||||
|
#define CONFIG_LOG_SERVICE_LOCK 0 // //to protect log_buf[], only one command processed per time
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AT_BIT(n) (1<<n)
|
||||||
|
#define AT_FLAG_DUMP AT_BIT(0)
|
||||||
|
#define AT_FLAG_EDIT AT_BIT(1)
|
||||||
|
#define AT_FLAG_ADC AT_BIT(2)
|
||||||
|
#define AT_FLAG_GPIO AT_BIT(3)
|
||||||
|
#define AT_FLAG_OTA AT_BIT(4)
|
||||||
|
#define AT_FLAG_NFC AT_BIT(5)
|
||||||
|
#define AT_FLAG_OS AT_BIT(6)
|
||||||
|
#define AT_FLAG_LWIP AT_BIT(7)
|
||||||
|
#define AT_FLAG_COMMON AT_BIT(8)
|
||||||
|
#define AT_FLAG_WIFI AT_BIT(9)
|
||||||
|
|
||||||
|
enum{
|
||||||
|
AT_DBG_OFF = 0,
|
||||||
|
AT_DBG_ALWAYS,
|
||||||
|
AT_DBG_ERROR,
|
||||||
|
AT_DBG_WARNING,
|
||||||
|
AT_DBG_INFO
|
||||||
|
};
|
||||||
|
|
||||||
|
extern unsigned char gDbgLevel;
|
||||||
|
extern unsigned int gDbgFlag;
|
||||||
|
|
||||||
|
#define AT_PRINTK(fmt, args...) printf(fmt"\r\n",## args)
|
||||||
|
#define _AT_PRINTK(fmt, args...) printf(fmt,## args)
|
||||||
|
#define AT_DBG_MSG(flag, level, fmt, args...) \
|
||||||
|
do{ \
|
||||||
|
if(((flag) & gDbgFlag) && (level <= gDbgLevel)){ \
|
||||||
|
AT_PRINTK(fmt,## args); \
|
||||||
|
} \
|
||||||
|
}while(0)
|
||||||
|
#define _AT_DBG_MSG(flag, level, fmt, args...) \
|
||||||
|
do{ \
|
||||||
|
if(((flag) & gDbgFlag) && (level <= gDbgLevel)){ \
|
||||||
|
_AT_PRINTK(fmt,## args); \
|
||||||
|
} \
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#ifndef SUPPORT_INTERACTIVE_MODE
|
||||||
|
#define SUPPORT_INTERACTIVE_MODE 0
|
||||||
|
#endif //#ifndef SUPPORT_INTERACTIVE_MODE
|
||||||
|
|
||||||
|
typedef void (*log_init_t)(void);
|
||||||
|
typedef void (*log_act_t)(void*);
|
||||||
|
typedef struct _at_command_item_{
|
||||||
|
char *log_cmd;
|
||||||
|
log_act_t at_act;
|
||||||
|
struct list_head node;
|
||||||
|
}log_item_t;
|
||||||
|
|
||||||
|
void log_service_add_table(log_item_t *tbl, int len);
|
||||||
|
int parse_param(char *buf, char **argv);
|
||||||
|
void at_set_debug_mask(unsigned int newDbgFlag);
|
||||||
|
void at_set_debug_level(unsigned char newDbgLevel);
|
||||||
|
void log_service_init(void);
|
||||||
|
#if CONFIG_LOG_SERVICE_LOCK
|
||||||
|
void log_service_lock_init(void);
|
||||||
|
void log_service_lock(void);
|
||||||
|
u32 log_service_lock_timeout(u32 ms);
|
||||||
|
void log_service_unlock(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define C_NUM_AT_CMD 4 //"ATxx", 4 characters
|
||||||
|
#define C_NUM_AT_CMD_DLT 1 //"=", 1 charater
|
||||||
|
#define STR_END_OF_ATCMD_RET "\r\n# " //each AT command response will end with this string
|
||||||
|
#define STR_END_OF_ATDATA_RET "\r\n> " //data transparent transmission indicator
|
||||||
|
#endif
|
455
RTLGDB/USDK/component/common/api/lwip_netconf.c
Normal file
455
RTLGDB/USDK/component/common/api/lwip_netconf.c
Normal file
|
@ -0,0 +1,455 @@
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/memp.h"
|
||||||
|
#include "lwip/dhcp.h"
|
||||||
|
#include "lwip/dns.h"
|
||||||
|
#include "ethernetif.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "lwip_netconf.h"
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
#include "wifi_ind.h"
|
||||||
|
#endif
|
||||||
|
#if defined(STM32F2XX)
|
||||||
|
#include "stm322xg_eval_lcd.h"
|
||||||
|
#elif defined(STM32F4XX)
|
||||||
|
#include "stm324xg_eval_lcd.h"
|
||||||
|
#endif
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef IP_ADDR0
|
||||||
|
#define IP_ADDR0 192
|
||||||
|
#define IP_ADDR1 168
|
||||||
|
#define IP_ADDR2 1
|
||||||
|
#define IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef NETMASK_ADDR0
|
||||||
|
#define NETMASK_ADDR0 255
|
||||||
|
#define NETMASK_ADDR1 255
|
||||||
|
#define NETMASK_ADDR2 255
|
||||||
|
#define NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef GW_ADDR0
|
||||||
|
#define GW_ADDR0 192
|
||||||
|
#define GW_ADDR1 168
|
||||||
|
#define GW_ADDR2 1
|
||||||
|
#define GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef AP_IP_ADDR0
|
||||||
|
#define AP_IP_ADDR0 192
|
||||||
|
#define AP_IP_ADDR1 168
|
||||||
|
#define AP_IP_ADDR2 43
|
||||||
|
#define AP_IP_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef AP_NETMASK_ADDR0
|
||||||
|
#define AP_NETMASK_ADDR0 255
|
||||||
|
#define AP_NETMASK_ADDR1 255
|
||||||
|
#define AP_NETMASK_ADDR2 255
|
||||||
|
#define AP_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef AP_GW_ADDR0
|
||||||
|
#define AP_GW_ADDR0 192
|
||||||
|
#define AP_GW_ADDR1 168
|
||||||
|
#define AP_GW_ADDR2 43
|
||||||
|
#define AP_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS FOR ETHERNET*/
|
||||||
|
#ifndef ETH_IP_ADDR0
|
||||||
|
#define ETH_IP_ADDR0 192
|
||||||
|
#define ETH_IP_ADDR1 168
|
||||||
|
#define ETH_IP_ADDR2 0
|
||||||
|
#define ETH_IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK FOR ETHERNET*/
|
||||||
|
#ifndef ETH_NETMASK_ADDR0
|
||||||
|
#define ETH_NETMASK_ADDR0 255
|
||||||
|
#define ETH_NETMASK_ADDR1 255
|
||||||
|
#define ETH_NETMASK_ADDR2 255
|
||||||
|
#define ETH_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway address for ethernet*/
|
||||||
|
#ifndef ETH_GW_ADDR0
|
||||||
|
#define ETH_GW_ADDR0 192
|
||||||
|
#define ETH_GW_ADDR1 168
|
||||||
|
#define ETH_GW_ADDR2 0
|
||||||
|
#define ETH_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
#define MAX_DHCP_TRIES 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct netif xnetif[NET_IF_NUM]; /* network interface structure */
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
/**
|
||||||
|
* @brief Initializes the lwIP stack
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
extern int error_flag;
|
||||||
|
extern rtw_mode_t wifi_mode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int lwip_init_done = 0;
|
||||||
|
|
||||||
|
void LwIP_Init(void)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
int8_t idx = 0;
|
||||||
|
|
||||||
|
/* Create tcp_ip stack thread */
|
||||||
|
tcpip_init( NULL, NULL );
|
||||||
|
|
||||||
|
/* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
|
||||||
|
struct ip_addr *netmask, struct ip_addr *gw,
|
||||||
|
void *state, err_t (* init)(struct netif *netif),
|
||||||
|
err_t (* input)(struct pbuf *p, struct netif *netif))
|
||||||
|
|
||||||
|
Adds your network interface to the netif_list. Allocate a struct
|
||||||
|
netif and pass a pointer to this structure as the first argument.
|
||||||
|
Give pointers to cleared ip_addr structures when using DHCP,
|
||||||
|
or fill them with sane numbers otherwise. The state pointer may be NULL.
|
||||||
|
|
||||||
|
The init function pointer must point to a initialization function for
|
||||||
|
your ethernet netif interface. The following code illustrates it's use.*/
|
||||||
|
//printf("NET_IF_NUM:%d\n\r",NET_IF_NUM);
|
||||||
|
for(idx=0;idx<NET_IF_NUM;idx++){
|
||||||
|
if(idx==0){
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
if(idx == NET_IF_NUM - 1)
|
||||||
|
{
|
||||||
|
IP4_ADDR(&ipaddr, ETH_IP_ADDR0, ETH_IP_ADDR1, ETH_IP_ADDR2, ETH_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, ETH_NETMASK_ADDR0, ETH_NETMASK_ADDR1 , ETH_NETMASK_ADDR2, ETH_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, ETH_GW_ADDR0, ETH_GW_ADDR1, ETH_GW_ADDR2, ETH_GW_ADDR3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
xnetif[idx].name[0] = 'r';
|
||||||
|
xnetif[idx].name[1] = '0'+idx;
|
||||||
|
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
if(idx == NET_IF_NUM - 1)
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_mii_init, &tcpip_input);
|
||||||
|
else
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
|
||||||
|
#else
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
|
||||||
|
#endif
|
||||||
|
printf("interface %d is initialized\n", idx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Registers the default network interface. */
|
||||||
|
netif_set_default(&xnetif[0]);
|
||||||
|
|
||||||
|
/*move these operations to wifi_on/wifi_off*/
|
||||||
|
#if 0
|
||||||
|
/* When the netif is fully configured this function must be called.*/
|
||||||
|
for(idx = 0;idx < NET_IF_NUM;idx++)
|
||||||
|
netif_set_up(&xnetif[idx]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lwip_init_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief LwIP_DHCP_Process_Handle
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
uint32_t IPaddress;
|
||||||
|
uint8_t iptab[4];
|
||||||
|
uint8_t DHCP_state;
|
||||||
|
int mscnt = 0;
|
||||||
|
struct netif *pnetif = NULL;
|
||||||
|
|
||||||
|
DHCP_state = dhcp_state;
|
||||||
|
|
||||||
|
#if !CONFIG_ETHERNET
|
||||||
|
if(idx > 1)
|
||||||
|
idx = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pnetif = &xnetif[idx];
|
||||||
|
if(DHCP_state == 0){
|
||||||
|
pnetif->ip_addr.addr = 0;
|
||||||
|
pnetif->netmask.addr = 0;
|
||||||
|
pnetif->gw.addr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
//printf(" ========DHCP_state:%d============\n",DHCP_state);
|
||||||
|
switch (DHCP_state)
|
||||||
|
{
|
||||||
|
case DHCP_START:
|
||||||
|
{
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
dhcp_start(pnetif);
|
||||||
|
IPaddress = 0;
|
||||||
|
DHCP_state = DHCP_WAIT_ADDRESS;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DHCP_WAIT_ADDRESS:
|
||||||
|
{
|
||||||
|
/* If DHCP stopped by wifi_disconn_hdl*/
|
||||||
|
if(pnetif->dhcp->state == 0)
|
||||||
|
{
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
printf("LwIP_DHCP: dhcp stop.\n");
|
||||||
|
return DHCP_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the new IP address */
|
||||||
|
IPaddress = pnetif->ip_addr.addr;
|
||||||
|
|
||||||
|
if (IPaddress!=0)
|
||||||
|
{
|
||||||
|
DHCP_state = DHCP_ADDRESS_ASSIGNED;
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_reg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Stop DHCP */
|
||||||
|
// dhcp_stop(pnetif); /* can not stop, need to renew, Robbie*/
|
||||||
|
|
||||||
|
iptab[0] = (uint8_t)(IPaddress >> 24);
|
||||||
|
iptab[1] = (uint8_t)(IPaddress >> 16);
|
||||||
|
iptab[2] = (uint8_t)(IPaddress >> 8);
|
||||||
|
iptab[3] = (uint8_t)(IPaddress);
|
||||||
|
printf("Interface %d IP address : %d.%d.%d.%d\n", idx, iptab[3], iptab[2], iptab[1], iptab[0]);
|
||||||
|
// printf("Time at start %d ms.\n", xTaskGetTickCount());
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
error_flag = RTW_NO_ERROR;
|
||||||
|
#endif
|
||||||
|
return DHCP_ADDRESS_ASSIGNED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* DHCP timeout */
|
||||||
|
if (pnetif->dhcp->tries > MAX_DHCP_TRIES)
|
||||||
|
{
|
||||||
|
DHCP_state = DHCP_TIMEOUT;
|
||||||
|
|
||||||
|
/* Stop DHCP */
|
||||||
|
dhcp_stop(pnetif);
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
|
||||||
|
iptab[0] = IP_ADDR3;
|
||||||
|
iptab[1] = IP_ADDR2;
|
||||||
|
iptab[2] = IP_ADDR1;
|
||||||
|
iptab[3] = IP_ADDR0;
|
||||||
|
printf("Interface %d DHCP timeout\n",idx);
|
||||||
|
printf("Static IP address : %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]);
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
error_flag = RTW_DHCP_FAIL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
if(idx == NET_IF_NUM -1) // This is the ethernet interface, set it up for static ip address
|
||||||
|
netif_set_up(pnetif);
|
||||||
|
#endif
|
||||||
|
return DHCP_TIMEOUT;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
//sys_msleep(DHCP_FINE_TIMER_MSECS);
|
||||||
|
vTaskDelay(DHCP_FINE_TIMER_MSECS);
|
||||||
|
dhcp_fine_tmr();
|
||||||
|
mscnt += DHCP_FINE_TIMER_MSECS;
|
||||||
|
if (mscnt >= DHCP_COARSE_TIMER_SECS*1000)
|
||||||
|
{
|
||||||
|
dhcp_coarse_tmr();
|
||||||
|
mscnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DHCP_RELEASE_IP:
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
printf("LwIP_DHCP: Release ip\n");
|
||||||
|
dhcp_release_unicast(pnetif);
|
||||||
|
return DHCP_RELEASE_IP;
|
||||||
|
case DHCP_STOP:
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
printf("LwIP_DHCP: dhcp stop.\n");
|
||||||
|
dhcp_stop(pnetif);
|
||||||
|
return DHCP_STOP;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LwIP_ReleaseIP(uint8_t idx)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
struct netif *pnetif = &xnetif[idx];
|
||||||
|
|
||||||
|
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
|
||||||
|
IP4_ADDR(&netmask, 255, 255, 255, 0);
|
||||||
|
IP4_ADDR(&gw, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetMAC(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) (pnetif->hwaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->ip_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetGW(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->gw);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetMASK(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->netmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetBC(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->dhcp->offered_bc_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LWIP_DNS
|
||||||
|
void LwIP_GetDNS(struct ip_addr* dns)
|
||||||
|
{
|
||||||
|
*dns = dns_getserver(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LwIP_SetDNS(struct ip_addr* dns)
|
||||||
|
{
|
||||||
|
dns_setserver(0, dns);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
void LwIP_UseStaticIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
if(pnetif->name[1] == '0'){
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
if(wifi_mode == RTW_MODE_STA){
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
}
|
||||||
|
else if(wifi_mode == RTW_MODE_AP){
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}else{
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
}
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
#include <lwip/autoip.h>
|
||||||
|
|
||||||
|
void LwIP_AUTOIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
uint8_t *ip = LwIP_GetIP(pnetif);
|
||||||
|
|
||||||
|
autoip_start(pnetif);
|
||||||
|
|
||||||
|
while((pnetif->autoip->state == AUTOIP_STATE_PROBING) || (pnetif->autoip->state == AUTOIP_STATE_ANNOUNCING)) {
|
||||||
|
vTaskDelay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*((uint32_t *) ip) == 0) {
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
|
||||||
|
printf("AUTOIP timeout\n");
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
printf("Static IP address : %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Link-local address: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if LWIP_IPV6
|
||||||
|
/* Get IPv6 address with lwip 1.5.0 */
|
||||||
|
void LwIP_AUTOIP_IPv6(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
uint8_t *ipv6 = (uint8_t *) &(pnetif->ip6_addr[0].addr[0]);
|
||||||
|
|
||||||
|
netif_create_ip6_linklocal_address(pnetif, 1);
|
||||||
|
printf("IPv6 link-local address: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
|
||||||
|
ipv6[0], ipv6[1], ipv6[2], ipv6[3], ipv6[4], ipv6[5], ipv6[6], ipv6[7],
|
||||||
|
ipv6[8], ipv6[9], ipv6[10], ipv6[11], ipv6[12], ipv6[13], ipv6[14], ipv6[15]);
|
||||||
|
}
|
||||||
|
#endif
|
91
RTLGDB/USDK/component/common/api/lwip_netconf.h
Normal file
91
RTLGDB/USDK/component/common/api/lwip_netconf.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file netconf.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.1.0
|
||||||
|
* @date 07-October-2011
|
||||||
|
* @brief This file contains all the functions prototypes for the netconf.c
|
||||||
|
* file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __NETCONF_H
|
||||||
|
#define __NETCONF_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "tcpip.h"
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
#include "platform_opts.h"
|
||||||
|
#include "autoconf.h"
|
||||||
|
|
||||||
|
// macros
|
||||||
|
/* Give default value if not defined */
|
||||||
|
#ifndef NET_IF_NUM
|
||||||
|
#ifdef CONFIG_CONCURRENT_MODE
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN) + 1)
|
||||||
|
#else
|
||||||
|
#define NET_IF_NUM ((CONFIG_ETHERNET) + (CONFIG_WLAN))
|
||||||
|
#endif // end of CONFIG_CONCURRENT_MODE
|
||||||
|
#endif // end of NET_IF_NUM
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DHCP_START=0,
|
||||||
|
DHCP_WAIT_ADDRESS,
|
||||||
|
DHCP_ADDRESS_ASSIGNED,
|
||||||
|
DHCP_RELEASE_IP,
|
||||||
|
DHCP_STOP,
|
||||||
|
DHCP_TIMEOUT
|
||||||
|
} DHCP_State_TypeDef;
|
||||||
|
|
||||||
|
/* Extern functions ------------------------------------------------------------*/
|
||||||
|
void wifi_rx_beacon_hdl( char* buf, int buf_len, int flags, void* userdata);
|
||||||
|
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
void LwIP_Init(void);
|
||||||
|
uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state);
|
||||||
|
unsigned char* LwIP_GetMAC(struct netif *pnetif);
|
||||||
|
unsigned char* LwIP_GetIP(struct netif *pnetif);
|
||||||
|
unsigned char* LwIP_GetGW(struct netif *pnetif);
|
||||||
|
uint8_t* LwIP_GetMASK(struct netif *pnetif);
|
||||||
|
uint8_t* LwIP_GetBC(struct netif *pnetif);
|
||||||
|
#if LWIP_DNS
|
||||||
|
void LwIP_GetDNS(struct ip_addr* dns);
|
||||||
|
void LwIP_SetDNS(struct ip_addr* dns);
|
||||||
|
#endif
|
||||||
|
void LwIP_UseStaticIP(struct netif *pnetif);
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
void LwIP_AUTOIP(struct netif *pnetif);
|
||||||
|
#endif
|
||||||
|
#if LWIP_IPV6
|
||||||
|
void LwIP_AUTOIP_IPv6(struct netif *pnetif);
|
||||||
|
#endif
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __NETCONF_H */
|
||||||
|
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
405
RTLGDB/USDK/component/common/api/lwip_netconf1.c
Normal file
405
RTLGDB/USDK/component/common/api/lwip_netconf1.c
Normal file
|
@ -0,0 +1,405 @@
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/memp.h"
|
||||||
|
#include "lwip/dhcp.h"
|
||||||
|
#include "lwip/dns.h"
|
||||||
|
#include "ethernetif.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "lwip_netconf.h"
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
#include "wifi_ind.h"
|
||||||
|
#endif
|
||||||
|
#if defined(STM32F2XX)
|
||||||
|
#include "stm322xg_eval_lcd.h"
|
||||||
|
#elif defined(STM32F4XX)
|
||||||
|
#include "stm324xg_eval_lcd.h"
|
||||||
|
#endif
|
||||||
|
#include <platform/platform_stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef IP_ADDR0
|
||||||
|
#define IP_ADDR0 192
|
||||||
|
#define IP_ADDR1 168
|
||||||
|
#define IP_ADDR2 1
|
||||||
|
#define IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef NETMASK_ADDR0
|
||||||
|
#define NETMASK_ADDR0 255
|
||||||
|
#define NETMASK_ADDR1 255
|
||||||
|
#define NETMASK_ADDR2 255
|
||||||
|
#define NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef GW_ADDR0
|
||||||
|
#define GW_ADDR0 192
|
||||||
|
#define GW_ADDR1 168
|
||||||
|
#define GW_ADDR2 1
|
||||||
|
#define GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS*/
|
||||||
|
#ifndef AP_IP_ADDR0
|
||||||
|
#define AP_IP_ADDR0 192
|
||||||
|
#define AP_IP_ADDR1 168
|
||||||
|
#define AP_IP_ADDR2 43
|
||||||
|
#define AP_IP_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK*/
|
||||||
|
#ifndef AP_NETMASK_ADDR0
|
||||||
|
#define AP_NETMASK_ADDR0 255
|
||||||
|
#define AP_NETMASK_ADDR1 255
|
||||||
|
#define AP_NETMASK_ADDR2 255
|
||||||
|
#define AP_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway Address*/
|
||||||
|
#ifndef AP_GW_ADDR0
|
||||||
|
#define AP_GW_ADDR0 192
|
||||||
|
#define AP_GW_ADDR1 168
|
||||||
|
#define AP_GW_ADDR2 43
|
||||||
|
#define AP_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Static IP ADDRESS FOR ETHERNET*/
|
||||||
|
#ifndef ETH_IP_ADDR0
|
||||||
|
#define ETH_IP_ADDR0 192
|
||||||
|
#define ETH_IP_ADDR1 168
|
||||||
|
#define ETH_IP_ADDR2 0
|
||||||
|
#define ETH_IP_ADDR3 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*NETMASK FOR ETHERNET*/
|
||||||
|
#ifndef ETH_NETMASK_ADDR0
|
||||||
|
#define ETH_NETMASK_ADDR0 255
|
||||||
|
#define ETH_NETMASK_ADDR1 255
|
||||||
|
#define ETH_NETMASK_ADDR2 255
|
||||||
|
#define ETH_NETMASK_ADDR3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Gateway address for ethernet*/
|
||||||
|
#ifndef ETH_GW_ADDR0
|
||||||
|
#define ETH_GW_ADDR0 192
|
||||||
|
#define ETH_GW_ADDR1 168
|
||||||
|
#define ETH_GW_ADDR2 0
|
||||||
|
#define ETH_GW_ADDR3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
#define MAX_DHCP_TRIES 5
|
||||||
|
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct netif xnetif[NET_IF_NUM]; /* network interface structure */
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
/**
|
||||||
|
* @brief Initializes the lwIP stack
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
extern char error_flag;
|
||||||
|
extern unsigned char wifi_mode; // rtw_mode_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int lwip_init_done = 0;
|
||||||
|
|
||||||
|
void LwIP_Init(void)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
int8_t idx = 0;
|
||||||
|
/* Create tcp_ip stack thread */
|
||||||
|
tcpip_init( NULL, NULL );
|
||||||
|
|
||||||
|
/* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
|
||||||
|
struct ip_addr *netmask, struct ip_addr *gw,
|
||||||
|
void *state, err_t (* init)(struct netif *netif),
|
||||||
|
err_t (* input)(struct pbuf *p, struct netif *netif))
|
||||||
|
|
||||||
|
Adds your network interface to the netif_list. Allocate a struct
|
||||||
|
netif and pass a pointer to this structure as the first argument.
|
||||||
|
Give pointers to cleared ip_addr structures when using DHCP,
|
||||||
|
or fill them with sane numbers otherwise. The state pointer may be NULL.
|
||||||
|
|
||||||
|
The init function pointer must point to a initialization function for
|
||||||
|
your ethernet netif interface. The following code illustrates it's use.*/
|
||||||
|
//printf("NET_IF_NUM:%d\n\r",NET_IF_NUM);
|
||||||
|
for(idx = NET_IF_NUM - 1; idx >= 0 ; idx--) {
|
||||||
|
if(idx == 0){
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
}
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
else if(idx == NET_IF_NUM - 1)
|
||||||
|
{
|
||||||
|
IP4_ADDR(&ipaddr, ETH_IP_ADDR0, ETH_IP_ADDR1, ETH_IP_ADDR2, ETH_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, ETH_NETMASK_ADDR0, ETH_NETMASK_ADDR1 , ETH_NETMASK_ADDR2, ETH_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, ETH_GW_ADDR0, ETH_GW_ADDR1, ETH_GW_ADDR2, ETH_GW_ADDR3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
xnetif[idx].name[0] = 'r';
|
||||||
|
xnetif[idx].name[1] = '0'+idx;
|
||||||
|
|
||||||
|
#if CONFIG_ETHERNET
|
||||||
|
if(idx == NET_IF_NUM - 1)
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_mii_init, &tcpip_input);
|
||||||
|
else
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
|
||||||
|
#else
|
||||||
|
netif_add(&xnetif[idx], &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
|
||||||
|
#endif
|
||||||
|
info_printf("interface %d is initialized\n", idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Registers the default network interface. */
|
||||||
|
netif_set_default(&xnetif[0]);
|
||||||
|
|
||||||
|
/* When the netif is fully configured this function must be called.*/
|
||||||
|
for(idx = 0; idx < NET_IF_NUM; idx++)
|
||||||
|
netif_set_up(&xnetif[idx]);
|
||||||
|
|
||||||
|
lwip_init_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief LwIP_DHCP_Process_Handle
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state) {
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
uint32_t IPaddress;
|
||||||
|
uint8_t iptab[4];
|
||||||
|
uint8_t DHCP_state;
|
||||||
|
int mscnt = 0;
|
||||||
|
struct netif *pnetif = NULL;
|
||||||
|
|
||||||
|
DHCP_state = dhcp_state;
|
||||||
|
|
||||||
|
#if !CONFIG_ETHERNET
|
||||||
|
if (idx > 1)
|
||||||
|
idx = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pnetif = &xnetif[idx];
|
||||||
|
if (DHCP_state == 0) {
|
||||||
|
pnetif->ip_addr.addr = 0;
|
||||||
|
pnetif->netmask.addr = 0;
|
||||||
|
pnetif->gw.addr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
//info_printf("\n\r ========DHCP_state:%d============\n\r",DHCP_state);
|
||||||
|
switch (DHCP_state) {
|
||||||
|
case DHCP_START: {
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
dhcp_start(pnetif);
|
||||||
|
IPaddress = 0;
|
||||||
|
DHCP_state = DHCP_WAIT_ADDRESS;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DHCP_WAIT_ADDRESS: {
|
||||||
|
/* Read the new IP address */
|
||||||
|
IPaddress = pnetif->ip_addr.addr;
|
||||||
|
|
||||||
|
if (IPaddress != 0) {
|
||||||
|
DHCP_state = DHCP_ADDRESS_ASSIGNED;
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_reg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Stop DHCP */
|
||||||
|
// dhcp_stop(pnetif); /* can not stop, need to renew, Robbie*/
|
||||||
|
iptab[0] = (uint8_t) (IPaddress >> 24);
|
||||||
|
iptab[1] = (uint8_t) (IPaddress >> 16);
|
||||||
|
iptab[2] = (uint8_t) (IPaddress >> 8);
|
||||||
|
iptab[3] = (uint8_t) (IPaddress);
|
||||||
|
info_printf("Interface %d IP address: %d.%d.%d.%d\n", idx, iptab[3],
|
||||||
|
iptab[2], iptab[1], iptab[0]);
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
error_flag = RTW_NO_ERROR;
|
||||||
|
#endif
|
||||||
|
return DHCP_ADDRESS_ASSIGNED;
|
||||||
|
} else {
|
||||||
|
/* DHCP timeout */
|
||||||
|
if (pnetif->dhcp->tries > MAX_DHCP_TRIES) {
|
||||||
|
DHCP_state = DHCP_TIMEOUT;
|
||||||
|
|
||||||
|
/* Stop DHCP */
|
||||||
|
dhcp_stop(pnetif);
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
netif_set_addr(pnetif, &ipaddr, &netmask, &gw);
|
||||||
|
|
||||||
|
iptab[0] = IP_ADDR3;
|
||||||
|
iptab[1] = IP_ADDR2;
|
||||||
|
iptab[2] = IP_ADDR1;
|
||||||
|
iptab[3] = IP_ADDR0;
|
||||||
|
info_printf("Interface %d DHCP timeout\n", idx);
|
||||||
|
info_printf("Static IP address: %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]);
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
error_flag = RTW_DHCP_FAIL;
|
||||||
|
#endif
|
||||||
|
return DHCP_TIMEOUT;
|
||||||
|
} else {
|
||||||
|
//sys_msleep(DHCP_FINE_TIMER_MSECS);
|
||||||
|
vTaskDelay(DHCP_FINE_TIMER_MSECS);
|
||||||
|
dhcp_fine_tmr();
|
||||||
|
mscnt += DHCP_FINE_TIMER_MSECS;
|
||||||
|
if (mscnt >= DHCP_COARSE_TIMER_SECS * 1000) {
|
||||||
|
dhcp_coarse_tmr();
|
||||||
|
mscnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DHCP_RELEASE_IP:
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
info_printf("LwIP_DHCP(%d): Release ip\n", idx);
|
||||||
|
dhcp_release_unicast(pnetif);
|
||||||
|
return DHCP_RELEASE_IP;
|
||||||
|
case DHCP_STOP:
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl);
|
||||||
|
#endif
|
||||||
|
info_printf("LwIP_DHCP(%d): dhcp stop.\n", idx);
|
||||||
|
dhcp_stop(pnetif);
|
||||||
|
return DHCP_STOP;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetMAC(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) (pnetif->hwaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->ip_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetGW(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->gw);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetMASK(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->netmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* LwIP_GetBC(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
return (uint8_t *) &(pnetif->dhcp->offered_bc_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LWIP_DNS
|
||||||
|
void LwIP_GetDNS(struct ip_addr* dns)
|
||||||
|
{
|
||||||
|
*dns = dns_getserver(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LwIP_SetDNS(struct ip_addr* dns)
|
||||||
|
{
|
||||||
|
dns_setserver(0, dns);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
void LwIP_UseStaticIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
if(pnetif->name[1] == '0'){
|
||||||
|
#if CONFIG_WLAN
|
||||||
|
if(wifi_mode == RTW_MODE_STA){
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
}
|
||||||
|
else if(wifi_mode == RTW_MODE_AP){
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}else{
|
||||||
|
IP4_ADDR(&ipaddr, AP_IP_ADDR0, AP_IP_ADDR1, AP_IP_ADDR2, AP_IP_ADDR3);
|
||||||
|
IP4_ADDR(&netmask, AP_NETMASK_ADDR0, AP_NETMASK_ADDR1 , AP_NETMASK_ADDR2, AP_NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, AP_GW_ADDR0, AP_GW_ADDR1, AP_GW_ADDR2, AP_GW_ADDR3);
|
||||||
|
}
|
||||||
|
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
}
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
#include <lwip/autoip.h>
|
||||||
|
|
||||||
|
void LwIP_AUTOIP(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
uint8_t *ip = LwIP_GetIP(pnetif);
|
||||||
|
|
||||||
|
autoip_start(pnetif);
|
||||||
|
|
||||||
|
while((pnetif->autoip->state == AUTOIP_STATE_PROBING) || (pnetif->autoip->state == AUTOIP_STATE_ANNOUNCING)) {
|
||||||
|
vTaskDelay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*((uint32_t *) ip) == 0) {
|
||||||
|
struct ip_addr ipaddr;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
|
||||||
|
printf("AUTOIP timeout\n");
|
||||||
|
|
||||||
|
/* Static address used */
|
||||||
|
IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
|
||||||
|
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||||
|
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||||
|
netif_set_addr(pnetif, &ipaddr , &netmask, &gw);
|
||||||
|
printf("Static IP address : %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Link-local address: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if LWIP_IPV6
|
||||||
|
/* Get IPv6 address with lwip 1.5.0 */
|
||||||
|
void LwIP_AUTOIP_IPv6(struct netif *pnetif)
|
||||||
|
{
|
||||||
|
uint8_t *ipv6 = (uint8_t *) &(pnetif->ip6_addr[0].addr[0]);
|
||||||
|
|
||||||
|
netif_create_ip6_linklocal_address(pnetif, 1);
|
||||||
|
printf("IPv6 link-local address: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
|
||||||
|
ipv6[0], ipv6[1], ipv6[2], ipv6[3], ipv6[4], ipv6[5], ipv6[6], ipv6[7],
|
||||||
|
ipv6[8], ipv6[9], ipv6[10], ipv6[11], ipv6[12], ipv6[13], ipv6[14], ipv6[15]);
|
||||||
|
}
|
||||||
|
#endif
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue