800*320工程文件+初始demo提交

This commit is contained in:
2024-03-07 16:46:43 +08:00
parent 33e6eb45b3
commit 70ec3005bb
3306 changed files with 3374364 additions and 2563 deletions

View File

@ -354,39 +354,15 @@
<Unit filename="lv_user_code/app/GeneratorMainUI.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/animo.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/demo.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/equipment.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/list.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/mxc_meter.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/setting.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/setting_page.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/app/test.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/basic/img_basic.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/basic/user_read_img_function.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/hal/button.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/hal/button.h" />
<Unit filename="lv_user_code/hal/hal_key_handle.c">
<Option compilerVar="CC" />
@ -426,6 +402,21 @@
<Unit filename="lv_user_code/resource/MXC_FZHZGB_CT_bpp4_48px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_MSYAHEI_CT_bpp4_10px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_MSYAHEI_CT_bpp4_14px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_MSYAHEI_CT_bpp4_18px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_MSYAHEI_CT_bpp4_56px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_MSYAHEI_CT_bpp4_64px.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/MXC_WRYH_CT_bpp4_10px.c">
<Option compilerVar="CC" />
</Unit>
@ -489,6 +480,9 @@
<Unit filename="lv_user_code/resource/lan_str_table.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/resource/shaped_color.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_user_code/track/Interface.c">
<Option compilerVar="CC" />
</Unit>

File diff suppressed because it is too large Load Diff

View File

@ -2,24 +2,24 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="lv_user_code\app\test.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<Cursor>
<Cursor1 position="636" topLine="0" />
<Cursor1 position="11567" topLine="608" />
</Cursor>
</File>
<File name="lv_user_code\resource\Number_HarmonyOS_bpp4_16px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_examples\src\lv_demo_widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="1144" />
<Cursor1 position="403" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10445" topLine="350" />
<Cursor1 position="829" topLine="33" />
</Cursor>
</File>
<File name="lv_user_code\resource\HarmonyOS_number_50px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\extra\widgets\colorwheel\lv_colorwheel.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="159" />
<Cursor1 position="1261" topLine="27" />
</Cursor>
</File>
<File name="lvgl\src\lv_draw\lv_draw_img.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -27,104 +27,45 @@
<Cursor1 position="6355" topLine="138" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_bar.c" open="0" top="0" tabpos="23" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<Cursor>
<Cursor1 position="3069" topLine="98" />
<Cursor1 position="10445" topLine="350" />
</Cursor>
</File>
<File name="lvgl\examples\porting\lv_port_indev_template.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="main.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8201" topLine="288" />
<Cursor1 position="2409" topLine="66" />
</Cursor>
</File>
<File name="lv_user_code\hal\button.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\hal\hal_key_handle.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="17457" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_bar.h" open="0" top="0" tabpos="22" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1829" topLine="55" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim_timeline.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4491" topLine="139" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\lv_demo_music_main.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="20691" topLine="558" />
<Cursor1 position="1397" topLine="6" />
</Cursor>
<Folding>
<Collapse line="23" />
<Collapse line="58" />
<Collapse line="63" />
<Collapse line="68" />
</Folding>
</File>
<File name="lvgl\examples\widgets\switch\lv_example_switch_1.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="164" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\include\language_table.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drivers\indev\mouse.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="140" topLine="306" />
<Cursor1 position="519" topLine="16" />
</Cursor>
</File>
<File name="lv_user_code\app\animo.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_group.c" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="622" topLine="0" />
<Cursor1 position="4737" topLine="156" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="28" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6995" topLine="128" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_arc.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="14929" topLine="534" />
</Cursor>
</File>
<File name="lv_conf.h" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="16431" topLine="480" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6015" topLine="153" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_printf.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4923" topLine="144" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\colorwheel\lv_colorwheel.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2430" topLine="45" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\btnmatrix\lv_example_btnmatrix_1.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="311" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<Cursor>
<Cursor1 position="10034" topLine="310" />
</Cursor>
</File>
<File name="lv_user_code\resource\lan_str_table.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="20" topLine="72" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\win\lv_example_win_1.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="113" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_img.h" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1437" topLine="42" />
<Cursor1 position="106" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\scroll\lv_example_scroll.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -132,99 +73,24 @@
<Cursor1 position="488" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_draw.c" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\resource\HarmonyOS_Sans_SC_Medium_32px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="315" />
<Cursor1 position="330" topLine="0" />
</Cursor>
</File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\lv_examples.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="585" topLine="14" />
<Cursor1 position="0" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\meter\lv_meter.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4743" topLine="122" />
<Cursor1 position="9943" topLine="287" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\btn\lv_example_btn_3.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\mode\spde_ipc.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="66" topLine="21" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2393" topLine="71" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="15577" topLine="423" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\tileview\lv_tileview.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3585" topLine="101" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_30px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="16934" topLine="357" />
</Cursor>
</File>
<File name="lvgl\src\gpu\lv_gpu_stm32_dma2d.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3087" topLine="78" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\lv_demo_music_list.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1223" topLine="38" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_group.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="721" topLine="0" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="440" topLine="14" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_16px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="49527" topLine="1353" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="6611" topLine="230" />
</Cursor>
</File>
<File name="lv_user_code\include\img_def.h" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="1611" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\mode\spde_ipc.c" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="119" topLine="18" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_stress\lv_demo_stress.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="136" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1704" topLine="40" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_slider.h" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="5" zoom_2="0">
<Cursor>
<Cursor1 position="1855" topLine="66" />
<Cursor1 position="119" topLine="120" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim_timeline.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -232,34 +98,29 @@
<Cursor1 position="2274" topLine="41" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\lv_demo_music.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\lv_bar.c" open="0" top="0" tabpos="23" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<Cursor>
<Cursor1 position="1941" topLine="90" />
<Cursor1 position="3069" topLine="98" />
</Cursor>
</File>
<File name="lv_user_code\resource\arialuni_field_bbp2_32px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\include\language_table.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="219" />
<Cursor1 position="140" topLine="306" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\widgets\btnmatrix\lv_example_btnmatrix_1.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4281" topLine="102" />
<Cursor1 position="311" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\app\setting.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_group.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="184" topLine="12" />
<Cursor1 position="721" topLine="0" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_30px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3931" topLine="89" />
</Cursor>
</File>
<File name="lv_user_code\include\mxc_meter.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3202" topLine="0" />
<Cursor1 position="16934" topLine="357" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -267,24 +128,62 @@
<Cursor1 position="17456" topLine="476" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_fs.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3619" topLine="148" />
<Cursor1 position="361" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_arc.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\lv_misc\lv_anim.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3840" topLine="119" />
<Cursor1 position="1444" topLine="24" />
</Cursor>
</File>
<File name="lv_demo_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\include\mxc_meter.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1154" topLine="22" />
<Cursor1 position="3202" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\extra\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="23360" topLine="572" />
<Cursor1 position="862" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\lv_objx\lv_canvas.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2499" topLine="96" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_mem.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1695" topLine="70" />
</Cursor>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\win\lv_example_win_1.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="113" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_img.c" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1431" topLine="30" />
</Cursor>
<Folding>
<Collapse line="69" />
</Folding>
</File>
<File name="lv_examples\src\lv_demo_widgets\lv_demo_widgets.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="45741" topLine="976" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\lv_demo_music_main.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="20691" topLine="558" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.c" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -292,9 +191,194 @@
<Cursor1 position="7222" topLine="261" />
</Cursor>
</File>
<File name="lv_user_code\basic\img_basic.c" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\extra\widgets\meter\lv_meter.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2099" topLine="37" />
<Cursor1 position="5800" topLine="181" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_20px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10270" topLine="228" />
</Cursor>
</File>
<File name="lv_user_code\basic\img_basic.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1170" topLine="0" />
</Cursor>
<Folding>
<Collapse line="5" />
<Collapse line="29" />
</Folding>
</File>
<File name="lv_conf.h" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="16431" topLine="480" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_stress\lv_demo_stress.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="136" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_slider.h" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="5" zoom_2="0">
<Cursor>
<Cursor1 position="1855" topLine="66" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.h" open="0" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4997" topLine="139" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\list\lv_list.c" open="0" top="0" tabpos="28" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4407" topLine="126" />
</Cursor>
</File>
<File name="lv_user_code\resource\HarmonyOS_number_50px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="159" />
</Cursor>
</File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="585" topLine="14" />
</Cursor>
</File>
<File name="lv_user_code\app\mxc_meter.c" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="65" topLine="0" />
</Cursor>
<Folding>
<Collapse line="21" />
<Collapse line="126" />
<Collapse line="186" />
<Collapse line="210" />
<Collapse line="217" />
<Collapse line="224" />
</Folding>
</File>
<File name="lvgl\src\core\lv_obj_draw.c" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="315" />
</Cursor>
</File>
<File name="lv_user_code\include\equipment.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="338" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_mem.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2687" topLine="113" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_fs.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3619" topLine="148" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_bar.h" open="0" top="0" tabpos="22" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1829" topLine="55" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1704" topLine="40" />
</Cursor>
</File>
<File name="lvgl\src\gpu\lv_gpu_stm32_dma2d.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3087" topLine="78" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="6611" topLine="230" />
</Cursor>
</File>
<File name="lv_user_code\app\GeneratorMainUI.c" open="1" top="1" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3213" topLine="6" />
</Cursor>
<Folding>
<Collapse line="18" />
<Collapse line="49" />
<Collapse line="81" />
<Collapse line="113" />
<Collapse line="368" />
<Collapse line="532" />
</Folding>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5829" topLine="232" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\colorwheel\lv_colorwheel.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2430" topLine="45" />
</Cursor>
</File>
<File name="lvgl\examples\scroll\lv_example_scroll_3.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="699" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1009" topLine="40" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="-1" zoom_2="0">
<Cursor>
<Cursor1 position="22001" topLine="561" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_arc.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3840" topLine="119" />
</Cursor>
</File>
<File name="lv_user_code\include\lan_str_table.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1631" topLine="21" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim_timeline.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4491" topLine="139" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_objx_templ.c" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="103" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<Cursor>
<Cursor1 position="10034" topLine="310" />
</Cursor>
</File>
<File name="lv_user_code\resource\arialuni_field_bbp2_32px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="219" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\animimg\lv_animimg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2532" topLine="27" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="440" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="28" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="6995" topLine="128" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_22px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -307,9 +391,9 @@
<Cursor1 position="3241" topLine="101" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="1" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\lv_img.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1009" topLine="40" />
<Cursor1 position="1437" topLine="42" />
</Cursor>
</File>
<File name="lv_examples\lv_apps\benchmark\benchmark.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -317,9 +401,99 @@
<Cursor1 position="209" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\list\lv_list.c" open="0" top="0" tabpos="28" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\extra\widgets\tileview\lv_tileview.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4407" topLine="126" />
<Cursor1 position="3585" topLine="101" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\lv_demo_music.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1941" topLine="90" />
</Cursor>
</File>
<File name="lv_user_code\resource\lan_str_table.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="20" topLine="72" />
</Cursor>
</File>
<File name="lv_user_code\include\img_def.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="1353" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\btn\lv_example_btn_3.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="66" topLine="21" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="15577" topLine="423" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_printf.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4923" topLine="144" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_arc.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="14929" topLine="534" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6015" topLine="153" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="9497" topLine="299" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.c" open="0" top="0" tabpos="26" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="6684" topLine="203" />
</Cursor>
</File>
<File name="lvgl\examples\porting\lv_port_indev_template.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8201" topLine="288" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3931" topLine="89" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_16px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="49527" topLine="1353" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_label.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3538" topLine="104" />
</Cursor>
</File>
<File name="lv_demo_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1154" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\lv_misc\lv_area.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="212" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\mode\spde_ipc.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="223" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10133" topLine="288" />
</Cursor>
</File>
<File name="lv_user_code\track\Interface.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -341,256 +515,64 @@
<Collapse line="63" />
</Folding>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="9943" topLine="287" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5829" topLine="232" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_img.c" open="1" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1431" topLine="30" />
</Cursor>
<Folding>
<Collapse line="69" />
</Folding>
</File>
<File name="lv_user_code\app\setting_page.c" open="1" top="1" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="18094" topLine="0" />
</Cursor>
<Folding>
<Collapse line="243" />
<Collapse line="273" />
<Collapse line="289" />
<Collapse line="317" />
<Collapse line="368" />
<Collapse line="454" />
<Collapse line="483" />
</Folding>
</File>
<File name="lvgl\src\misc\lv_mem.h" open="1" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1695" topLine="70" />
</Cursor>
</File>
<File name="lvgl\src\lv_misc\lv_anim.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1444" topLine="24" />
</Cursor>
</File>
<File name="lvgl\examples\styles\lv_example_style_1.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="223" topLine="3" />
</Cursor>
</File>
<File name="lv_user_code\include\setting_page.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="70" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\textarea\lv_example_textarea_1.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="126" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_72px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="68592" topLine="1424" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\meter\lv_meter.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5800" topLine="181" />
</Cursor>
</File>
<File name="lv_user_code\app\demo.c" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2820" topLine="112" />
</Cursor>
</File>
<File name="lv_user_code\app\list.c" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5216" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_label.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3538" topLine="104" />
</Cursor>
</File>
<File name="lv_user_code\hal\hal_key_handle.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1364" topLine="8" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
<Cursor>
<Cursor1 position="11567" topLine="608" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="9497" topLine="299" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_mem.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2687" topLine="113" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="862" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_printf.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2580" topLine="48" />
</Cursor>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.h" open="0" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4997" topLine="139" />
</Cursor>
</File>
<File name="lv_user_code\mode\spde_ipc.h" open="1" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="223" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\animimg\lv_animimg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2532" topLine="27" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="403" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="-1" zoom_2="0">
<Cursor>
<Cursor1 position="22001" topLine="561" />
</Cursor>
</File>
<File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="361" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\resource\HarmonyOS_Sans_SC_Medium_32px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="330" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_10px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4983" topLine="136" />
</Cursor>
</File>
<File name="lv_user_code\app\mxc_meter.c" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="60" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_group.c" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4737" topLine="156" />
</Cursor>
</File>
<File name="lvgl\src\extra\widgets\colorwheel\lv_colorwheel.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1261" topLine="27" />
</Cursor>
</File>
<File name="lv_user_code\include\equipment.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="338" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.c" open="0" top="0" tabpos="26" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
<Cursor>
<Cursor1 position="6684" topLine="203" />
</Cursor>
</File>
<File name="lv_drivers\indev\mouse.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="519" topLine="16" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="106" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\lv_examples.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="0" />
</Cursor>
</File>
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_20px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10270" topLine="228" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_music\README.md" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="402" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\lv_objx\lv_canvas.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_examples\src\lv_demo_music\lv_demo_music_list.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2499" topLine="96" />
<Cursor1 position="1223" topLine="38" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="829" topLine="33" />
<Cursor1 position="23360" topLine="572" />
</Cursor>
</File>
<File name="lv_examples\src\lv_demo_widgets\lv_demo_widgets.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\extra\widgets\meter\lv_meter.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="45741" topLine="976" />
<Cursor1 position="4743" topLine="122" />
</Cursor>
</File>
<File name="lv_user_code\include\lan_str_table.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_10px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1631" topLine="21" />
<Cursor1 position="4983" topLine="136" />
</Cursor>
</File>
<File name="lvgl\src\widgets\lv_objx_templ.c" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\styles\lv_example_style_1.c" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="103" topLine="0" />
<Cursor1 position="223" topLine="3" />
</Cursor>
</File>
<File name="lvgl\src\lv_misc\lv_area.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\examples\widgets\textarea\lv_example_textarea_1.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="212" topLine="0" />
<Cursor1 position="126" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\scroll\lv_example_scroll_3.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\resource\Number_HarmonyOS_bpp4_16px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="699" topLine="0" />
<Cursor1 position="0" topLine="1144" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drv_conf.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10133" topLine="288" />
<Cursor1 position="4281" topLine="102" />
</Cursor>
</File>
<File name="lv_user_code\app\equipment.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_user_code\resource\MXC_WRYH_CT_bpp4_72px.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="944" topLine="8" />
<Cursor1 position="68592" topLine="1424" />
</Cursor>
</File>
<File name="lv_user_code\include\setting_page.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="70" topLine="0" />
</Cursor>
</File>
</CodeBlocks_layout_file>

View File

@ -1,9 +1,6 @@
#include "lvgl.h"
#include "img_def.h"
#include "demo.h"
#include "mxc_meter.h"
#include "list.h"
#include "language_table.h"
#include "img_basic.h"
#include "lan_str_table.h"
@ -41,7 +38,7 @@ static void WinKey_event_MainToGtor_handle(lv_event_t* e)
//close_ui_refresh_timer();
close_all_win();
//主界面进入到类型界面
Generator_SubUI_Gtor_src_win();
Generator_SubUI_Gtor_src_win(get_root_win());
break;
default:
break;
@ -72,7 +69,7 @@ static void WinKey_event_GtorToErr_handle(lv_event_t* e)
//close_ui_refresh_timer();
close_all_win();
//主界面进入到类型界面
Generator_SubUI_ERROR_src_win();
Generator_SubUI_ERROR_src_win(get_root_win());
break;
default:
break;
@ -104,7 +101,7 @@ static void WinKey_event_ErrToMain_handle(lv_event_t* e)
//close_ui_refresh_timer();
close_all_win();
//主界面进入到类型界面
Generator_src_win();
Generator_src_win(get_root_win());
break;
default:
break;
@ -113,9 +110,9 @@ static void WinKey_event_ErrToMain_handle(lv_event_t* e)
}
//获取主屏幕
lv_obj_t* Generator_src_win()
lv_obj_t* Generator_src_win(lv_obj_t * scr_parent_main)
{
lv_obj_t * scr_parent_main = get_root_win();
// lv_obj_t * scr_parent_main = get_root_win();
lv_obj_t * MainUI_win = lv_obj_create(scr_parent_main);
lv_obj_set_scrollbar_mode(MainUI_win, LV_SCROLLBAR_MODE_OFF); //关闭滑轮功能
@ -368,10 +365,10 @@ lv_obj_t* Generator_src_win()
}
lv_obj_t* Generator_SubUI_Gtor_src_win()
lv_obj_t* Generator_SubUI_Gtor_src_win(lv_obj_t * scr_parent_main)
{
//生成窗口对象
lv_obj_t* scr_parent_main = get_root_win();
// lv_obj_t* scr_parent_main = get_root_win();
lv_obj_t* pSubUI_Gtor_win = lv_obj_create(scr_parent_main);
//初始化窗口对象,配置窗口对象属性
@ -532,9 +529,9 @@ lv_obj_t* Generator_SubUI_Gtor_src_win()
}
lv_obj_t* Generator_SubUI_ERROR_src_win()
lv_obj_t* Generator_SubUI_ERROR_src_win(lv_obj_t * scr_parent_main)
{
lv_obj_t * scr_parent_main = get_root_win();
// lv_obj_t * scr_parent_main = get_root_win();
lv_obj_t* pSubUI_ERROR_win = lv_obj_create(scr_parent_main);
lv_obj_set_scrollbar_mode(pSubUI_ERROR_win, LV_SCROLLBAR_MODE_OFF); //关闭滑轮功能

View File

@ -2,7 +2,7 @@
#include "img_def.h"
#include "demo.h"
#include "mxc_meter.h"
#include "list.h"
#include "menu_list"
//#include "language_table.h"
#include "lan_str_table.h"
#include "equipment.h"

View File

@ -2,650 +2,7 @@
#include "img_def.h"
#include "demo.h"
#include "mxc_meter.h"
#include "list.h"
#include "menu_list"
#include "language_table.h"
#include "lan_str_table.h"
#include "equipment.h"
//#define LV_KEY_Q 113
//#define LV_KEY_W 119
char *list_title[16] = {"主题","亮度","蓝牙","其他\n设置","车辆\n信息","返回","1","2","3","4","5","6","7","8","9","10","11","12"};
char *theme_title[16] = {"主题\n设置","主题\n背景","返回","1","2","3","4","5","6","7","8","9","10","11","12"};
__attribute__((section("resource_section"))) static const lv_mainmenu_win_t mainmenu_page_group[MAINMENU_ITEM_ID_MAX] =
{
{MAINMENU_ITEM_ID_THEME, STR_ID_THEME, MAINMENU_ICON_ID_THEME, (void *)theme_create},
{MAINMENU_ITEM_ID_LIGHT, STR_ID_LIGHT, MAINMENU_ICON_ID_LIGHT, (void *)light_create},
{MAINMENU_ITEM_ID_BLUETOOTH, STR_ID_BLUETOOTH, MAINMENU_ICON_ID_BLUETOOTH, (void *)bluetooth_create},
{MAINMENU_ITEM_ID_OTHER, STR_ID_OTHER_SETTING, MAINMENU_ICON_ID_OTHER, (void *)other_create},
{MAINMENU_ITEM_ID_INFORMATION, STR_ID_INFORMATION, MAINMENU_ICON_ID_INFORMATION, (void *)information_create},
{MAINMENU_ITEM_ID_PRESSURE, STR_ID_PRESSURE, MAINMENU_ICON_ID_PRESSURE, (void *)pressure_create},
{MAINMENU_ITEM_ID_FAULT_CODE, STR_ID_FAULT_CODE, MAINMENU_ICON_ID_FAULT_CODE, (void *)fault_code_create},
{EQUIPMENT_ID_RETURN, STR_ID_RETURN, MAINMENU_ICON_ID_RETURN, (void *)demo_return},
};
const btn_event_func getDeviceEntryByStrId(const LAN_STR_ID str_id)
{
btn_event_func p_btn_func = NULL;
for (uint8_t i = MAINMENU_ITEM_ID_THEME; i < MAINMENU_ITEM_ID_MAX; i++)
{
// printf("mainmenu_page_group[i].str_id = %d ,str_id = %d ",mainmenu_page_group[i].str_id,str_id);
if (mainmenu_page_group[i].str_id == str_id)
{
p_btn_func = mainmenu_page_group[i].event_handler;
break;
}
}
if (p_btn_func != NULL)
{
p_btn_func(NULL);
}
else
{
LV_ASSERT(true);
}
return NULL;
}
ENUM_EQUIPMENT_ID get_menu_iconid_by_strid(const LAN_STR_ID str_id)
{
for (uint8_t i = EQUIPMENT_ID_THEME; i < EQUIPMENT_ID_MAX; i++)
{
if (mainmenu_page_group[i].str_id == str_id)
return mainmenu_page_group[i].mainmenu_icon_id;
}
return EQUIPMENT_ID_MAX;
}
LAN_STR_ID list_str[16] = {
STR_ID_THEME,
STR_ID_LIGHT,
STR_ID_BLUETOOTH,
STR_ID_OTHER_SETTING,
STR_ID_INFORMATION,
STR_ID_PRESSURE,
STR_ID_FAULT_CODE,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
STR_ID_RETURN,
};
//lan_str_table[STR_ID_FOCUS_BREATHING][1]
mainmenu_tile_t mainmenu_tile[]=
{
[MAINMENU_TILE_ZERO] = {.window_obj = NULL, .col_id = 0, .row_id = 0, .dir = LV_DIR_HOR, .Init = init_tile_common}, // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>
[MAINMENU_TILE_ONE] = {.window_obj = NULL, .col_id = 1, .row_id = 0, .dir = LV_DIR_HOR, .Init = init_tile_common},
[MAINMENU_TILE_TWO] = {.window_obj = NULL, .col_id = 2, .row_id = 0, .dir = LV_DIR_HOR, .Init = init_tile_common},
};
#if 0
LV_ATTRIBUTE_LARGE_CONST static const lv_img_dsc_t* test_list[4] =
{
IMG_DM1_OIL,
IMG_DM1_TCS,
IMG_DM1_TEMP,
IMG_DM1_NULL,
};
#endif
uint32_t mainmenu_item_process(uint32_t dis_item_arr[MAINMENU_TILE_END][COMMON_PER_PAGE_NUM],
uint32_t *page_num, uint32_t *last_item_pos)
{
uint32_t mainmenu_item_sum = 0;
// calculate how many devices need display
for (uint8_t i = EQUIPMENT_ID_THEME; i < EQUIPMENT_ID_MAX; i++)
{
if (get_equipment_is_display(i))
mainmenu_item_sum++;
}
//mainmenu_item_sum++; // add device manage item
// calculate page_num according to mainmenu_item_sum
*page_num = mainmenu_item_sum / COMMON_PER_PAGE_NUM;
if (mainmenu_item_sum % COMMON_PER_PAGE_NUM != 0)
(*page_num)++;
// Store the device str_id to be displayed into an array in order
*last_item_pos = mainmenu_item_sum % COMMON_PER_PAGE_NUM;
get_display_equipment_str(dis_item_arr);
*last_item_pos == 0 ? (dis_item_arr[(*page_num) - 1][COMMON_PER_PAGE_NUM - 1] = STR_ID_RETURN) : (dis_item_arr[(*page_num) - 1][(*last_item_pos) - 1] = STR_ID_RETURN);
return mainmenu_item_sum;
}
void enter_mainmenu_win(lv_obj_t *parent)
{
lv_obj_t *mainmenu_win = lv_obj_create(parent);
lv_obj_set_style_bg_color(mainmenu_win, lv_color_make(0x00, 0x00, 0x00), 0);
lv_obj_set_scrollbar_mode(mainmenu_win, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_size(mainmenu_win, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_pad_all(mainmenu_win, 0, 0);
lv_obj_set_style_radius(mainmenu_win, 0, 0);
lv_obj_set_style_border_width(mainmenu_win, 0, LV_PART_MAIN);
// lv_obj_set_style_border_color(mainmenu_win, lv_color_black(), 0);
lv_obj_set_style_bg_color(mainmenu_win, lv_color_hex(0x5E5E5E), NULL);
lv_obj_clear_flag(mainmenu_win, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *demo_group = get_key_group();
lv_group_add_obj(demo_group, mainmenu_win);
lv_obj_t *mainmenu_tile_win = lv_tileview_create(mainmenu_win);
lv_obj_set_style_bg_color(mainmenu_tile_win, lv_color_black(), 0);
lv_obj_clear_flag(mainmenu_tile_win, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_clear_flag(mainmenu_tile_win, LV_OBJ_FLAG_EVENT_BUBBLE);
lv_obj_set_scrollbar_mode(mainmenu_tile_win, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_scroll_dir(mainmenu_tile_win, LV_DIR_HOR);
lv_obj_clear_flag(mainmenu_tile_win, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_add_flag(mainmenu_tile_win, LV_OBJ_FLAG_SCROLL_MOMENTUM);
lv_obj_add_flag(mainmenu_tile_win, LV_OBJ_FLAG_SCROLL_ONE);
lv_obj_set_size(mainmenu_tile_win, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_radius(mainmenu_tile_win, 0, 0);
lv_obj_set_style_pad_all(mainmenu_tile_win, 0, 0);
lv_obj_set_style_border_width(mainmenu_tile_win, 0, LV_PART_MAIN);
// lv_obj_set_style_border_color(mainmenu_tile_win, lv_color_black(), 0);
lv_obj_set_style_bg_color(mainmenu_tile_win, lv_color_hex(0x5E5E5E), NULL);
uint32_t page_num = 3; // sum of mainmenu pages
uint32_t tile_item_count = 3; // number of items per page
uint32_t last_item_pos = 0;
uint8_t cal_check_page = 0;
// uint8_t cal_check_item = 0;
uint32_t dis_item_arr[MAINMENU_TILE_END][COMMON_PER_PAGE_NUM];
memset(dis_item_arr, 0, sizeof(dis_item_arr));
uint32_t btn_totalnum = mainmenu_item_process(dis_item_arr, &page_num, &last_item_pos);
printf("btn_totalnum = %d .\n",btn_totalnum);
printf("page_num = %d last_num = %d .\n",page_num,last_item_pos);
// Loop create tile
for (uint8_t i = MAINMENU_TILE_ZERO; i < page_num; i++)
{
// calculate number of items on the last page
if ((i == page_num - 1) && (last_item_pos))
tile_item_count = last_item_pos;
// add tile
mainmenu_tile[i].window_obj = lv_tileview_add_tile(mainmenu_tile_win, mainmenu_tile[i].col_id, mainmenu_tile[i].row_id, mainmenu_tile[i].dir);
if (i == cal_check_page)
((mainmenu_tile_t *)&mainmenu_tile[i])->Init(mainmenu_tile[i].window_obj, dis_item_arr[i], i, tile_item_count);
else
((mainmenu_tile_t *)&mainmenu_tile[i])->Init(mainmenu_tile[i].window_obj, dis_item_arr[i], i, tile_item_count);
}
lv_obj_set_tile_id(mainmenu_tile_win, mainmenu_tile[cal_check_page].col_id, mainmenu_tile[cal_check_page].row_id, LV_ANIM_ON);
lv_obj_add_event_cb(mainmenu_win, key_event_handler, LV_EVENT_KEY, NULL);
}
static void key_event_handler(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *mainmenu_win = lv_event_get_target(e);
lv_obj_t *mainmenu_tile_win = lv_obj_get_child(mainmenu_win, 0);
lv_obj_t *mainmenu_btn_win = lv_tileview_get_tile_act(mainmenu_tile_win); // get display tile
lv_obj_t *img_side = lv_obj_get_child(mainmenu_win, 1);
if (code == LV_EVENT_KEY)
{
uint32_t *key = lv_event_get_param(e);
uint8_t key_code = (uint8_t)*key;
uint32_t page_count = 0; // display tile index
uint32_t btn_count = 0; // checked item index
uint32_t page_num = 0; // sum of mainmenu pages
uint32_t last_item_pos = 0; // last item index of his page
uint32_t dis_item_arr[MAINMENU_TILE_END][COMMON_PER_PAGE_NUM];
memset(dis_item_arr, 0, sizeof(dis_item_arr));
uint32_t btn_totalnum = mainmenu_item_process(dis_item_arr, &page_num, &last_item_pos);
bool check = false;
// MAINMENU_ICON_ID_ENUM menu_id = MAINMENU_ICON_ID_MAX;
// ENUM_MAINMENU_ITEM_ID item_id = MAINMENU_ITEM_ID_MAX;
// uint8_t curItemState = 0;
// get focus item index
for (uint32_t i = 0; i < lv_obj_get_child_cnt(mainmenu_btn_win); i++)
{
lv_obj_t *child = lv_obj_get_child(mainmenu_btn_win, i);
if (lv_obj_has_state(child, LV_STATE_FOCUS_KEY))
btn_count = i;
}
lv_obj_t *mainmenu_button_cur = lv_obj_get_child(mainmenu_btn_win, btn_count); // get checked item obj
page_count = (uint32_t)lv_obj_get_child_id(mainmenu_btn_win); // get display tile index
check = lv_obj_get_child_cnt(mainmenu_btn_win) > 1 ? true : false;
switch (key_code)
{
case LV_KEY_Q:
lv_obj_clear_state(mainmenu_button_cur, LV_STATE_FOCUS_KEY);
if(btn_totalnum ==btn_count+1+page_count*3){//最后一个按钮
printf("2---------count = %d.\n",btn_count+1+page_count*3);
page_count =0;
btn_count =0;
lv_obj_t *tile_display = lv_obj_get_child(mainmenu_tile_win, page_count);
lv_obj_set_tile(mainmenu_tile_win, tile_display, LV_ANIM_ON);
mainmenu_btn_win = lv_tileview_get_tile_act(mainmenu_tile_win);
lv_obj_t *mainmenu_next_button = lv_obj_get_child(mainmenu_btn_win, btn_count);
lv_obj_add_state(mainmenu_next_button, LV_STATE_FOCUS_KEY);
printf("LV_KEY_Q page_count = %d ,btn_count = %d\n",page_count,btn_count);
break;
}
if(btn_count==2){
btn_count =0;
page_count++;
lv_obj_t *tile_display = lv_obj_get_child(mainmenu_tile_win, page_count);
lv_obj_set_tile(mainmenu_tile_win, tile_display, LV_ANIM_ON);
}else
btn_count++;
mainmenu_btn_win = lv_tileview_get_tile_act(mainmenu_tile_win);
lv_obj_t *mainmenu_next_button = lv_obj_get_child(mainmenu_btn_win, btn_count);
lv_obj_add_state(mainmenu_next_button, LV_STATE_FOCUS_KEY);
printf("LV_KEY_Q page_count = %d ,btn_count = %d\n",page_count,btn_count);
break;
case LV_KEY_W:
printf("LV_KEY_W page_count = %d ,btn_count = %d,",page_count,btn_count);
printf("count = %d.\n",btn_count+1+page_count*3);
// ENUM_MAINMENU_ITEM_ID item_id = get_mainmenu_item_id_by_strid(dis_item_arr[page_count][btn_count]);
// Set_check_menu_item(item_id);
close_all_win();
SubmenuBtnEnter(get_root_win(), page_count, btn_count);
break;
default:
// printf("other key:%d\r\n", key_code);
break;
}
}
}
void init_tile_common(lv_obj_t *mainmenu_btn_win, uint32_t str_arr[], uint8_t page_num, uint8_t cur_tile_item)
{
printf("page_num = %d, cur_tile_item = %d\n",page_num,cur_tile_item);
lv_obj_t *mainmenu_tile_win = lv_obj_get_parent(mainmenu_btn_win);
lv_obj_t *mainmenu_win = lv_obj_get_parent(mainmenu_tile_win);
lv_obj_t *img_side = lv_obj_get_child(mainmenu_win, 1);
uint32_t x1 = 0, y1 = 0, x2 = 0, y2 = 0;
uint32_t page_id = lv_obj_get_child_id(mainmenu_btn_win);
lv_obj_set_style_pad_all(mainmenu_btn_win, 0, 0);
lv_obj_set_style_opa(mainmenu_btn_win, LV_OPA_100, 0);
lv_obj_set_scrollbar_mode(mainmenu_btn_win, LV_SCROLLBAR_MODE_ACTIVE);
lv_obj_clear_flag(mainmenu_btn_win, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_set_size(mainmenu_btn_win, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_radius(mainmenu_btn_win, 0, 0);
lv_obj_set_style_bg_color(mainmenu_btn_win, lv_color_hex(0x7000BB), 0);
for (uint8_t i = 0; i < cur_tile_item; i++)
{
lv_obj_t *imgbtn = lv_btn_create(mainmenu_btn_win);
lv_obj_set_style_bg_opa(imgbtn, LV_OPA_0, 0);
uint32_t child_id = lv_obj_get_child_id(imgbtn);
switch (child_id)
{
case 0:
x1 = ICON_IMG_1_X;
x2 = ICON_RING_1_X;
break;
case 1:
x1 = ICON_IMG_2_X;
x2 = ICON_RING_2_X;
break;
default:
x1 = ICON_IMG_3_X;
x2 = ICON_RING_3_X;
break;
}
y1 = ICON_IMG_Y;
lv_obj_set_size(imgbtn, MAINMENU_ICON_WIDTH_UNCHECK, MAINMENU_ICON_HEIGHT_UNCHECK);
lv_obj_set_pos(imgbtn, x1, y1);
LAN_STR_ID str_id = (LAN_STR_ID)str_arr[i];
ENUM_EQUIPMENT_ID cur_menu_id = get_menu_iconid_by_strid(str_id);
if (cur_menu_id == MAINMENU_ICON_ID_MAX)
continue;
if(page_id == 0 && i==0){
lv_obj_add_state(imgbtn, LV_STATE_FOCUS_KEY);
}
lv_obj_t * label = lv_label_create(imgbtn);
const LAN_STR_ID Str_id = get_equipment_is_str(cur_menu_id);
lv_label_set_text_fmt(label, "%s",lan_str_table[Str_id][1]);
lv_obj_center(label);
}
lv_obj_clear_flag(mainmenu_btn_win, LV_OBJ_FLAG_SCROLL_ELASTIC);
lv_obj_clear_flag(mainmenu_btn_win, LV_OBJ_FLAG_GESTURE_BUBBLE);
}
ENUM_MAINMENU_ITEM_ID Get_menu_btn_item(uint32_t btn_count){
switch(btn_count){
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
return MAINMENU_ITEM_ID_MAX;
}
ENUM_MAINMENU_ITEM_ID Get_menu_item(uint32_t page_count ,uint32_t btn_count){
switch(page_count){
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
return MAINMENU_ITEM_ID_MAX;
}
void SubmenuBtnEnter(lv_obj_t * scr_parent_main , uint32_t page_count ,uint32_t btn_count)
{
uint8_t mainmenu_item_sum = 0;
uint8_t page_num = 0;
uint8_t tile_item_count = COMMON_PER_PAGE_NUM;
lv_obj_t *submenu_win = lv_obj_create(scr_parent_main);
lv_obj_set_scrollbar_mode(submenu_win, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_size(submenu_win, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_pad_all(submenu_win, 0, 0);
lv_obj_set_style_radius(submenu_win, 0, 0);
lv_obj_set_style_border_width(submenu_win, 0, LV_PART_MAIN);
lv_obj_set_style_border_color(submenu_win, lv_color_black(), 0);
lv_obj_clear_flag(submenu_win, LV_OBJ_FLAG_SCROLLABLE);
// ENUM_MAINMENU_ITEM_ID page_type = Get_menu_item(page_count,btn_count);
// printf("SubmenuBtnEnter ====== page_count = %d ,btn_count = %d .page_type = %d\n",page_count,btn_count,page_type);
//
// uint32_t last_item_pos = mainmenu_item_sum % COMMON_PER_PAGE_NUM;
uint32_t dis_item_arr[MAINMENU_TILE_END][COMMON_PER_PAGE_NUM];
memset(dis_item_arr, 0, sizeof(dis_item_arr));
get_display_equipment_str(dis_item_arr);
// last_item_pos == 0 ? \
// (dis_item_arr[page_num-1][COMMON_PER_PAGE_NUM-1]=STR_ID_DEVICE_MANAGE) : \
// (dis_item_arr[page_num-1][last_item_pos-1]=STR_ID_DEVICE_MANAGE);
getDeviceEntryByStrId(dis_item_arr[page_count][btn_count]);
// printf("dis_item_arr = %d \n",dis_item_arr[page_count][btn_count]);
}
/**************************************************************************************/
static void scroll_begin_event(lv_event_t * e)
{
/*Disable the scroll animations. Triggered when a tab button is clicked */
if(lv_event_get_code(e) == LV_EVENT_SCROLL_BEGIN) {
lv_anim_t * a = lv_event_get_param(e);
if(a) a->time = 0;
}
}
static void scroll_event_cb(lv_event_t * e)
{
lv_obj_t * cont = lv_event_get_target(e);
lv_area_t cont_a;
lv_obj_get_coords(cont, &cont_a);
lv_coord_t cont_y_center = cont_a.y1 + lv_area_get_height(&cont_a) / 2;
lv_coord_t r = lv_obj_get_height(cont) * 7 / 10;
uint32_t i;
uint32_t child_cnt = lv_obj_get_child_cnt(cont);
for(i = 0; i < child_cnt; i++) {
lv_obj_t * child = lv_obj_get_child(cont, i);
lv_area_t child_a;
lv_obj_get_coords(child, &child_a);
lv_coord_t child_y_center = child_a.y1 + lv_area_get_height(&child_a) / 2;
lv_coord_t diff_y = child_y_center - cont_y_center;
diff_y = LV_ABS(diff_y);
/*Get the x of diff_y on a circle.*/
lv_coord_t x;
/*If diff_y is out of the circle use the last point of the circle (the radius)*/
if(diff_y >= r) {
x = r;
} else {
/*Use Pythagoras theorem to get x from radius and y*/
uint32_t x_sqr = r * r - diff_y * diff_y;
lv_sqrt_res_t res;
lv_sqrt(x_sqr, &res, 0x8000); /*Use lvgl's built in sqrt root function*/
x = r - res.i;
}
/*Translate the item by the calculated X coordinate*/
lv_obj_set_style_translate_x(child, x, 0);
/*Use some opacity with larger translations*/
lv_opa_t opa = lv_map(x, 0, r, LV_OPA_TRANSP, LV_OPA_COVER);
lv_obj_set_style_opa(child, LV_OPA_COVER - opa, 0);
}
}
void test(lv_obj_t* parent){
lv_obj_t *mainmenu_win = lv_obj_create(parent);
lv_obj_set_style_bg_color(mainmenu_win, lv_color_make(0x00, 0x00, 0x00), 0);
lv_obj_set_scrollbar_mode(mainmenu_win, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_size(mainmenu_win, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_pad_all(mainmenu_win, 0, 0);
lv_obj_set_style_radius(mainmenu_win, 0, 0);
lv_obj_set_style_border_width(mainmenu_win, 0, LV_PART_MAIN);
lv_obj_set_style_border_color(mainmenu_win, lv_color_black(), 0);
lv_obj_clear_flag(mainmenu_win, LV_OBJ_FLAG_SCROLLABLE);
// lv_obj_t *mainmenu_win = NULL;
// gui_create_new_window(mainmenu_win);
Set_UI_page_id(PAGE_MAINMENU_WIN_ID);
// app_menu_comm_entry(mainmenu_win,PAGE_MAINMENU_WIN_ID,false);
// #if !MMI_WIN32_SIM
// lv_group_t *g = lv_get_keypad_group();
// lv_group_remove_all_objs(g);
// lv_group_add_obj(g, mainmenu_win);
// #endif
uint8_t style_num =1;
lv_obj_t * cont = NULL;
lv_obj_t * cont_parent = NULL;
uint8_t i =0;
static lv_style_t style;
lv_obj_t *tabview;
switch(style_num){
case 0:
/*Create a Tab view object*/
tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 100);
lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_BEGIN, NULL);
lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_RED, 2), 0);
lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_GREY, 3), 0);
lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_GREY, 5), 0);
lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);
/*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/
lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Tab 1");
lv_obj_set_size(tab1, LV_PCT(100), LV_PCT(100));
lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Tab 2");
lv_obj_set_size(tab2, LV_PCT(100), LV_PCT(100));
lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Tab 3");
lv_obj_set_size(tab3, LV_PCT(100), LV_PCT(100));
lv_obj_t *tab4 = lv_tabview_add_tab(tabview, "Tab 4");
lv_obj_set_size(tab4, LV_PCT(100), LV_PCT(100));
lv_obj_t *tab5 = lv_tabview_add_tab(tabview, "Tab 5");
lv_obj_set_size(tab5, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_bg_color(tab2, lv_palette_lighten(LV_PALETTE_AMBER, 3), 0);
lv_obj_set_style_bg_opa(tab2, LV_OPA_COVER, 0);
/*Add content to the tabs*/
lv_obj_t * label = lv_label_create(tab1);
lv_label_set_text(label, "First tab 1111111111111111");
label = lv_label_create(tab2);
lv_label_set_text(label, "Second tab 2222222222222222");
label = lv_label_create(tab3);
lv_label_set_text(label, "Third tab 333333333333333333333");
label = lv_label_create(tab4);
lv_label_set_text(label, "Forth tab 444");
label = lv_label_create(tab5);
lv_label_set_text(label, "Fifth tab 5");
// lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
// //横向按钮列表
// cont = lv_obj_create(mainmenu_win);
// lv_obj_set_size(cont, lv_pct(100), lv_pct(100));
// lv_obj_center(cont);
// lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW );
// lv_obj_add_event_cb(cont, scroll_event_cb, LV_EVENT_SCROLL, NULL);
// lv_obj_set_style_radius(cont, LV_RADIUS_CIRCLE, 0);//圆弧框
// lv_obj_set_style_clip_corner(cont, true, 0);//隐藏四个角落
// lv_obj_set_scroll_dir(cont, LV_DIR_VER);
// lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER);
// lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF);
// lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLLABLE);
//
// for(i = 0; i < 7; i++) {
// lv_obj_t * btn = lv_btn_create(cont);
// lv_obj_set_width(btn, 100);
// lv_obj_set_height(btn, lv_pct(70));
//
// lv_obj_t * label = lv_label_create(btn);
// lv_label_set_text_fmt(label, "%d", i);
// }
//
// lv_event_send(cont, LV_EVENT_SCROLL, NULL);
//
// lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF);
break;
case 1:
//弧形按钮列表
cont_parent = lv_obj_create(mainmenu_win);
lv_obj_set_size(cont_parent, 180, lv_pct(100));
lv_obj_align(cont_parent,LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_set_style_bg_color(cont_parent, lv_color_hex(0xff0000), 0);
lv_obj_clear_flag(cont_parent, LV_OBJ_FLAG_SCROLLABLE);
cont = lv_obj_create(cont_parent);
lv_obj_set_size(cont, 150, 150);
lv_obj_center(cont);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_add_event_cb(cont, scroll_event_cb, LV_EVENT_SCROLL, NULL);
lv_obj_set_style_radius(cont, LV_RADIUS_CIRCLE, 0);//圆弧框
lv_obj_set_style_clip_corner(cont, true, 0);//隐藏四个角落
lv_obj_set_scroll_dir(cont, LV_DIR_VER);
lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER);
lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF);
lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLLABLE);
for(i = 0; i < 7; i++) {
lv_obj_t * btn = lv_btn_create(cont);
lv_obj_set_width(btn, lv_pct(90));
lv_obj_set_height(btn, lv_pct(70));
lv_obj_t * label = lv_label_create(btn);
lv_label_set_text_fmt(label, "%d", i);
}
lv_event_send(cont, LV_EVENT_SCROLL, NULL);
lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF);
break;
case 2:
//循环滚动列表
lv_style_init(&style);
lv_style_set_bg_color(&style, lv_color_black());
lv_style_set_text_color(&style, lv_color_hex(0x5e0000));
lv_style_set_border_width(&style, 0);
lv_style_set_pad_all(&style, 0);
lv_obj_add_style(mainmenu_win, &style, 0);
lv_obj_t *roller1 = lv_roller_create(mainmenu_win);
lv_obj_add_style(roller1, &style, 0);
// lv_obj_set_style_bg_opa(roller1, LV_OPA_TRANSP, LV_PART_SELECTED);
lv_roller_set_options(roller1,
"January\n"
"February\n"
"March\n"
"April\n"
"May\n"
"June\n"
"July\n"
"August\n"
"September\n"
"October\n"
"November\n"
"December",
LV_ROLLER_MODE_INFINITE);
lv_obj_center(roller1);
lv_roller_set_visible_row_count(roller1, 3);
break;
}
}

View File

@ -1,7 +1,7 @@
#include "lvgl.h"
#include "img_def.h"
#include "mxc_meter.h"
#include "list.h"
#include "menu_list.h"
Local_UiCommon_t local_UiCommon = {0};

View File

@ -2,7 +2,7 @@
#include "img_def.h"
#include "demo.h"
#include "mxc_meter.h"
#include "list.h"
#include "menu_list"
#include "language_table.h"
#include "img_basic.h"
#include "lan_str_table.h"

View File

@ -52,18 +52,4 @@ lv_obj_t* lv_img_big_create(lv_obj_t* parent, const lv_img_dsc_t **src , lv_coor
return cont1;
}
//liulin 2024.2.29 增加销毁img创建接口,功能待实现
void lv_img_big_free(lv_obj_t* pObj)
{
if(pObj == NULL)
{
printf("free img obj pointer is NULL, return\n");
return;
}
//lv_img_buf_free(panel_light_group1_src);
//lv_mem_free(pObj->user_data);
}

View File

@ -1,454 +1,2 @@
#include <stdint.h>
#include <stddef.h>
//
////#include "os_task.h"
////#include "os_msg_q.h"
////#include "os_timer.h"
////#include "user_task.h"
//#include "button.h"
//
////#include "driver_pmu.h"
//
//#define BUTTON_IDX_MAX 1
//
//#define BUTTON_SHORT_DURING 0x08 // x10ms
//#define BUTTON_LONG_DURING 0x14 // x100ms
//#define BUTTON_LONG_LONG_DURING 0x28 // x100ms
//#define BUTTON_MULTI_INTERVAL 0x14 // x10ms
//#define BUTTON_LONG_PRESSING_INTERVAL 0x1e // x10ms
//
//uint8_t current_state = BUTTON_WORKING_STATE_IDLE;
//uint16_t button_task_id;
////os_timer_t button_anti_shake_timer;
////os_timer_t button_pressing_timer;
////os_timer_t button_state_timer;
//
///* which io is enabled for button function */
//uint32_t button_io_mask = 0;
//uint32_t curr_button_before_anti_shake = 0;
//uint32_t current_pressed_button = 0;
//uint32_t last_saved_button = 0;
//uint32_t button_to_be_send = 0; //for multi click
//uint8_t pressed_cnt = 0; //for multi click
//
//void button_toggle_detected(uint32_t curr_button)
//{
// //co_printf("button_toggle_detected curr_button :%x,button_io_mask :%x\r\n",curr_button,button_io_mask);
//
// if(button_io_mask != 0) {
// curr_button_before_anti_shake = curr_button & button_io_mask;
// os_timer_start(&button_anti_shake_timer, 10, false);
// }
//}
//
//void button_int_isr(uint32_t changed_button)
//{
// uint32_t curr_button;
// os_event_t toggle_event;
//
// curr_button = current_pressed_button ^ changed_button;
//
// toggle_event.event_id = BUTTON_TOGGLE;
// toggle_event.param = (void *)&curr_button;
// toggle_event.param_len = sizeof(uint32_t);
// os_msg_post(button_task_id, &toggle_event);
//}
//
//void button_send_event(uint8_t event, uint32_t button, uint8_t cnt)
//{
// os_event_t button_event;
// struct button_msg_t msg;
//
// msg.button_index = button;
// msg.button_type = event;
// msg.button_cnt = cnt;
//
// button_event.event_id = USER_EVT_BUTTON;
// button_event.src_task_id = button_task_id;
// button_event.param = (void *)&msg;
// button_event.param_len = sizeof(msg);
//
// os_msg_post(get_user_task_id(), &button_event);
//
// pressed_cnt = 0;
//}
//
//static void button_idle(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//static void button_just_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_state_timer);
// button_send_event(BUTTON_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_PRESSED;
// os_timer_start(&button_state_timer, (BUTTON_LONG_DURING*10-BUTTON_SHORT_DURING)*10, false);
// }
//}
//
//static void button_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// if(0/*__jump_table.button_disable_multi_click*/ & last_saved_button)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// button_send_event(BUTTON_SHORT_PRESSED, last_saved_button, 0);
// }
// else
// {
// //TBD<42><44><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// current_state = BUTTON_WORKING_STATE_WAIT_MULTI;
// button_to_be_send = last_saved_button;
// pressed_cnt++;
// os_timer_start(&button_state_timer, BUTTON_MULTI_INTERVAL*10, false);
// }
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_LONG_PRESSED;
// os_timer_start(&button_state_timer, ((BUTTON_LONG_LONG_DURING-BUTTON_LONG_DURING)*10)*10, false);
// os_timer_start(&button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10, false);
// button_send_event(BUTTON_LONG_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//static void button_wait_multi(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// if(current_pressed_button != button_to_be_send)
// {
// if(pressed_cnt > 1)
// {
// button_send_event(BUTTON_MULTI_PRESSED, button_to_be_send, pressed_cnt);
// }
// else
// {
// button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
// }
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// if(pressed_cnt > 1)
// {
// button_send_event(BUTTON_MULTI_PRESSED, button_to_be_send, pressed_cnt);
// }
// else
// {
// button_send_event(BUTTON_SHORT_PRESSED, button_to_be_send, pressed_cnt);
// }
// }
//}
//
//static void button_long_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_state_timer);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// button_send_event(BUTTON_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_LONG_LONG_PRESSED;
// button_send_event(BUTTON_LONG_LONG_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//static void button_long_long_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// os_timer_stop(&button_pressing_timer);
// current_state = BUTTON_WORKING_STATE_IDLE;
// button_send_event(BUTTON_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// button_send_event(BUTTON_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
//}
//
//static void button_comb_just_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_state_timer);
// button_send_event(BUTTON_COMB_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_RELEASED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_COMB_PRESSED;
// os_timer_start(&button_state_timer, (BUTTON_LONG_DURING*10-BUTTON_SHORT_DURING)*10, false);
// }
//}
//
//static void button_comb_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_state_timer);
// button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// button_send_event(BUTTON_COMB_SHORT_PRESSED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_COMB_LONG_PRESSED;
// os_timer_start(&button_state_timer, ((BUTTON_LONG_LONG_DURING-BUTTON_LONG_DURING)*10)*10, false);
// os_timer_start(&button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10, false);
// button_send_event(BUTTON_COMB_LONG_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//static void button_comb_long_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_state_timer);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_RELEASED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_TIME_OUT)
// {
// current_state = BUTTON_WORKING_STATE_COMB_LONG_LONG_PRESSED;
// button_send_event(BUTTON_COMB_LONG_LONG_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//static void button_comb_long_long_pressed(uint8_t event)
//{
// if(event == BUTTON_WORKING_EVENT_RELEASED)
// {
// current_state = BUTTON_WORKING_STATE_IDLE;
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_SINGLE_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_PRESSED, current_pressed_button, pressed_cnt);
// }
// else if(event == BUTTON_WORKING_EVENT_COMB_PRESSED)
// {
// current_state = BUTTON_WORKING_STATE_COMB_JUST_PRESSED;
// os_timer_start(&button_state_timer, BUTTON_SHORT_DURING*10, false);
// os_timer_stop(&button_pressing_timer);
// button_send_event(BUTTON_COMB_LONG_LONG_RELEASED, last_saved_button, pressed_cnt);
// button_send_event(BUTTON_COMB_PRESSED, current_pressed_button, pressed_cnt);
// }
//}
//
//void (*const button_statemachines[BUTTON_WORKING_STATE_MAX])(uint8_t) =
//{
// button_idle,
// button_just_pressed,
// button_pressed,
// button_wait_multi,
// button_long_pressed,
// button_long_long_pressed,
// button_comb_just_pressed,
// button_comb_pressed,
// button_comb_long_pressed,
// button_comb_long_long_pressed,
//};
//
////one or more button is released or pressed
//static int button_toggle_handler(uint32_t curr_button)
//{
// enum button_working_event_t event;
//
// current_pressed_button = curr_button;
//
// if(last_saved_button != current_pressed_button)
// {
// if(current_pressed_button == 0)
// {
// event = BUTTON_WORKING_EVENT_RELEASED;
// }
// else
// {
// if((current_pressed_button & (current_pressed_button-1)) == 0)
// {
// event = BUTTON_WORKING_EVENT_SINGLE_PRESSED;
// }
// else
// {
// event = BUTTON_WORKING_EVENT_COMB_PRESSED;
// }
// }
//
// button_statemachines[current_state](event);
//
// last_saved_button = current_pressed_button;
// }
//
// return EVT_CONSUMED;
//}
//
//static void button_timeout_handler(void *param)
//{
// button_statemachines[current_state](BUTTON_WORKING_EVENT_TIME_OUT);
//}
//
//static void button_pressing_timeout_handler(void *param)
//{
// enum button_type_t event;
// if((current_pressed_button & (current_pressed_button - 1)) == 0)
// {
// event = BUTTON_LONG_PRESSING;
// }
// else
// {
// event = BUTTON_COMB_LONG_PRESSING;
// }
//
// button_send_event(event, current_pressed_button, pressed_cnt);
//
// os_timer_start(&button_pressing_timer, BUTTON_LONG_PRESSING_INTERVAL*10, false);
//}
//
//static void button_anti_shake_timeout_handler(void *param)
//{
// uint32_t curr_button;
// os_event_t toggle_event;
//
// //milo modify curr_button = ool_read32(PMU_REG_PORTA_V);
// curr_button = ool_read32(PMU_REG_PORTA_LAST_STATUS);
// curr_button &= button_io_mask;
//
// if(curr_button == curr_button_before_anti_shake)
// {
// curr_button ^= button_io_mask;
// toggle_event.event_id = BUTTON_TOGGLE;
// toggle_event.param = (void *)&curr_button;
// toggle_event.param_len = sizeof(uint32_t);
// os_msg_post(button_task_id, &toggle_event);
// }
//}
//
//static int button_task_func(os_event_t *event)
//{
// switch(event->event_id)
// {
// case BUTTON_TOGGLE:
// button_toggle_handler(*(uint32_t *)event->param);
// break;
// }
//
// return EVT_CONSUMED;
//}
//
//void button_init(uint32_t enable_io)
//{
// button_io_mask = enable_io;
//
// button_task_id = os_task_create(button_task_func);
// os_timer_init(&button_anti_shake_timer, button_anti_shake_timeout_handler, NULL);
// os_timer_init(&button_pressing_timer, button_pressing_timeout_handler, NULL);
// os_timer_init(&button_state_timer, button_timeout_handler, NULL);
//}

View File

@ -4,7 +4,7 @@
typedef void (*btn_event_func)(lv_obj_t *obj);
#define LV_KEY_Q 113
#define LV_KEY_W 119
#define LV_KEY_W 10
//liulin 2024.3.5 用于发电机项目切换各个界面

View File

@ -82,32 +82,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
#if 1
lv_port_indev_init();
//机车仪表主界面
//moto_animo();
//亮度设置的主窗口
//light_create();
//发电机主界面
Generator_src_win();
//Generator_SubUI_Gtor_src_win();
//Generator_SubUI_ERROR_src_win();
// other_create();
// theme_bg_create();
// lv_example_scroll_3();
// lv_demo(get_root_win(),NULL);
//// enter_mainmenu_win(get_root_win());
//
// #if !MMI_WIN32_SIM
// InitSysDateTime();
// GetCurTimeString();//Get system time
// lvgl_main_task_timer = lv_timer_create(UpdateSysTime, 1000, NULL);
// #endif
Generator_src_win(get_root_win());
#endif

View File

@ -1,7 +1,7 @@
img_head_address=0x0000000
img_head_address=0x813A000
img_cut_w=480
img_cut_h=56
rle_enable=0
rle_enable=1
upper_enable=1
cut_exclude_char=clock_hand
align_left_space=80

View File

@ -2,35 +2,35 @@
#define __IMG_DEF_H__
#define img_head_address 0x0
#define img_head_address 0x813a000
#define IMG_BLUETOOTH_ICO (const lv_img_dsc_t *)(img_head_address + 0x0)
#define IMG_CURRENT_ICO (const lv_img_dsc_t *)(img_head_address + 0x538)
#define IMG_ERROR_ICO (const lv_img_dsc_t *)(img_head_address + 0xaf0)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_1 (const lv_img_dsc_t *)(img_head_address + 0x1028)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_2 (const lv_img_dsc_t *)(img_head_address + 0xde74)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_3 (const lv_img_dsc_t *)(img_head_address + 0x1acc0)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_4 (const lv_img_dsc_t *)(img_head_address + 0x27b0c)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_5 (const lv_img_dsc_t *)(img_head_address + 0x34958)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_6 (const lv_img_dsc_t *)(img_head_address + 0x417a4)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_1 (const lv_img_dsc_t *)(img_head_address + 0x48ce0)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_2 (const lv_img_dsc_t *)(img_head_address + 0x55a98)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_3 (const lv_img_dsc_t *)(img_head_address + 0x62850)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_4 (const lv_img_dsc_t *)(img_head_address + 0x6f608)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_5 (const lv_img_dsc_t *)(img_head_address + 0x7c3c0)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_6 (const lv_img_dsc_t *)(img_head_address + 0x89178)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_7 (const lv_img_dsc_t *)(img_head_address + 0x95f30)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_8 (const lv_img_dsc_t *)(img_head_address + 0xa2ce8)
#define IMG_OIL_ICO (const lv_img_dsc_t *)(img_head_address + 0xad070)
#define IMG_PERCENT_ICO (const lv_img_dsc_t *)(img_head_address + 0xae858)
#define IMG_POWER_ICO (const lv_img_dsc_t *)(img_head_address + 0xaeca0)
#define IMG_ROT_RATE_ICO (const lv_img_dsc_t *)(img_head_address + 0xaf1d8)
#define IMG_TIME1_ICO (const lv_img_dsc_t *)(img_head_address + 0xaf790)
#define IMG_TIME2_ICO (const lv_img_dsc_t *)(img_head_address + 0xafe5c)
#define IMG_TIME3_ICO (const lv_img_dsc_t *)(img_head_address + 0xb063c)
#define IMG_VOLTAGE_ICO (const lv_img_dsc_t *)(img_head_address + 0xb0ee8)
#define IMG_CURRENT_ICO (const lv_img_dsc_t *)(img_head_address + 0x490)
#define IMG_ERROR_ICO (const lv_img_dsc_t *)(img_head_address + 0x904)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_1 (const lv_img_dsc_t *)(img_head_address + 0xd0c)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_2 (const lv_img_dsc_t *)(img_head_address + 0x14fc)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_3 (const lv_img_dsc_t *)(img_head_address + 0x1c40)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_4 (const lv_img_dsc_t *)(img_head_address + 0x2084)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_5 (const lv_img_dsc_t *)(img_head_address + 0x2764)
#define IMG_ERROR_SUBUI_FRAMEWORK_ICO_6 (const lv_img_dsc_t *)(img_head_address + 0x2ea8)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_1 (const lv_img_dsc_t *)(img_head_address + 0x337c)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_2 (const lv_img_dsc_t *)(img_head_address + 0x41bc)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_3 (const lv_img_dsc_t *)(img_head_address + 0x5360)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_4 (const lv_img_dsc_t *)(img_head_address + 0x608c)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_5 (const lv_img_dsc_t *)(img_head_address + 0x6de8)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_6 (const lv_img_dsc_t *)(img_head_address + 0x732c)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_7 (const lv_img_dsc_t *)(img_head_address + 0x7da8)
#define IMG_GTOR_SUBUI_FRAMEWORK_ICO_8 (const lv_img_dsc_t *)(img_head_address + 0x8820)
#define IMG_OIL_ICO (const lv_img_dsc_t *)(img_head_address + 0x9154)
#define IMG_PERCENT_ICO (const lv_img_dsc_t *)(img_head_address + 0xa7f4)
#define IMG_POWER_ICO (const lv_img_dsc_t *)(img_head_address + 0xaa94)
#define IMG_ROT_RATE_ICO (const lv_img_dsc_t *)(img_head_address + 0xaeb8)
#define IMG_TIME1_ICO (const lv_img_dsc_t *)(img_head_address + 0xb320)
#define IMG_TIME2_ICO (const lv_img_dsc_t *)(img_head_address + 0xb868)
#define IMG_TIME3_ICO (const lv_img_dsc_t *)(img_head_address + 0xbe24)
#define IMG_VOLTAGE_ICO (const lv_img_dsc_t *)(img_head_address + 0xc414)
#endif

2
Remind
View File

@ -5,6 +5,6 @@
4.MXC-Screen_display 文件夹保存屏显相关工程
5.Tool 文件夹保存软硬件相关工具以及烧录工具
6.FreqChip_Download 文件夹保存烧录工具
7.SW 文件夹保存整个烧录工程

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
/*
****************************************************************************************
*
* @file app_error.h
* @version v1.0
* @brief error code of app layer
* @attention
* Copyright (C) 2023 Freqchip. \n
* All rights reserved. \n
*
*
****************************************************************************************
*/
#ifndef __APP_ERROR_H_
#define __APP_ERROR_H_
typedef enum app_error app_err_t;
enum app_error
{
/// no error
APP_ERR_NO_ERR = 0x00,
/// the input parameter is incorrect
APP_ERR_INVAILD_PARAM = 0x01,
/// the specified conidx has no device connection
APP_ERR_DEVICE_NOT_CONNECTED = 0x02,
// ----------------------------------------------------
// ----------------- GATT API Error -------------------
// ----------------------------------------------------
/// invaild client_id or service_id
APP_ERR_INVAILD_ID = 0x10,
/// GAP AND GATT service is deleted
APP_ERR_SVC_IS_DELETED = 0x11,
/// client handles group is empty
APP_ERR_CLIENT_HDL_IS_EMPTY = 0x12,
};
#endif

View File

@ -0,0 +1,127 @@
/****************************************************************************
*
* File:
* $Id: atconfig.h 1378 2009-04-14 23:22:21Z brentk $
* $Product: iAnywhere Hands-Free SDK version 2.x $
* $Revision: 1378 $
*
* Description: This file contains an AT Command Processor configuration
* constants.
*
* Copyright 2002-2005 Extended Systems, Inc.
* Portions copyright 2005-2009 iAnywhere Solutions, Inc.
* All rights reserved. All unpublished rights reserved.
*
* Unpublished Confidential Information of iAnywhere Solutions, Inc.
* Do Not Disclose.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of iAnywhere Solutions, Inc.
*
* Use of this work is governed by a license granted by iAnywhere Solutions,
* Inc. This work contains confidential and proprietary information of
* iAnywhere Solutions, Inc. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __ATCONFIG_H
#define __ATCONFIG_H
#include "config.h"
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_HEADSET
#define AT_HEADSET XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_HANDSFREE
#define AT_HANDSFREE XA_DISABLED
#endif
#if AT_HANDSFREE == XA_ENABLED
/* Headset commands must be included when using handsfree. */
#undef AT_HEADSET
#define AT_HEADSET XA_ENABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_PHONEBOOK
#define AT_PHONEBOOK XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_SMS
#define AT_SMS XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_DUN
#define AT_DUN XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_ROLE_TERMINAL
#define AT_ROLE_TERMINAL XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_ROLE_MOBILE
#define AT_ROLE_MOBILE XA_DISABLED
#endif
/*----------------------------------------------------------------------------
*
*/
#ifndef AT_MAX_PARMS
#define AT_MAX_PARMS 45
#endif
#if (AT_MAX_PARMS < 16) || (AT_MAX_PARMS > 255)
#error "AT_MAX_PARMS must be between 16 and 255."
#endif
/*----------------------------------------------------------------------------
* This is maximum the number of indicators that are supported by the Hands
* Free code. This value defaults to 20, but it can be changed to something
* less to save a few bytes by defining it in the overide.h file instead.
* This value must never be greater thatn 20, as indicated by the Hands Free
* specification Errata 2742. Note that 20 is NOT the maximum number of
* indicators that can be reported by a cell network to an audio gateway.
* However, it is the maximum number that can be reported over a Bluetooth
* Handsfree connection. If the cellular network has more than 20
* indicators, then the audio gateway will have to selectively limit what it
* reports to the Hands Free Unit.
*/
#ifndef AT_MAX_INDICATORS
#define AT_MAX_INDICATORS 20
#endif
#if (20 < AT_MAX_INDICATORS)
#error "HF Spec Errata 2742 violation: AT_MAX_INDICATORS must be less than or equal to 20."
#endif
#if (1 > AT_MAX_INDICATORS)
#error "AT_MAX_INDICATORS must be greater than 0."
#endif
#endif /* __ATCONFIG_H */

View File

@ -0,0 +1,66 @@
#ifndef __ATP_H
#define __ATP_H
/** This result acknowledges successful acceptance of a command. There are
* no parameters with this command.
*/
#define AT_OK 0x0000
/** This result indicates that the received command was not accepted. There
* are no parameters with this command.
*/
#define AT_ERROR 0x0001
/** This unsolicited result indicates an incoming call signal from network.
* There are no parameters with this command.
*/
#define AT_RING 0x0002
/** This result indicates that the received command was not accepted. The
* "error" parameter is used with this command.
*/
#define AT_EXTENDED_ERROR 0x0003
/** This command is used to enable or disable extended error reporting. The
* "error" parameter is used with this command.
*/
#define AT_SET_ERROR_MODE 0x0004
/** This command informs the mobile equipment of the character set used by
* the terminal equipment. The "charSet" parameter is used with this
* command.
*/
#define AT_SELECT_CHARACTER_SET 0x0005
/** This result indicates that the call could not be established or the
* connection was terminated. There are no parameters with this command.
*/
#define AT_NO_CARRIER 0x0006
/** This result indicates that the called party is busy. There are no
* parameters with this command.
*/
#define AT_BUSY 0x0007
/** This result indicates connection completion on timeout. There are no
* parameters with this command.
*/
#define AT_NO_ANSWER 0x0008
/** This result indicates that calls to the number are temporarily
* forbidden. There are no parameters with this command.
*/
#define AT_DELAYED 0x0009
/** This result indicates that calls to the number are forbidden until a
* manual reset. There are no parameters with this command.
*/
#define AT_BLACKLISTED 0x000A
/** This indicates that the data will be sent as 'raw' AT data. The
* "data" parameter is used with this response.
*/
#define AT_RAW 0x000B
#endif

View File

@ -0,0 +1,643 @@
#ifndef __AVCTP_API_H_
#define __AVCTP_API_H_
#include "btconfig.h"
#include "bt_types.h"
#include "me_api.h"
/*---------------------------------------------------------------------------
* AVCTP API layer
*
* The Audio/Video Remote Control Transport Protocol (AVCTP) defines
* procedures for exchanging 1394 Trade Association AV/C commands between
* Bluetooth enabled Audio/Video devices.
*
* This API is designed to support AV remote control applications using
* the iAnywhere Blue SDK core protocol stack. It provides an API
* for connection management and message handling.
*/
/****************************************************************************
*
* Types
*
****************************************************************************/
/*---------------------------------------------------------------------------
* AvctpEvent type
*
*/
typedef uint8_t AvctpEvent;
/** The transport layer is connected and commands/responses can now
* be exchanged.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_CONNECT 1
/** A remote device is attempting to connect the transport layer.
* Only the acceptor of the connection is notified. The acceptor must
* call AVCTP_ConnectRsp() to either accept or reject the connection.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_CONNECT_IND 2
/** The transport layer been disconnected.
*
* During this callback, the 'p.remDev' parameter is valid.
*/
#define AVCTP_EVENT_DISCONNECT 3
/** A command was received from the remote AVCTP device (controller).
*
* During this callback, the 'p.cmdFrame' parameter is valid. It contains the
* the AVCTP command header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_COMMAND 4
/** A response was received from the remote AVCTP device (target).
*
* During this callback, the 'p.rspFrame' parameter is valid. It contains the
* the AVCTP response header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_RESPONSE 5
/** The remote device (target) rejected the AVCTP command.
*
* During this callback, the 'p.rspFrame' parameter is valid. It contains the
* the AVCTP reject header information, including operands. If the "more"
* value is TRUE then this event only signals the first part of the operands.
* Subsequent AVCTP_EVENT_OPERANDS events will follow this event with
* additional operand data.
*/
#define AVCTP_EVENT_REJECT 6
/** A command (see AVCTP_SendCommand) or response (see AVCTP_SendResponse)
* has been sent. Memory allocated for the operation can be freed or reused
* after receiving this event.
*
* During this callback, the 'p.cmdFrame' or 'p.rspFrame' parameter associated
* with the sent command or response is valid. In addition, "status" will be
* set to indicate "BT_STATUS_SUCCESS" or "BT_STATUS_FAILED" to indicate
* whether the event was properly delivered.
*/
#define AVCTP_EVENT_TX_DONE 8
/** Additional operand data has been received for the previous
* AVCTP_EVENT_COMMAND or AVCTP_EVENT_RESPONSE.
*
* During this callback, the 'p.cmdFrame' or 'p.rspFrame' parameter associated
* with the received command or response is valid. The "operands" and
* "operandLen" fields indicate the chunk of operands being received for
* the command or response. If the "more" field is set to TRUE, the full
* operand buffer will be received in multiple _OPERANDS events and the
* last operand buffer indicated with the "more" field set to FALSE.
*/
#define AVCTP_EVENT_OPERANDS 9
/* End of AvctpEvent */
#define AVCTP_EVENT_LAST 9
/*---------------------------------------------------------------------------
* AvctpCtype type
*
* This type defines the AV/C ctype (command type) codes.
*/
typedef uint8_t AvctpCtype;
#define AVCTP_CTYPE_CONTROL 0x00
#define AVCTP_CTYPE_STATUS 0x01
#define AVCTP_CTYPE_SPECIFIC_INQUIRY 0x02
#define AVCTP_CTYPE_NOTIFY 0x03
#define AVCTP_CTYPE_GENERAL_INQUIRY 0x04
#define AVCTP_CTYPE_BROWSING 0x80
/* End of AvctpCtype */
/*---------------------------------------------------------------------------
* AvctpResponse type
*
* This type defines the AV/C response codes.
*/
typedef uint8_t AvctpResponse;
#define AVCTP_RESPONSE_NOT_IMPLEMENTED 0x08
#define AVCTP_RESPONSE_ACCEPTED 0x09
#define AVCTP_RESPONSE_REJECTED 0x0A
#define AVCTP_RESPONSE_IN_TRANSITION 0x0B
#define AVCTP_RESPONSE_IMPLEMENTED_STABLE 0x0C
#define AVCTP_RESPONSE_CHANGED 0x0D
#define AVCTP_RESPONSE_INTERIM 0x0F
#define AVCTP_RESPONSE_BROWSING 0x40
/* End of AvctpResponse */
/*---------------------------------------------------------------------------
* AvctpOpcode type
*
* This type defines the AV/C Opcodes.
*/
typedef uint8_t AvctpOpcode;
#define AVCTP_OPCODE_VENDOR_DEPENDENT 0x00
#define AVCTP_OPCODE_UNIT_INFO 0x30
#define AVCTP_OPCODE_SUBUNIT_INFO 0x31
#define AVCTP_OPCODE_PASS_THROUGH 0x7C
/* End of AvctpOpcode */
/* Forward references */
typedef struct _AvctpCallbackParms AvctpCallbackParms;
typedef struct _AvctpChannel AvctpChannel;
typedef struct _AvctpCmdFrame AvctpCmdFrame;
typedef struct _AvctpRspFrame AvctpRspFrame;
/*---------------------------------------------------------------------------
* AvctpCallback type
*
* A function of this type is called to indicate events to the application.
*/
typedef void (*AvctpCallback)(AvctpChannel *chnl, AvctpCallbackParms *Parms);
/* End of AvctpCallback */
/* Forward references */
typedef struct _AvctpConnCallbackParms AvctpConnCallbackParms;
typedef struct _AvctpConn AvctpConn;
/* Conn callback function */
typedef void (*AvctpConnCallback)(AvctpConn *Conn, const AvctpConnCallbackParms *Parms);
/* Conn calback parameters */
struct _AvctpConnCallbackParms {
uint8_t event;
uint16_t dataLen;
BtStatus status;
union {
BtRemoteDevice *remDev;
uint8_t *data;
} ptrs;
};
/* Connection State */
struct _AvctpConn {
uint16_t l2ChannelId;
uint16_t psm;
uint8_t state;
AvctpConnCallback callback;
BtRemoteDevice *remDev;
};
typedef struct _AvtpChannel AvtpChannel;
typedef struct _AvtpCallbackParms AvtpCallbackParms;
/* Channel Manager Callback */
typedef void (*AvtpCallback)(AvtpChannel *chnl, AvtpCallbackParms *Parms);
/* Channel Packet */
typedef struct _AvtpPacket {
ListEntry node;
uint8_t transId;
uint8_t msgType;
uint8_t msgHdrLen;
uint8_t msgHdr[10];
uint8_t txIdSize;
uint16_t txId;
uint16_t txDataLen;
uint8_t *txData;
uint32_t context;
} AvtpPacket;
/* Channel */
struct _AvtpChannel {
uint32_t context;
/* Identifier */
uint16_t rxId;
/* Transmit Packet */
ListEntry avPacketList;
AvtpPacket *curAvPacket;
/* Transmit State */
uint8_t txState;
uint16_t offset;
uint16_t packetSize;
uint8_t txPacketsLeft;
/* Channel Receive State */
uint8_t rxState;
uint8_t rxPacketsLeft;
/* Channel Resources */
BtPacket packet;
uint16_t l2ChannelId;
/* Command Timeout */
uint32_t txTimeout;
EvmTimer txTimer;
/* Channel Callback */
AvtpCallback callback;
};
/* Channel Callback Parameters */
struct _AvtpCallbackParms {
uint8_t event; /* Callback event type */
BtStatus status; /* Transport status */
uint8_t transId; /* Transaction ID */
uint8_t msgType; /* Message type */
uint8_t pktType; /* Packet type */
uint16_t rxId; /* RX ID */
uint8_t packetsLeft; /* Number of packet still to receive */
uint16_t len; /* Length of the current data */
AvtpPacket *packet; /* Pointer to the transmitted packet */
uint8_t *data; /* Pointer to the received data */
};
/****************************************************************************
*
* Data Structures
*
****************************************************************************/
/*---------------------------------------------------------------------------
* AvctpCmdFrame structure
*
* Defines the parameters required for an AVCTP command.
*/
struct _AvctpCmdFrame {
ListEntry node; /* Used internally by AVCTP. */
uint8_t transId; /* Transaction ID */
AvctpCtype ctype; /* 4 bits */
uint8_t subunitType; /* 5 bits */
uint8_t subunitId; /* 3 bits */
AvctpOpcode opcode; /* 8 bits */
uint8_t headerLen; /* Header length */
uint8_t header[6]; /* Header information */
uint16_t operandLen; /* Length of buffer in "operands" */
uint8_t *operands; /* Buffer containing the command data */
int more; /* Indicates whether to expect additional
* frames containing more operand data. */
AvtpPacket avtpPacket; /* For sending over AVTP */
EvmTimer timer; /* Timer for the command */
};
/*---------------------------------------------------------------------------
* AvctpRspFrame structure
*
* Defines the parameters required for an AVCTP response.
*/
struct _AvctpRspFrame {
ListEntry node; /* Used internally by AVCTP. */
uint8_t transId; /* Transaction ID */
AvctpResponse response; /* 4 bits */
uint8_t subunitType; /* 5 bits */
uint8_t subunitId; /* 3 bits */
AvctpOpcode opcode; /* 8 bits */
uint8_t headerLen; /* Header length */
uint8_t header[6]; /* Header information */
uint16_t operandLen; /* Length of buffer in "operands" */
uint8_t *operands; /* Buffer containing the response data */
int more; /* Indicates whether to expect additional
* frames containing more operand data. */
AvtpPacket avtpPacket; /* For sending over AVTP */
EvmTimer padding; /* Timer for the command */
};
/*---------------------------------------------------------------------------
* AvctpChannel structure
*
* Defines the AVCTP channel.
*/
struct _AvctpChannel {
/* === Internal use only === */
ListEntry node;
/* Transmit queue */
ListEntry txQueue;
/* Connection Handle */
AvctpConn conn;
/* Channel Handle */
AvtpChannel avtpChnl;
/* Current Transmitting Command */
void *curCmd;
/* Current Waiting Command ID */
uint8_t curId;
/* Current Transmitting Response */
void *curRsp;
/* Rx Frame */
union {
AvctpCmdFrame cmdFrame;
AvctpRspFrame rspFrame;
} rx;
/* System response packet */
AvtpPacket rspPacket;
/* Transaction ID */
uint8_t txTransId;
/* Receive State */
uint8_t rxState;
/* Transmit State */
uint8_t txState;
/* Application callback function */
AvctpCallback callback;
};
/*---------------------------------------------------------------------------
* AvctpCallbackParms structure
*
* Contains information for the application callback event.
*
*/
struct _AvctpCallbackParms {
/* AVCTP event */
AvctpEvent event;
/* AVCTP channel associated with the event */
AvctpChannel *channel;
/* Status of event (valid only for certain events) */
BtStatus status;
/* Callback parameter object, depending on "event" */
union {
/* Remote device associated with the event */
BtRemoteDevice *remDev;
/* Command frame associated with the event */
AvctpCmdFrame *cmdFrame;
/* Response frame associated with the event */
AvctpRspFrame *rspFrame;
} p;
};
/****************************************************************************
*
* Function Reference
*
****************************************************************************/
#if 0
/*---------------------------------------------------------------------------
* AVCTP_Register()
*
* Registers an application callback to receive AVCTP events. This
* function must be called before any other AVCTP functions.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* psm - The type of PSM to register (BT_PSM_AVCTP)
*
* callback - Identifies the application function that will be called
* with AVCTP events.
*
* Returns:
* BT_STATUS_SUCCESS - The AVCTP application callback Function was
* successfully registered.
*
* BT_STATUS_IN_USE - The specified channel is already in use.
*
* BT_STATUS_INVALID_PARM - The chnl or Callback parameter does not
* contain a valid pointer (XA_ERROR_CHECK only), or psm is not a
* valid PSM value.
*/
BtStatus AVCTP_Register(AvctpChannel *chnl,
L2capPsmValue psm,
AvctpCallback callback);
/*---------------------------------------------------------------------------
* AVCTP_Deregister()
*
* De-registers the AVCTP callback. After making this call
* successfully, the callback specified in AVCTP_Register will
* receive no further events.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* Returns:
* BT_STATUS_SUCCESS - The AVCTP callback was successfully deregistered.
*
* BT_STATUS_IN_USE - The specified channel is still in use.
*
* BT_STATUS_NOT_FOUND - An AVCTP callback was not previously registered.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*/
BtStatus AVCTP_Deregister(AvctpChannel *chnl);
/*---------------------------------------------------------------------------
* AVCTP_Connect()
*
* Initiates a signal channel connection to a remote AVCTP device. This
* function is used to establish the lower layer connection (L2CAP), which
* allows sending signal messages. Only one connection can exist between
* two devices.
*
* If the connection attempt is successful, the AVCTP_EVENT_CONNECT event
* will be received. If the connection attempt is unsuccessful, the
* AVCTP_EVENT_DISCONNECT event will be received.
*
* Parameters:
*
* chnl - Channel structure that receives or initiates connections.
*
* remDev - A connected remote device.
*
* Returns:
*
* BT_STATUS_PENDING - The connection process has been successfully
* started. When the connection process is complete, the
* application callback will receive either the AVCTP_EVENT_CONNECT or
* AVCTP_EVENT_DISCONNECT event.
*
* BT_STATUS_IN_USE - The connection already exists.
*
* BT_STATUS_RESTRICTED - A connection of this type already exists with the
* remote device.
*
* BT_STATUS_NOT_FOUND - An AVCTP channel was not previously registered.
*
* BT_STATUS_INVALID_PARM - The chnl or addr parameter does not contain a
* valid pointer (XA_ERROR_CHECK only).
*
* Other - It is possible to receive other error codes, depending on the
* lower layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_Connect(AvctpChannel *chnl, BtRemoteDevice *RemDev);
/*---------------------------------------------------------------------------
* AVCTP_ConnectRsp()
*
* Responds to a connection request from the remote AVCTP device. This
* function is used to establish the lower layer connection (L2CAP),
* which allows sending signaling messages, such as discover,
* configuration, and stream management.
*
* Parameters:
*
* Chnl - A registered and open AVCTP channel.
*
* Accept - TRUE accepts the connect or FALSE rejects the connection.
*
* Returns:
*
* BT_STATUS_PENDING - The connection responses has been successfully
* sent. When the connection process is complete, the application
* callback will receive the AVCTP_EVENT_CONNECT event.
*
* BT_STATUS_BUSY - The connection is already connected.
*
* BT_STATUS_INVALID_PARM - The Chnl parameter does not contain a
* valid pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified device was not found in the device
* selector database. The device must be discovered, paired, or added
* manually using DS_AddDevice().
*
* Other - It is possible to receive other error codes, depending on the
* lower layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_ConnectRsp(AvctpChannel *Chnl, int Accept);
/*---------------------------------------------------------------------------
* AVCTP_Disconnect()
*
* Terminates a connection with a remote AVCTP device. The lower layer
* connection (L2CAP) is disconnected.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* Returns:
*
* BT_STATUS_PENDING - The disconnect process has been successfully
* started. When the disconnect process is complete, the
* application callback will receive the AVCTP_EVENT_DISCONNECT event.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NO_CONNECTION - No connection exists on the specified
* channel.
*
* BT_STATUS_NOT_FOUND - The specified device was not found in the device
* selector database. The device must be discovered, paired, or added
* manually using DS_AddDevice().
*
* It is possible to receive other error codes, depending on the lower
* layer service in use (L2CAP or Management Entity).
*/
BtStatus AVCTP_Disconnect(AvctpChannel *chnl);
/*---------------------------------------------------------------------------
* AVCTP_SendCommand()
*
* Sends an AVCTP command on the specified channel. The channel must be
* connected and in the open state. The "cmdFrame" parameter must be
* set with valid AVCTP command parameters.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* cmdFrame - An AvctpCmdFrame structure initialized with valid
* AVCTP command parameters.
*
* Returns:
*
* BT_STATUS_PENDING - The send command operation has been started
* successfully. When the associated packet has been sent,
* the application callback will receive the AVCTP_EVENT_TX_DONE
* event.
*
* BT_STATUS_IN_USE - The command frame is alread in use on this channel.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified channel is not registered.
*/
BtStatus AVCTP_SendCommand(AvctpChannel *chnl, AvctpCmdFrame *cmdFrame);
/*---------------------------------------------------------------------------
* AVCTP_SendResponse()
*
* Sends an AVCTP response on the specified channel. The channel must be
* connected and in the open state. The "rspFrame" parameter must be
* set with valid AVCTP response parameters.
*
* Parameters:
*
* chnl - A registered and open AVCTP channel.
*
* rspFrame - An AvctpRspFrame structure initialized with valid
* AVCTP response parameters.
*
* Returns:
*
* BT_STATUS_PENDING - The send response operation has been started
* successfully. When the associated packet has been sent,
* the application callback will receive the AVCTP_EVENT_TX_DONE
* event.
*
* BT_STATUS_IN_USE - The response frame is alread in use on this channel.
*
* BT_STATUS_INVALID_PARM - The chnl parameter does not contain a valid
* pointer. (XA_ERROR_CHECK only).
*
* BT_STATUS_NOT_FOUND - The specified channel is not registered.
*/
BtStatus AVCTP_SendResponse(AvctpChannel *chnl, AvctpRspFrame *rspFrame);
/*---------------------------------------------------------------------------
* AVCTP_GetRemoteDevice()
*
* Returns a pointer to the current remote device.
*
* Parameters:
*
* chnl - An AVCTP channel.
*
* Returns:
*
* A pointer to a remote device.
*/
BtRemoteDevice * AVCTP_RemoteDevice(AvctpChannel *chnl);
#endif
#endif /* __AVCTP_H_ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
/*
****************************************************************************************
*
* @file app_error.h
* @version v1.0
* @brief error code of app layer
* @attention
* Copyright (C) 2023 Freqchip. \n
* All rights reserved. \n
*
*
****************************************************************************************
*/
#ifndef __APP_ERROR_H_
#define __APP_ERROR_H_
typedef enum ble_api_error ble_api_err_t;
enum ble_api_error
{
/// no error
BLE_API_ERR_NO_ERR = 0x00,
/// the input parameter is incorrect
BLE_API_ERR_INVAILD_PARAM = 0x01,
/// the specified conidx has no device connection
BLE_API_ERR_DEVICE_NOT_CONNECTED = 0x02,
// ----------------------------------------------------
// ----------------- GATT API Error -------------------
// ----------------------------------------------------
/// invaild client_id or service_id
BLE_API_ERR_INVAILD_ID = 0x10,
/// GAP and GATT service is deleted
BLE_API_ERR_SVC_IS_DELETED = 0x11,
/// client handles group is empty
BLE_API_ERR_CLIENT_HDL_IS_EMPTY = 0x12,
// ----------------------------------------------------
// ----------------- GAP API Error --------------------
// ----------------------------------------------------
///has not been paired with the target device
BLE_API_ERR_NOT_PAIRED = 0x30,
///activity state error
BLE_ACT_STATE_IS_ERR = 0x31,
///Bond information has been lost
BLE_API_ERR_BOND_INFO_LOST = 0x32,
};
#endif

View File

@ -0,0 +1,255 @@
#ifndef _BT_ERROR_H
#define _BT_ERROR_H
#include <stdint.h>
#include "cmsis_compiler.h"
#include "btconfig.h"
#ifndef LISTS_DEFINED
#define LISTS_DEFINED
typedef struct _ListEntry
{
struct _ListEntry *Flink;
struct _ListEntry *Blink;
} ListEntry;
#define InitializeListEntry(Entry) (\
(Entry)->Flink = (Entry)->Blink = 0 )
#endif
typedef __PACKED_STRUCT bdaddr_t {
uint8_t A[6];
} BD_ADDR;
__PACKED_STRUCT class_of_device_t {
uint8_t A[3];
};
__PACKED_STRUCT link_key_t{
uint8_t A[16];
};
#define XA_DISABLED 0 /* Disable the feature */
#define XA_ENABLED 1 /* Enable the feature */
/*---------------------------------------------------------------------------
* BtStatus type
*
* This type is returned from most stack APIs to indicate the success
* or failure of the operation. In many cases, BT_STATUS_PENDING
* is returned, meaning that a future callback will indicate the
* result of the operation.
*/
typedef int16_t BtStatus;
#define BT_STATUS_SUCCESS 0
#define BT_STATUS_FAILED 1
#define BT_STATUS_PENDING 2
#define BT_STATUS_BUSY 11
#define BT_STATUS_NO_RESOURCES 12
#define BT_STATUS_NOT_FOUND 13
#define BT_STATUS_DEVICE_NOT_FOUND 14
#define BT_STATUS_CONNECTION_FAILED 15
#define BT_STATUS_TIMEOUT 16
#define BT_STATUS_NO_CONNECTION 17
#define BT_STATUS_INVALID_PARM 18
#define BT_STATUS_IN_PROGRESS 19
#define BT_STATUS_RESTRICTED 20
#define BT_STATUS_INVALID_TYPE 21
#define BT_STATUS_HCI_INIT_ERR 22
#define BT_STATUS_NOT_SUPPORTED 23
#define BT_STATUS_IN_USE 5
#define BT_STATUS_SDP_CONT_STATE 24
#define BT_STATUS_CANCELLED 25
/* The last defined status code */
#define BT_STATUS_LAST_CODE 25
/* Protocol extensions can safely add status codes by defining
* them as (BT_STATUS_OPEN + x).
*/
#define BT_STATUS_OPEN 30
/* End of BtStatus */
#define BD_ADDR_SIZE 6
#ifndef NULL
#define NULL 0
#endif
#ifndef SUCCESS
#define SUCCESS 0
#endif
#ifndef FAILURE
#define FAILURE 1
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
#if BT_SCO_HCI_DATA == XA_ENABLED
/*---------------------------------------------------------------------------
* CmgrAudioData structure
*
* Contains audio data.
*/
typedef struct _CmgrAudioData {
uint16_t len;
uint8_t *data;
#if BT_STACK_VERSION >= 300
uint8_t errFlags;
#endif
} CmgrAudioData;
/*---------------------------------------------------------------------------
* HfAudioData type
*
* This type is only available when BT_SCO_HCI_DATA is set to XA_ENABLED.
* It can be used to store audio data received from the remote device.
*/
typedef CmgrAudioData HfAudioData;
/* End of HfAudioData */
#endif /* BT_SCO_HCI_DATA == XA_ENABLED */
/*---------------------------------------------------------------------------
* BtPacket structure
*
* Represents a packet of data. These packets may be used by applications
* to provide data to the stack. Certain stack events may also provide
* data to the application enclosed in a BtPacket structure.
*/
typedef struct _BtPacket
{
ListEntry node; /* Used internally by the stack. */
uint8_t *data; /* Points to a buffer of user data. */
uint16_t dataLen; /* Indicates the length of "data" in bytes. */
uint16_t flags; /* Must be initialized to BTP_FLAG_NONE by
* applications running on top of L2CAP. Other
* higher layer protocols must never modify this
* value.
*/
#if L2CAP_PRIORITY == XA_ENABLED
BtPriority priority; /* May be used to override the L2CAP channel
* BtPriority. If set to 0, packet will use the
* default priority set for the L2CAP channel.
*/
#endif
/* Group: The following fields are for internal use only by the stack. */
void *ulpContext;
uint8_t *tail;
uint16_t tailLen;
#if XA_STATISTICS == XA_ENABLED
uint32_t rfc_timer;
uint32_t hci_timer;
uint32_t l2cap_timer;
#endif /* XA_STATISTICS == XA_ENABLED */
uint16_t llpContext;
uint16_t remoteCid;
#if L2CAP_NUM_ENHANCED_CHANNELS > 0
uint8_t segStart;
uint16_t segNum;
uint16_t segCount;
uint8_t fcs[2];
#endif /* L2CAP_NUM_ENHANCED_CHANNELS > 0 */
uint8_t hciPackets;
uint8_t headerLen;
uint8_t header[BT_PACKET_HEADER_LEN];
} BtPacket;
#if 1
typedef struct _EvmTimer EvmTimer;
/*---------------------------------------------------------------------------
* Callback used to notify a stack component that the timer expired.
*/
typedef void (*EvmTimerNotify)(EvmTimer*);
typedef void (*co_time_timer_cb)(void* p_env);
/// Timer structure
typedef struct co_time_timer
{
/// Pointer to next timer in timer list
struct co_time_timer * p_next;
/// Pointer to environment that will be used as callback parameter.
void* p_env;
/// Callback to execute in background context upon timer expiration
co_time_timer_cb cb;
/// Expiration time [0-31] part (in milliseconds)
uint32_t exp_time_ms_lsb;
/// Timer bit field (@see enum co_time_timer_bf)
uint32_t timer_bf;
} co_time_timer_t;
/*---------------------------------------------------------------------------
* EvmTimer structure
*
* Represents a stack timer. This structure is for use by
* internal stack components only.
*/
struct _EvmTimer
{
void *context; /* Context area for use by callers */
EvmTimerNotify func; /* Function to call when timer fires */
struct co_time_timer co_time;
};
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,357 @@
/*
* @file btdm_host.h
* @version v1.0
* @brief GAP API exposed to app layer
* @attention
* Copyright (c) 2022 Freqchip. \n
* All rights reserved. \n
*/
#ifndef _BTDM_HOST_H
#define _BTDM_HOST_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdbool.h>
#include <stdint.h>
/* Exported types ------------------------------------------------------------*/
enum btdm_nvds_tag {
BTDM_NVDS_TAG_IRK, //!< local device irk
BTDM_NVDS_TAG_BOND_INFO, //!< BLE bonding information
BTDM_NVDS_TAG_MAX = BTDM_NVDS_TAG_BOND_INFO+16, //!< reserve 16 bonding information
BTDM_NVDS_TAG_CONTROLLER_INFO, //!< controller information
};
enum btdm_nvds_status {
BTDM_NVDS_STATUS_OK,
BTDM_NVDS_STATUS_FAILED,
};
struct ble_host_param {
/*
* this field is to indicate identity address is PUBLIC or RANDOM PRIVATE.
*/
uint8_t own_addr_type; // 0: public, 1:random static, other: unacceptable
/* local random static address, valied when own_addr_type is 1 */
struct {
uint8_t addr[6];
} own_addr;
};
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/*
* @fn ble_host_init
*
* @brief initialize ble host and HCI interface.
*
* param[in] param: BLE host parameters, @ref ble_host_param, default value is used when
* param is NULL
*/
void ble_host_init(struct ble_host_param *param);
/*
* @fn bt_host_init
*
* @brief initialize bt host, ble host should be ready before call this function.
*/
void bt_host_init(void);
/*
* @fn bt_a2dp_init
*
* @brief initialize a2dp profile, this function should be called following bt_stack_init.
*/
void bt_a2dp_init(void);
/*
* @fn bt_avrcp_init
*
* @brief initialize avrcp profile, this function should be called following bt_stack_init.
*/
void bt_avrcp_init(void);
/*
* @fn bt_hf_init
*
* @brief initialize HF profile, this function should be called following bt_stack_init.
*/
void bt_hf_init(void);
/*
* @fn bt_hfg_init
*
* @brief initialize HFG profile, this function should be called following bt_stack_init.
*/
void bt_hfg_init(void);
/*
* @fn bt_pan_init
*
* @brief initialize BNEP/PAN profile, this function should be called following bt_stack_init.
*/
void bt_pan_init(void);
/*
* @fn bt_hid_init
*
* @brief initialize HID profile, this function should be called following bt_stack_init.
*/
void bt_hid_init(void);
/*
* @fn bt_spp_init
*
* @brief initialize SPP profile, this function should be called following bt_stack_init.
*/
void bt_spp_init(void);
/*
* @fn bt_pbap_init
*
* @brief initialize PBAP profile, this function should be called following bt_stack_init.
*/
void bt_pbap_init(void);
/*
* @fn ble_host_ready
*
* @brief used to check whether ble host is ready or not.
*
* @return true: ble host is ready
*/
bool ble_host_ready(void);
/*
* @fn bt_host_ready
*
* @brief used to check whether bt host is ready or not.
*
* @return true: bt host is ready
*/
bool bt_host_ready(void);
/*
* @fn btdm_host_schedule
*
* @brief used to schedule btdm host internal event, this function should be called
* in system main loop.
*
* @example no RTOS:
* while(1) {
* btdm_host_schedule();
* // other process
* ...
* }
*
* RTOS:
* void stack_task(void)
* {
* while(1) {
* pending_new_event();
* btdm_host_schedule();
* }
* }
*
* void btdm_host_notify_schedule(void)
* {
* post_new_event();
* }
*/
void btdm_host_schedule(void);
/*
* @fn btdm_host_check_sleep
*
* @brief used to check whether system is allowed to enter sleep.
*
* @return true: btdm host can enter sleep right now
*/
bool btdm_host_check_sleep(void);
/*
* @fn btdm_host_schedule_ble
*
* @brief used to schedule ble host internal event, this function should be called
* in system main loop. This function is useful when only BLE is enabled.
*/
void btdm_host_schedule_ble(void);
/*
* @fn btdm_host_check_sleep_ble
*
* @brief used to check whether system is allowed to enter sleep. This function is useful
* when only BLE is enabled.
*
* @return true: ble host can enter sleep right now
*/
bool btdm_host_check_sleep_ble(void);
/*
* @fn btdm_timer_trigger
*
* @brief used to notice host timer is triggered.
*/
void btdm_timer_trigger(void);
/*
* @fn btdm_set_seed
*
* @brief initial seed for random generate function inside btdm stack.
*
* @param[in] seed: random seed.
*/
void btdm_set_seed(uint16_t seed);
/* Need to be implemented functions ------------------------------------------------*/
/*
* @fn btdm_malloc
*
* @brief allocate request size memory.
*
* @param[in] size: request size.
*
* @return allocated memory pointer
*/
void *btdm_malloc(uint32_t size);
/*
* @fn btdm_free
*
* @brief free allocated memory by btdm_malloc.
*
* @param[in] ptr: allocated memory pointer.
*/
void btdm_free(void *ptr);
/*
* @fn btdm_host_notify_schedule
*
* @brief used to notify btdm_host_schedule should be called to handle new btdm event,
* user should implement this function when RTOS is used, @ref btdm_host_schedule.
* Counting semaphore should be used because btdm_notify_schedule may be called more
* than one time before btdm_stack_schedule is called.
*/
void btdm_host_notify_schedule(void);
/*
* @fn btdm_host_lock
*
* @brief Called by the host to indicate the host and its APIs must not be entered by
* another task. This function should be implement when RTOS is used, and binary
* semaphore or mutex should be used.
*
* @example void btdm_stack_lock(void)
* {
* xSemaphoreTake();
* }
*/
void btdm_host_lock(void);
/*
* @fn btdm_host_unlock
*
* @brief Called by the host to allow access to the host again. This function should
* be implement when RTOS is used
*
* @example void btdm_stack_unlock(void)
* {
* xSemaphoreGive();
* }
*/
void btdm_host_unlock(void);
/*
* @fn btdm_timer_start
*
* @brief used to start or restart timer with target timeout time.
*
* @param[in] ms: timeout time(millisecond).
*/
void btdm_timer_start(uint32_t ms);
/*
* @fn btdm_timer_stop
*
* @brief used to stop timer.
*/
void btdm_timer_stop(void);
/*
* @fn btdm_get_system_time
*
* @brief used to get current time.
*
* @return current time(millisecond)
*/
uint32_t btdm_get_system_time(void);
/*
* @fn btdm_time_diff
*
* @brief Clocks time difference.
*
* @param[in] a_time value (in ms).
* @param[in] b_time value (in ms).
*
* @return result the time difference from a_time to b_time
* - result < 0 => b_time is in the past
* - result == 0 => a_time is equal to b_time
* - result > 0 => b_time is in the future
*/
int btdm_time_diff(uint32_t a_time, uint32_t b_time);
/*
* @fn btdm_nvds_put
*
* @brief Save generated data into NVDS.
*
* @param[in] tag: data type
* @param[in] length: data length
* @param[in] data: data pointer
*
* @return storage status, @ref btdm_nvds_status
*/
enum btdm_nvds_status btdm_nvds_put(uint8_t tag, uint16_t length, uint8_t *data);
/*
* @fn btdm_nvds_get
*
* @brief Get data from NVDS.
*
* @param[in] tag: data type
* @param[inout] length: buffer length for input, real data length for outpu
* @param[in] data: data pointer
*
* @return get data success or not, @ref btdm_nvds_status
*/
enum btdm_nvds_status btdm_nvds_get(uint8_t tag, uint16_t *length, uint8_t *buffer);
/*
* @fn btdm_nvds_del
*
* @brief delete data from NVDS with given tag.
*
* @param[in] tag: data type to be deleted
*
* @return delete success or not, @ref btdm_nvds_status
*/
enum btdm_nvds_status btdm_nvds_del(uint8_t tag);
#ifdef __cplusplus
}
#endif
#endif // _BTDM_HOST_H

View File

@ -0,0 +1,22 @@
#ifndef _BTDM_UTILS_H
#define _BTDM_UTILS_H
#include <stdint.h>
/* Little Endian to Host integer format conversion functions */
uint16_t LEtoHost16(const uint8_t *le_value);
uint32_t LEtoHost32(const uint8_t *le_value);
/* Big Endian to Host integer format conversion functions */
uint16_t BEtoHost16(const uint8_t* be_ptr);
uint32_t BEtoHost32(const uint8_t* be_ptr);
/* Store value into a buffer in Little Endian integer format */
void StoreLE16(uint8_t *buff, uint16_t le_value);
void StoreLE32(uint8_t *buff, uint32_t le_value);
/* Store value into a buffer in Big Endian integer format */
void StoreBE16(uint8_t *ptr, uint16_t be_value);
void StoreBE32(uint8_t *ptr, uint32_t be_value);
#endif // _BTDM_UTILS_H

View File

@ -0,0 +1,443 @@
/***************************************************************************
*
* File:
* $Id: config.h 588 2009-01-20 23:25:48Z gladed $
* $Product: iAnywhere Blue SDK v3.x $
* $Revision: 588 $
*
* Description:
* This file contains declarations for default protocol stack
* configuration.
*
* Created:
* November 19, 1996
*
* Copyright 1999-2005 Extended Systems, Inc.
* Portions copyright 2005-2008 iAnywhere Solutions, Inc.
* All rights reserved. All unpublished rights reserved.
*
* Unpublished Confidential Information of iAnywhere Solutions, Inc.
* Do Not Disclose.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of iAnywhere Solutions, Inc.
*
* Use of this work is governed by a license granted by iAnywhere Solutions,
* Inc. This work contains confidential and proprietary information of
* iAnywhere Solutions, Inc. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __CONFIG_H
#define __CONFIG_H
/*---------------------------------------------------------------------------
* General Configuration API layer
*
* The constants in this layer provide general configuration to
* communication protocol stacks compiled into the system. To change
* a constant, simply #define it in your overide.h include file.
*
* Configuration constants here and in other configuration API files
* are used to make the stack more appropriate for a particular
* environment. Constants can be modified to allow tradeoffs
* between code size, RAM usage, functionality, and throughput.
*
* Some constants are numeric, and others indicate whether a feature
* is enabled (defined as XA_ENABLED) or disabled (defined as
* XA_DISABLED).
*/
/****************************************************************************
*
* Constants
*
****************************************************************************/
#define XA_DISABLED 0 /* Disable the feature */
#define XA_ENABLED 1 /* Enable the feature */
/*---------------------------------------------------------------------------
* Include the override file. Settings in the override file will take
* precendence over the settings in this file and other configuration files.
*/
#include "overide.h"
/****************************************************************************
*
* Constants
*
****************************************************************************/
#ifndef XA_DEBUG
#if defined(XADEBUG) || defined(_DEBUG)
/*---------------------------------------------------------------------------
* XA_DEBUG constant
*
* When XA_DEBUG is enabled, debugging code is enabled throughout the
* stack, including OS_Report and OS_Assert calls and other code
* that verifies the proper behavior of the stack at run-time.
*
* When XA_DEBUG is disabled, debugging code is not compiled into the
* stack. Asserts and diagnostic output are removed. This results
* in a significant code size savings.
*
* You can specify the XA_DEBUG setting in the overide.h file. If it is
* not specified there, XA_DEBUG depends on the XADEBUG or _DEBUG
* constants defined at compile time. If XADEBUG or _DEBUG constants are
* defined, XA_DEBUG will be enabled. If the constants are not defined,
* XA_DEBUG will be disabled.
*/
#define XA_DEBUG XA_ENABLED
#else /* DEBUG symbols */
#define XA_DEBUG XA_DISABLED
#endif /* DEBUG symbols */
#endif /* XA_DEBUG not defined */
#ifndef XA_DEBUG_PRINT
/*---------------------------------------------------------------------------
* XA_DEBUG_PRINT constant
*
* When XA_DEBUG_PRINT is enabled, calls to OS_Report are
* enabled throughout the stack. These calls provide useful information
* about the internal state of the stack.
*
* When XA_DEBUG is disabled, OS_Report calls are not compiled into the
* stack. This results in a significant code size savings.
*
* By default, XA_DEBUG_PRINT inherits the state of the XA_DEBUG option.
* By setting it manually, you can control whether debug output messages
* appear independently of XA_DEBUG.
*/
#define XA_DEBUG_PRINT XA_DEBUG
#endif /* XA_DEBUG not defined */
#ifndef IRDA_STACK
/*---------------------------------------------------------------------------
* IRDA_STACK constant
*
* Controls whether IrDA-specific functionality is compiled into the
* system. This option is used in systems that can accommodate multiple
* transport mechanisms.
*
* By default, the IrDA stack is disabled.
*/
#define IRDA_STACK XA_DISABLED
#endif
#ifndef BT_STACK
/*---------------------------------------------------------------------------
* BT_STACK constant
*
* Controls whether Bluetooth-specific functionality is compiled into
* the system. This option is used in systems that can accommodate
* multiple transport mechanisms.
*/
#define BT_STACK XA_ENABLED
#endif
#ifndef XA_ERROR_CHECK
/*---------------------------------------------------------------------------
* XA_ERROR_CHECK constant
*
* Controls whether error checking code is compiled into the system.
*
* When XA_ERROR_CHECK is enabled, error checking code protects the
* stack API from illegal usage by verifying the entrance conditions
* for API call. This includes checking to make sure the API was called
* at the correct time, and checking each parameter for correctness
* before proceeding with any other processing.
*
* If an API returns a value marked XA_ERROR_CHECK only, the calling
* application has made a defective call which must be fixed.
*
* When XA_ERROR_CHECK is disabled, error checking code is not
* compiled into the system. This means that invalid API calls may
* cause strange errors to occur.
*
* Disabling error checking will result in significant code size savings,
* but it must only be disabled if you are confident that applications
* will not call stack APIs at inappropriate times or with invalid
* parameters.
*
* By default, error checking is enabled.
*/
#define XA_ERROR_CHECK XA_ENABLED
#endif
#ifndef XA_CONTEXT_PTR
/*---------------------------------------------------------------------------
* XA_CONTEXT_PTR constant
*
* Controls whether stack RAM is allocated dynamically or statically.
* All RAM used by stack components is kept in a stack context structure.
*
* When XA_CONTEXT_PTR is enabled, accesses to the context structure
* are performed using the "->" operand. This is required when
* the context structure is allocated dynamically (at run time).
*
* When XA_CONTEXT_PTR is disabled, accesses to the context structure
* are performed using the more efficient "." operand. This is allowed
* only if the context structure is allocated statically (at load time).
* This is more time- and ROM-efficient because references to stack
* variables are resolved at compile time rather than run time.
*
* Internally, all accesses to the stack context are protected through
* special macros. These macros are defined based on this configuration
* constant.
*
* By default, XA_CONTEXT_PTR is disabled.
*/
#define XA_CONTEXT_PTR XA_DISABLED
#endif /* XA_CONTEXT_PTR */
#ifndef XA_INTEGER_SIZE
/*---------------------------------------------------------------------------
* XA_INTEGER_SIZE constant
*
* Defines the preferred width of counter variables. In some systems,
* accesses to 2- or 4-byte variables is more time efficient than other
* sizes, even though they may take up more RAM. The stack attempts to
* honor this preference, except where a greater size is required.
*
* For instance, if XA_INTEGER_SIZE is defined as 2, 8-bit and 16-bit
* counters will both be defined as 16-bit variables.
*
* XA_INTEGER_SIZE may be 1, 2, or 4 and will affect the definition
* of I8, I16 types used internally by the stack. By default, 2-byte
* integers are preferred.
*/
#define XA_INTEGER_SIZE 2
#endif
#ifndef XA_USE_ENDIAN_MACROS
/*---------------------------------------------------------------------------
* XA_USE_ENDIAN_MACROS constant
*
* Controls how endian conversions are executed by the stack.
*
* When XA_USE_ENDIAN_MACROS is enabled, macros are used to perform
* big-endian and little-endian conversions. This increases overall
* ROM code size, but reduces RAM usage of the calling stack and
* reduces code execution time. Enabling XA_USE_ENDIAN_MACROS is similar
* to "inlining" all endian conversion routines.
*
* When XA_USE_ENDIAN_MACROS is disabled, function calls are substituted
* to convert big- and little-endian values. This increases execution
* time and calling stack RAM usage slightly, but decreases ROM code
* size.
*
* By default, endian macros are disabled (functions are used instead).
*/
#define XA_USE_ENDIAN_MACROS XA_DISABLED
#endif
#ifndef XA_MULTITASKING
/*---------------------------------------------------------------------------
* XA_MULTITASKING constant
*
* Controls whether the stack uses multitasking functions.
*
* When XA_MULTITASKING is enabled, the stack uses calls that protect
* the stack from reentrancy and minimize CPU usage. These calls include
* OS_StartTimer, OS_CancelTimer, OS_NotifyEvm, OS_LockStack, and
* OS_UnlockStack. This setting is appropriate when using a pre-emptive
* multitasking system.
*
* When XA_MULTITASKING is disabled, the functions listed above are not
* called by the stack. This is appropriate when using round-robin
* task scheduler that does not allow task blocking.
*
* By default, multitasking features are disabled.
*/
#define XA_MULTITASKING XA_ENABLED
#endif
#ifndef MS_TO_TICKS
/*---------------------------------------------------------------------------
* MS_TO_TICKS()
*
* Defines the conversion between system ticks and milliseconds. On some
* platforms, OS_GetSystemTime returns values in ticks instead of
* milliseconds. In this case, MS_TO_TICKS must be defined to
* convert a duration expressed in milliseconds to ticks.
*
* For example, a system with 4.4 millisecond ticks should define this
* macro in overide.h as follows:
*
* #define MS_TO_TICKS(ms) ((ms)*10/44)
*
* By default, no conversion is performed. This is appropriate when
* OS_GetSystemTime is able to return values in milliseconds.
*/
#define MS_TO_TICKS(ms) (ms)
#endif
#ifndef ContainingRecord
/*---------------------------------------------------------------------------
* ContainingRecord()
* Calculate the address of the base of the structure given its type
* and the address of a field within the structure.
*
* While this definition is within ANSI standards, there will probably
* be some compiler that has a problem with it. When in XA_DEBUG mode,
* a function called VerifyMacros exists that checks the behavior of
* this macro. This function will assert if this implementation of
* ContainingRecord does not work with your compiler.
*
* You may redefine the behavior of this macro by declaring a different
* version of it in your overide.h file.
*
* Parameters:
* fieldAddr - address of 'memberName'
*
* structType - structure type that contains 'memberName'
*
* memberName - name of structure member located at 'fieldAddr'
*
* Returns:
* The address of 'structType' that contains 'memberName' at 'fieldAddr'
*/
/*@notfunction@*/
#define ContainingRecord(fieldAddr, structType, memberName) ((structType *)( \
(U8 *)(fieldAddr) - (U8 *)(&((structType *)0)->memberName)))
#endif
#ifndef XA_EVENTMGR
/*---------------------------------------------------------------------------
* XA_EVENTMGR constant
*
* Controls whether the Event Manager functionality is compiled into the
* system. This option is used to enable the Event Manager when the stack
* transport does not automatically include it. Note that Event Manager
* support is always included in IrDA and Bluetooth stack builds.
*
* By default, the Event Manager is disabled.
*/
#define XA_EVENTMGR XA_DISABLED
#endif
#ifndef XA_SNIFFER
/*---------------------------------------------------------------------------
* XA_SNIFFER constant
*
* Controls whether the protocol sniffer hooks in various protocol layers
* are compiled into the system. The sniffer uses an endpoint registration
* function to manage a connection table which is used as a guide when
* decoding data packets. When enabled, the function SnifferRegisterEndpoint
* as described in debug.h must be implemented. When disabled, the sniffer
* functionality can still be accessed, but protocol specific decoding will
* stop at the L2CAP layer.
*
* By default, this option is disabled.
*/
#define XA_SNIFFER XA_DISABLED
#endif
#ifndef XA_DECODER
#if (XA_SNIFFER == XA_ENABLED) || (XA_DEBUG_PRINT == XA_ENABLED)
/*---------------------------------------------------------------------------
* XA_DECODER constant
*
* Determines whether the XA Decoder subsystem is included. This system
* allows internal stack components, profiles, and applications to
* register integer types for decoding at runtime, resulting in more
* readable debug log entries and displays. These calls are documented
* in utils.h.
*
* By default, XA_DECODER is enabled if either XA_DEBUG_PRINT or
* XA_SNIFFER are enabled.
*/
#define XA_DECODER XA_ENABLED
#else
#define XA_DECODER XA_DISABLED
#endif /* (XA_SNIFFER == XA_ENABLED) || (XA_DEBUG_PRINT == XA_ENABLED) */
#endif /* XA_DECODER */
#ifndef XA_LOAD_LIST
/*---------------------------------------------------------------------------
* XA_LOAD_LIST constant
*
* Specifies any optional protocol or profile components in this build,
* which require initialization. The core IrDA and Bluetooth protocols are
* not used in this constant. The components will be initialized in the
* order specified by this constant. If a component requires inclusion on
* this load list, it will be stated along with the initialization function
* prototype, in the main header file for the component and in the Implementer's
* Guide under the section for the profile or component being implemented.
*
* An example usage of this constant to initialize an OBEX based application is:
* #define XA_LOAD_LIST XA_MODULE(OBEX)
*
* Which will insert the following code in the event manager:
* extern BOOL OBEX_Init(void);
* if ((OBEX_Init && TRUE) != TRUE) { return FALSE; }
*
* An example of a implementation using GOEP and OBEX is:
* #define XA_LOAD_LIST XA_MODULE(OBEX) XA_MODULE(GOEP)
*
* By default, no optional protocol or profile modules are initialized.
*/
#define XA_LOAD_LIST
#endif
#ifndef XA_STATISTICS
/*---------------------------------------------------------------------------
* XA_STATISTICS constant
*
* Controls internal statistics-gathering macros. When enabled,
* certain stack components keep track of resource usage and timing.
* To extract this information, a module in your system must include
* /inc/sys/btstats.h and call BTSTAT_Report, which will send a
* set of statistics to debug output.
*
* For more information about the meaning of each statistic, see
* the Blue SDK Implementer's Guide.
*
* By default, statistics-gathering is disabled to save code size.
*
* Requires:
* XA_DEBUG enabled.
*/
#define XA_STATISTICS XA_DISABLED
#endif
#if XA_DEBUG == XA_DISABLED
#undef XA_STATISTICS
#define XA_STATISTICS XA_DISABLED
#endif
/*---------------------------------------------------------------------------
* Some pragmas to disable useless level-4 warnings. These are
* specific to MSVC.
*/
#ifdef WIN32
/* Conditional comparisons are not a problem */
#pragma warning(disable:4127)
/* Intentionally converting int to U8/U16 is done frequently, especially
* with += operators. */
#pragma warning(disable:4244)
/* If we cast a U16 constant to a U8, let's assume that was intentional */
#pragma warning(disable:4310)
#endif /* WIN32 */
#endif /* __CONFIG_H */

View File

@ -0,0 +1,356 @@
#ifndef _GAF_API_H
#define _GAF_API_H
#include <stdint.h>
#include "gap_api.h"
/// Length of Codec ID value
#define GAF_CODEC_ID_LEN (5)
#define GAF_KEY_LEN (16)
/// Event ID for callback
enum gaf_cb_event_id
{
GAF_BAP_CONFIGURED,
GAF_BAP_BC_SRC_GROUP_ADDED,
GAF_BAP_BC_SRC_GROUP_SET,
GAF_BAP_BC_SRC_SUBGROUP_SET,
GAF_BAP_BC_SRC_STREAM_SET,
GAF_BAP_BC_SRC_PA_ENABLED,
GAF_BAP_BC_SRC_ENABLED,
GAF_BAP_BC_SRC_STREAM_STARTED,
GAF_BAP_BC_SCAN_STARTED,
GAF_BAP_BC_SCAN_STOPPED,
GAF_BAP_BC_SCAN_PA_SYNC_STARTED,
GAF_BAP_BC_SCAN_PARAM_SET,
GAF_BAP_BC_SCAN_TIMEOUT,
GAF_BAP_BC_SCAN_REPORT,
GAF_BAP_BC_SCAN_PA_ESTABLISHED,
GAF_BAP_BC_SCAN_PA_TERMINATED,
GAF_BAP_BC_SCAN_PA_REPORT,
GAF_BAP_BC_SCAN_BIG_INFO_REPORT,
GAF_BAP_BC_SCAN_GROUP_REPORT,
GAF_BAP_BC_SCAN_SUBGROUP_REPORT,
GAF_BAP_BC_SCAN_STREAM_REPORT,
GAF_BAP_BC_SINK_ENABLED,
GAF_BAP_BC_SINK_STREAM_STARTED,
GAF_BAP_BC_SINK_ISO_DATA,
GAF_UNHANDLED_MSG,
};
/// Response Code values for ASE Control Point characteristic
enum bap_uc_cp_rsp_code
{
/// Success
BAP_UC_CP_RSP_CODE_SUCCESS = 0,
/// Unsupported Opcode
BAP_UC_CP_RSP_CODE_UNSUPPORTED_OPCODE,
/// Truncated Operation
BAP_UC_CP_RSP_CODE_TRUNACTED_OPERATION,
/// Invalid ASE ID
BAP_UC_CP_RSP_CODE_INVALID_ASE_ID,
/// Invalid ASE State Machine Transition
BAP_UC_CP_RSP_CODE_INVALID_TRANSITION,
/// Unsupported Audio Capabilities
BAP_UC_CP_RSP_CODE_UNSUPPORTED_AUDIO_CAPA,
/// Unsupported Configuration Parameter value
BAP_UC_CP_RSP_CODE_UNSUPPORTED_CFG_PARAM,
/// Rejected Configuration Parameter value
BAP_UC_CP_RSP_CODE_REJECTED_CFG_PARAM,
/// Invalid Configuration Parameter value
BAP_UC_CP_RSP_CODE_INVALID_CFG_PARAM,
/// Unsupported Metadata
BAP_UC_CP_RSP_CODE_UNSUPPORTED_METADATA,
/// Rejected Metadata
BAP_UC_CP_RSP_CODE_REJECTED_METADATA,
/// Invalid Metadata
BAP_UC_CP_RSP_CODE_INVALID_METADATA,
/// Insufficient Resources
BAP_UC_CP_RSP_CODE_INSUFFICIENT_RESOURCES,
/// Unspecified Error
BAP_UC_CP_RSP_CODE_UNSPECIFIED_ERROR,
BAP_UC_CP_RSP_CODE_MAX,
};
/// Reason values for ASE Control Point characteristic
enum bap_uc_cp_reason
{
BAP_UC_CP_REASON_MIN = 1,
/// Direction
BAP_UC_CP_REASON_DIRECTION = BAP_UC_CP_REASON_MIN,
/// Codec ID
BAP_UC_CP_REASON_CODEC_ID,
/// Codec Specific Configuration Length
BAP_UC_CP_REASON_CODEC_CFG_LEN,
/// Codec Specific Configuration
BAP_UC_CP_REASON_CODEC_CFG,
/// SDU Interval
BAP_UC_CP_REASON_SDU_INTERVAL,
/// Framing
BAP_UC_CP_REASON_FRAMING,
/// PHY
BAP_UC_CP_REASON_PHY,
/// Maximum SDU Size
BAP_UC_CP_REASON_MAX_SDU_SIZE,
/// Retransmission Number
BAP_UC_CP_REASON_RETX_NB,
/// Transport Latency
BAP_UC_CP_REASON_TRANS_LATENCY,
/// Presentation Delay
BAP_UC_CP_REASON_PRES_DELAY,
/// Metadata length
BAP_UC_CP_REASON_METADATA_LEN,
BAP_UC_CP_REASON_MAX,
};
/// Codec Identifier
typedef struct gaf_codec_id
{
/// Codec ID value
uint8_t codec_id[GAF_CODEC_ID_LEN];
} gaf_codec_id_t;
/// Broadcast code used for stream encryption
typedef struct gaf_bcast_code_t
{
/// Broadcast Code value
uint8_t bcast_code[GAF_KEY_LEN];
} gaf_bcast_code_t;
/// QoS Requirement structure
typedef struct bap_qos_req
{
/// Preferred SDU interval minimum in microseconds
/// From 255us (0xFF) to 16777215us (0xFFFFFF)
uint32_t sdu_intv_min_us;
/// Preferred SDU interval maximum in microseconds
/// From 255us (0xFF) to 16777215us (0xFFFFFF)
uint32_t sdu_intv_max_us;
/// Presentation delay minimum microseconds
uint32_t pres_delay_min_us;
/// Presentation delay maximum in microseconds
uint32_t pres_delay_max_us;
/// Preferred Transport latency maximum in milliseconds
/// From 5ms (0x5) to 4000ms (0xFA0)
uint16_t trans_latency_max_ms;
/// Preferred maximum SDU size
/// From 0 to 4095 bytes (0xFFF)
uint16_t max_sdu_size;
/// Preferred PDU framing arrangement
uint8_t framing;
/// Preferred PHY bit field
uint8_t phy_bf;
/// Preferred maximum number of retransmissions for each CIS Data PDU
/// From 0 to 15
uint8_t retx_nb;
} bap_qos_req_t;
/// Broadcast Group Parameters structure
typedef struct bap_bc_grp_param
{
/// SDU interval in microseconds
uint32_t sdu_intv_us;
/// Maximum size of an SDU
uint16_t max_sdu;
/// Maximum time (in milliseconds) between the first transmission of an SDU to the end of the last transmission
/// of the same SDU
uint16_t max_tlatency;
/// Sequential or Interleaved scheduling
uint8_t packing;
/// Unframed or framed mode
uint8_t framing;
/// Bitfield indicating PHYs that can be used by the controller for transmission of SDUs
uint8_t phy_bf;
/// Number of times every PDU should be transmitted
uint8_t rtn;
}bap_bc_grp_param_t;
/// Advertising Parameters structure
typedef struct bap_bc_adv_param
{
/// Minimum advertising interval in multiple of 0.625ms. Must be higher than 20ms.
uint32_t adv_intv_min_slot;
/// Maximum advertising interval in multiple of 0.625ms. Must be higher than 20ms.
uint32_t adv_intv_max_slot;
/// Channel Map
uint8_t chnl_map;
/// PHY for primary advertising. Only LE 1M and LE Codec PHYs are allowed
uint8_t phy_prim;
/// PHY for secondary advertising
uint8_t phy_second;
/// Advertising SID
uint8_t adv_sid;
}bap_bc_adv_param_t;
/// Periodic Advertising Parameters structure
typedef struct bap_bc_per_adv_param
{
/// Minimum periodic advertising interval in multiple of 1.25ms. Must be higher than 7.5ms
uint32_t adv_intv_min_frame;
/// Maximum periodic advertising interval in multiple of 1.25ms. Must be higher than 7.5ms
uint32_t adv_intv_max_frame;
} bap_bc_per_adv_param_t;
/// BIG Info Report
typedef struct gaf_big_info
{
/// Value of the SDU interval in microseconds (Range 0x0000FF-0x0FFFFF)
uint32_t sdu_interval;
/// Value of the ISO Interval (1.25 ms unit)
uint16_t iso_interval;
/// Value of the maximum PDU size (Range 0x0000-0x00FB)
uint16_t max_pdu;
/// VValue of the maximum SDU size (Range 0x0000-0x0FFF)
uint16_t max_sdu;
/// Number of BIS present in the group (Range 0x01-0x1F)
uint8_t num_bis;
/// Number of sub-events (Range 0x01-0x1F)
uint8_t nse;
/// Burst number (Range 0x01-0x07)
uint8_t bn;
/// Pre-transmit offset (Range 0x00-0x0F)
uint8_t pto;
/// Initial retransmission count (Range 0x01-0x0F)
uint8_t irc;
/// PHY used for transmission (0x01: 1M, 0x02: 2M, 0x03: Coded, All other values: RFU)
uint8_t phy;
/// Framing mode (0x00: Unframed, 0x01: Framed, All other values: RFU)
uint8_t framing;
/// True if broadcast isochronous group is encrypted, False otherwise
bool encrypted;
} gaf_big_info_t;
typedef struct gaf_iso_data {
uint16_t sdu_seq;
uint16_t length;
uint8_t *buffer;
bool ts_exist;
uint32_t ts;
} gaf_iso_data_t;
typedef union _gaf_callback_param {
uint16_t status;
struct {
struct gap_ble_addr addr;
uint8_t adv_sid;
uint8_t length;
uint8_t *data;
} scan_report;
struct {
uint8_t pa_lid;
struct gap_ble_addr addr;
uint8_t adv_sid;
} scan_pa_establised;
struct {
uint8_t pa_lid;
uint8_t reason;
} scan_pa_terminated;
struct {
uint8_t pa_lid;
uint8_t length;
uint8_t *data;
} scan_pa_report;
struct {
uint8_t pa_lid;
struct gaf_big_info *big_info;
} scan_big_info_report;
struct {
uint8_t pa_lid;
uint8_t nb_subgroup;
uint8_t nb_stream;
uint32_t pres_delay_us;
} scan_group_report;
struct {
uint8_t pa_lid;
uint8_t subgroup_lid;
gaf_codec_id_t *codec_id;
uint32_t stream_pos_bf;
uint8_t cfg_len;
uint8_t metadata_len;
uint8_t *cfg;
uint8_t *metadata;
} scan_subgroup_report;
struct {
uint8_t pa_lid;
uint32_t stream_pos;
uint8_t cfg_len;
uint8_t *cfg;
} scan_stream_report;
struct {
uint8_t stream_lid;
bool ts_exist;
uint32_t ts;
uint16_t sdu_seq;
uint16_t length;
uint8_t *buffer;
} sink_iso_data;
struct {
uint16_t msg_type;
uint16_t cmd_code;
uint16_t status;
} unhandled_msg;
} gaf_callback_param_t;
typedef void (*gaf_callback_t)(uint8_t event, gaf_callback_param_t *param);
void gaf_cfg(gaf_callback_t cb);
void gaf_bap_capa_record_add(uint8_t pac_id, uint8_t record_id, gaf_codec_id_t *codec_id, uint16_t cap_len, uint8_t *cap);
void gaf_bap_capa_record_remove(uint8_t record_id);
void gaf_bap_uc_srv_codec_configure(uint8_t con_lid, uint8_t ase_lid, uint8_t ase_instance_idx, uint8_t direction, uint8_t dp_id,
gaf_codec_id_t *codec_id, bap_qos_req_t *qos_req, uint32_t ctl_delay_us,
uint16_t cfg_len, uint8_t *cfg);
void gaf_bap_uc_srv_codec_configure_cfm(uint16_t status, uint8_t rsp_code, uint8_t reason, uint8_t ase_lid, uint8_t dp_id,
gaf_codec_id_t *codec_id, bap_qos_req_t *qos_req, uint32_t ctl_delay_us,
uint16_t cfg_len, uint8_t *cfg);
void gaf_bap_bc_src_group_add(uint8_t nb_stream, uint8_t nb_subgroups,
bap_bc_grp_param_t *grp_param,
bap_bc_adv_param_t *adv_param,
bap_bc_per_adv_param_t *per_adv_param);
void gaf_bap_bc_src_group_set(uint8_t grp_lid, uint32_t pres_delay_us, gaf_codec_id_t *codec_id,
uint8_t cfg_len, uint8_t metadata_len, uint8_t *val);
void gaf_bap_bc_src_subgroup_set(uint8_t grp_lid, uint8_t sgrp_lid,
uint8_t metadata_len, uint8_t *metadata);
void gaf_bap_bc_src_stream_set(uint8_t grp_lid, uint8_t sgrp_lid, uint8_t stream_lid, uint32_t ctl_delay_us, uint8_t dp_id,
uint8_t cfg_len, uint8_t *cfg);
void gaf_bap_bc_src_pa_enable(uint8_t grp_lid, uint8_t adv_data_len, uint8_t per_adv_data_len, uint8_t *data);
void gaf_bap_bc_src_enable(uint8_t grp_lid, uint8_t encrypted, gaf_bcast_code_t *bcast_code);
void gaf_bap_bc_src_stream_start(uint8_t grp_lid, uint32_t stream_lid_bf);
void gaf_bap_bc_src_send_data(uint8_t grp_lid, uint8_t stream_lid, gaf_iso_data_t *data);
void gaf_bap_bc_scan_set_param(uint16_t intv_1m_slot, uint16_t intv_coded_slot,
uint16_t wd_1m_slot, uint16_t wd_coded_slot);
void gaf_bap_bc_scan_start(uint16_t timeout_s);
void gaf_bap_bc_scan_stop(void);
void gaf_bap_bc_scan_pa_sync(struct gap_ble_addr *addr, uint8_t adv_sid, uint16_t skip, uint8_t report_filter_bf, uint16_t sync_to, uint16_t timeout_s);
void gaf_bap_bc_sink_enable(uint8_t pa_lid, uint8_t mse, uint32_t stream_pos_bf,
uint16_t timeout_s,
uint8_t encrypted,
gaf_bcast_code_t *bcast_code);
void gaf_bap_bc_sink_stream_start(uint8_t grp_lid, uint8_t stream_pos, uint32_t ctl_delay_us,
gaf_codec_id_t *codec_id,
uint8_t dp_id, uint8_t cfg_len,
uint8_t *cfg);
#endif // _GAF_API_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,156 @@
#ifndef _GAP_DEFINES_H
#define _GAP_DEFINES_H
/// Own BD address source of the device
enum gapm_own_addr
{
/// Public or Private Static Address according to device address configuration
GAPM_STATIC_ADDR,
/// Generated resolvable private random address
GAPM_GEN_RSLV_ADDR,
/// Generated non-resolvable private random address
GAPM_GEN_NON_RSLV_ADDR,
};
/// PHY Type
enum gapm_phy_type
{
/// LE 1M
GAPM_PHY_TYPE_LE_1M = 1,
/// LE 2M
GAPM_PHY_TYPE_LE_2M,
/// LE Coded
GAPM_PHY_TYPE_LE_CODED,
};
/// PHY Type
enum gapm_phy_mask
{
/// LE 1M
GAPM_PHY_MASK_LE_1M = (1 << 0),
/// LE 2M
GAPM_PHY_MASK_LE_2M = (1 << 1),
/// LE Coded
GAPM_PHY_MASK_LE_CODED = (1 << 2),
/// ALL
GAPM_PHY_MASK_ALL = (GAPM_PHY_MASK_LE_1M | GAPM_PHY_MASK_LE_2M | GAPM_PHY_MASK_LE_CODED),
};
/// Type of advertising that can be created
enum gapm_adv_type
{
/// Legacy advertising
GAPM_ADV_TYPE_LEGACY = 0,
/// Extended advertising
GAPM_ADV_TYPE_EXTENDED,
/// Periodic advertising
GAPM_ADV_TYPE_PERIODIC,
};
/// Advertising discovery mode
enum gapm_adv_disc_mode
{
/// Mode in non-discoverable
GAPM_ADV_MODE_NON_DISC = 0,
/// Mode in general discoverable
GAPM_ADV_MODE_GEN_DISC,
/// Mode in limited discoverable
GAPM_ADV_MODE_LIM_DISC,
/// Broadcast mode without presence of AD_TYPE_FLAG in advertising data
GAPM_ADV_MODE_BEACON,
GAPM_ADV_MODE_MAX,
};
/// Advertising properties bit field bit positions
enum gapm_adv_prop_bf
{
/// Indicate that advertising is connectable, reception of CONNECT_REQ or AUX_CONNECT_REQ
/// PDUs is accepted. Not applicable for periodic advertising.
GAPM_ADV_PROP_CONNECTABLE_POS = 0,
GAPM_ADV_PROP_CONNECTABLE_BIT = 0x0001,
/// Indicate that advertising is scannable, reception of SCAN_REQ or AUX_SCAN_REQ PDUs is
/// accepted
GAPM_ADV_PROP_SCANNABLE_POS = 1,
GAPM_ADV_PROP_SCANNABLE_BIT = 0x0002,
/// Indicate that advertising targets a specific device. Only apply in following cases:
/// - Legacy advertising: if connectable
/// - Extended advertising: connectable or (non connectable and non discoverable)
GAPM_ADV_PROP_DIRECTED_POS = 2,
GAPM_ADV_PROP_DIRECTED_BIT = 0x0004,
/// Indicate that High Duty Cycle has to be used for advertising on primary channel
/// Apply only if created advertising is not an extended advertising
GAPM_ADV_PROP_HDC_POS = 3,
GAPM_ADV_PROP_HDC_BIT = 0x0008,
/// Bit 4 is reserved
GAPM_ADV_PROP_RESERVED_4_POS = 4,
GAPM_ADV_PROP_RESERVED_4_BIT = 0x0010,
/// Enable anonymous mode. Device address won't appear in send PDUs
/// Valid only if created advertising is an extended advertising
GAPM_ADV_PROP_ANONYMOUS_POS = 5,
GAPM_ADV_PROP_ANONYMOUS_BIT = 0x0020,
/// Include TX Power in the extended header of the advertising PDU.
/// Valid only if created advertising is not a legacy advertising
GAPM_ADV_PROP_TX_PWR_POS = 6,
GAPM_ADV_PROP_TX_PWR_BIT = 0x0040,
/// Include TX Power in the periodic advertising PDU.
/// Valid only if created advertising is a periodic advertising
GAPM_ADV_PROP_PER_TX_PWR_POS = 7,
GAPM_ADV_PROP_PER_TX_PWR_BIT = 0x0080,
/// Indicate if application must be informed about received scan requests PDUs
GAPM_ADV_PROP_SCAN_REQ_NTF_EN_POS = 8,
GAPM_ADV_PROP_SCAN_REQ_NTF_EN_BIT = 0x0100,
};
/// Scanning Types
enum gapm_scan_type
{
/// General discovery
GAPM_SCAN_TYPE_GEN_DISC = 0,
/// Limited discovery
GAPM_SCAN_TYPE_LIM_DISC,
/// Observer
GAPM_SCAN_TYPE_OBSERVER,
/// Selective observer
GAPM_SCAN_TYPE_SEL_OBSERVER,
/// Connectable discovery
GAPM_SCAN_TYPE_CONN_DISC,
/// Selective connectable discovery
GAPM_SCAN_TYPE_SEL_CONN_DISC,
};
/// IO Capability Values
enum gap_io_cap
{
/// Display Only
GAP_IO_CAP_DISPLAY_ONLY = 0x00,
/// Display Yes No
GAP_IO_CAP_DISPLAY_YES_NO,
/// Keyboard Only
GAP_IO_CAP_KB_ONLY,
/// No Input No Output
GAP_IO_CAP_NO_INPUT_NO_OUTPUT,
/// Keyboard Display
GAP_IO_CAP_KB_DISPLAY,
GAP_IO_CAP_LAST
};
/// OOB Data Present Flag Values
enum gap_oob
{
/// OOB Data not present
GAP_OOB_AUTH_DATA_NOT_PRESENT = 0x00,
/// OOB data present
GAP_OOB_AUTH_DATA_PRESENT,
GAP_OOB_AUTH_DATA_LAST
};
#endif // _GAP_DEFINES_H

View File

@ -0,0 +1,532 @@
#ifndef _GATT_API_H
#define _GATT_API_H
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "gatt_defines.h"
#include "gatt_sig_uuid.h"
#include "ble_api_error.h"
/* Exported types ------------------------------------------------------------*/
enum gatt_msg_evt {
GATTS_MSG_READ_REQ, //!< GATT service received read request
GATTS_MSG_WRITE_REQ, //!< GATT service received write request
GATTS_MSG_ATT_INFO_REQ, //!< GATT service received get att information request
GATTC_MSG_NTF_REQ, //!< GATT client notification received
GATTC_MSG_IND_REQ, //!< GATT client indication received
GATTC_MSG_READ_IND, //!< GATT client read response received
GATTC_MSG_CMP_EVT, //!< GATT client message complete event
GATTC_MSG_LINK_CREATE, //!< A Link is established
GATTC_MSG_LINK_LOST, //!< A Link is lost
GATTC_MSG_SVC_REPORT, //!< GATT client received report of service discovery
GATTC_MSG_CHAR_REPORT, //!< GATT client received report of characteristic discovery
GATTC_MSG_CHAR_DESC_REPORT, //!< GATT client received report of characteristic describtion discovery
};
enum gatt_event_type {
ENABLE_TYPE_NTF, //!< notification type
ENABLE_TYPE_IND, //!< indication type
};
#define UUID_SIZE_2 2 //!< 16-bits UUID, usually SIG assigned UUID.
#define UUID_SIZE_4 4 //!< 32-bits UUID, usually assigned by users.
#define UUID_SIZE_16 16 //!< 128-bits UUID, usually assigned by users.
/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields
* @{
*/
#define GATT_PROP_BROADCAST (1<<0) //!< Attribute is able to broadcast
#define GATT_PROP_READ (1<<1) //!< Attribute is Readable
#define GATT_PROP_WRITE_CMD (1<<2) //!< Attribute supports write with no response
#define GATT_PROP_WRITE_REQ (1<<3) //!< Attribute supports write request
#define GATT_PROP_NOTI (1<<4) //!< Attribute is able to send notification
#define GATT_PROP_INDI (1<<5) //!< Attribute is able to send indication
#define GATT_PROP_SIG_WRTIE (1<<6) //!< Attribute supports authenticated signed write
#define GATT_PROP_EXTEND_PROP (1<<7) //!< Attribute supports extended properities
#define GATT_PROP_READ_UNAUTH (1<<8) //!< Attribute read requires Unauthentication(Just work pairring method)
#define GATT_PROP_READ_AUTHEN (2<<8) //!< Attribute read requires Authentication(Legacy mode. Pass key or OOB pairring method)
#define GATT_PROP_READ_SECURE_CONN (3<<8) //!< Attribute read requires Secure Connection(Secure connect mode. Pass key\OOB\Numbric Comparision pairing method)
#define GATT_PROP_WRITE_UNAUTH (1<<10) //!< Attribute write requires Unauthentication
#define GATT_PROP_WRITE_AUTHEN (2<<10) //!< Attribute write requires Authentication
#define GATT_PROP_WRITE_SECURE_CONN (3<<10) //!< Attribute write requires Secure Connection
#define GATT_PROP_NI_UNAUTH (1<<12) //!< Attribute notification or indication requires Unauthentication
#define GATT_PROP_NI_AUTHEN (2<<12) //!< Attribute notification or indication requires Authentication
#define GATT_PROP_NI_SECURE_CONN (3<<12) //!< Attribute notification or indication requires Secure Connection
/** @} End GATT_PERMIT_BITMAPS_DEFINES */
/** @defgroup GATT_OPERATION_NAME_DEFINES GATT operation name define, used with GATTC_MSG_CMP_EVT
* @{
*/
#define GATT_OP_NOTIFY 0x01 //!< GATT notification operation
#define GATT_OP_INDICA 0x02 //!< GATT indication operation
#define GATT_OP_PEER_SVC_REGISTERED 0x03 //!< Used with GATTC_CMP_EVT, GATT peer device service registered
#define GATT_OP_WRITE_REQ 0x05 //!< GATT wirte request operation
#define GATT_OP_WRITE_CMD 0x06 //!< GATT wirte command operation, write without response
#define GATT_OP_READ 0x07 //!< GATT read operation
#define GATT_OP_PEER_SVC_DISC_END 0x08 //!< Used with GATTC_CMP_EVT, GATT peer device service discovery is ended
#define GATT_OP_PEER_CHAR_DISC_END 0X09 //!< Used with GATTC_CMP_EVT, GATT peer device characteristic discovery is ended
#define GATT_OP_PEER_DESC_DISC_END 0X0A //!< Used with GATTC_CMP_EVT, GATT peer device characteristic describtion discovery is ended
/** @} End GATT_OPERATION_NAME_DEFINES */
struct gatt_msg {
enum gatt_msg_evt msg_evt; //!< The event that message come with
uint8_t conn_idx; //!< Connection index
uint8_t svc_id; //!< service id of this message
uint16_t att_idx; //!< Attribute index of in the service table or client uuid table
uint16_t handle; //!< Attribute handle number in peer service
union {
struct {
uint8_t operation; //!< GATT request type, see @GATT_OPERATION_NAME_DEFINES
uint8_t status; //!< Status of the request
uint16_t arg_len; //!< Parameter length
void * arg; //!< Parameter pointer
} gatt_op_cmp; //!< Value of GATTC_MSG_CMP_EVT
struct {
uint16_t msg_len; //!< GATT message length
uint16_t offset; //!< GATT message data offset
uint8_t *p_msg_data;//!< GATT message data pointer
} gatt_data;
} param;
};
typedef uint16_t (*gatt_msg_handler_t)(struct gatt_msg *p_msg);
typedef struct gatt_uuid {
uint8_t size; //!< Length of UUID (2 or 16 bytes UUIDs: UUID_SIZE_2 or UUID_SIZE_16).
uint8_t p_uuid[16]; //!< Pointer to uuid, could be 2 or 16 bytes array.
}gatt_uuid_t;
typedef struct gatt_attribute {
struct gatt_uuid uuid; //!< Attribute UUID
uint16_t prop; //!< Attribute properties, see @GATT_PROP_BITMAPS_DEFINES
uint16_t max_size; //!< Attribute data maximum size
uint8_t *p_data; //!< Attribute data pointer
}gatt_attribute_t;
typedef struct gatt_service {
const struct gatt_attribute *p_att_tb; //!< Service's attributes table to add to system attribute database.
uint8_t att_nb; //!< Service's attributes number.
gatt_msg_handler_t gatt_msg_handler; //!< Read request callback function.
}gatt_service_t;
typedef struct gatt_client {
const struct gatt_uuid *p_att_tb; //!< Characteristics UUID.
uint8_t att_nb; //!< Characteristic number.
uint8_t att_tb_initialized; //!<
gatt_msg_handler_t gatt_msg_handler; //!< Read request callback function.
}gatt_client_t;
typedef struct gatt_multi_att {
uint8_t length; //The length of each attribute to read, cannot to be 0. The total length should be less than (MTU - 1).
uint16_t handle; //Peer attribute handle
}gatt_multi_att_t;
typedef struct gatt_client_write_param {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint8_t att_idx; //!< Attribute index in client uuid table registed when calling gatt_add_client.
uint8_t *p_data; //!< Data pointer to be written
uint16_t data_len; //!< Data length to be written
}gatt_client_write_param_t;
typedef struct gatt_client_write_param_handle {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint16_t handle; //!< peer device characteristic handle
uint8_t *p_data; //!< Data pointer to be written
uint16_t data_len; //!< Data length to be written
}gatt_client_write_param_handle_t;
typedef struct gatt_client_read_param {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint8_t att_idx; //!< Attribute index in client uuid table registed when calling gatt_add_client.
}gatt_client_read_param_t;
typedef struct gatt_client_read_param_handle {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint16_t handle; //!< peer device attribute handle
uint16_t offset; //!< Value offset
}gatt_client_read_param_handle_t;
typedef struct gatt_client_read_param_uuid {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint16_t start_hdl; //!< Start handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
uint16_t end_hdl; //!< End handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
struct gatt_uuid uuid; //!< Attribute UUID
}gatt_client_read_param_uuid_t;
typedef struct gatt_client_read_multiple_param {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint8_t att_nb; //!< Number of attribute to read
gatt_multi_att_t *p_atts; //!< param of multiple read request
}gatt_client_read_multiple_param_t;
typedef struct gatt_client_enable_event {
uint8_t conidx; //!< Connection index
uint8_t client_id; //!< Client index, this is return value after calling gatt_add_client.
uint8_t att_idx; //!< Attribute index in client uuid table registed when calling gatt_add_client.
}gatt_client_enable_event_t;
typedef struct gatt_send_event {
uint8_t conidx; //!< Connection index
uint8_t svc_id; //!< Server index, this is return value after calling gatt_add_server.
uint8_t att_idx; //!< Attribute index in service attribute table registed when calling gatt_add_service.
uint8_t *p_data; //!< Data to be sent as notification.
uint16_t data_len; //!< Data length
}gatt_send_event_t;
typedef struct gatt_send_event_handle {
uint8_t conidx; //!< Connection index
uint8_t svc_id; //!< Server index, this is return value after calling gatt_add_server.
uint16_t handle; //!< Attribute handle
uint8_t *p_data; //!< Data to be sent as notification.
uint16_t data_len; //!< Data length
}gatt_send_event_handle_t;
typedef struct gatt_svc_report {
uint16_t start_hdl; //!< Discovery service start handle
uint16_t end_hdl; //!< Discovery service end handle
struct gatt_uuid uuid; //!< Service UUID
}gatt_svc_report_t;
typedef struct gatt_char_report {
uint16_t char_hdl; //!< characteristic declaration handle
uint16_t val_hdl; //!< characteristic value handle
uint8_t prop; //!< characteristic properties, see ref@GATT_PROP_BITMAPS_DEFINES bit0 - bit7
struct gatt_uuid uuid; //!< characteristic uuid
}gatt_char_report_t;
typedef struct gatt_desc_report {
uint16_t desc_hdl; //!< describtion handle
struct gatt_uuid uuid; //!< describtion uuid
}gatt_desc_report_t;
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/*
* @fn gatt_add_service
*
* @brief Addding a services & characteristics into gatt database.
*
* @param[in] p_service : service data to be added.
*
* @return Assigned svc_id.
*/
uint8_t gatt_add_service(struct gatt_service *p_service);
/*
* @fn gatt_delete_user_service
*
* @brief Delete a user-defined services into gatt database.
*
* @param[in] service_id : service id, this is return value after calling gatt_add_service.
*
* @return @ref ble_api_err_t
*/
ble_api_err_t gatt_delete_user_service(uint8_t service_id);
/*
* @fn gatt_delete_gap_gatt_svc
*
* @brief Delete gap and gatt services into gatt database, should be called before adding user service. Can only be called once.
*
* @param[in] None.
*
* @return @ref ble_api_err_t
*/
ble_api_err_t gatt_delete_gap_gatt_svc(void);
/*
* @fn gatt_get_local_svc_hdl
*
* @brief Get the start and end handles of the specified service.
*
* @param[in] service_id : service id, this is return value after calling gatt_add_service.
* @param[in] start_hdl : Pointer to the value of the specified service start handle.
* @param[in] end_hdl : Pointer to the value of the specified service end handle.
*
* @return @ref ble_api_err_t
*/
ble_api_err_t gatt_get_local_svc_hdl(uint8_t service_id, uint16_t *start_hdl, uint16_t *end_hdl);
/*********************************************************************
* @fn gatt_add_client
*
* @brief Addding a GATT client in the system.
*
* @param[in] p_client : client information.
*
* @return Assigned client_id.
*
* @par Sample
* @code
* example1 :
* const struct gatt_uuid client_att_tb[] =
* {
* [0] =
* { UUID_SIZE_16, SPSC_UUID128_ARR_TX},
* [1] =
* { UUID_SIZE_16, SPSC_UUID128_ARR_RX},
* };
* func()
* {
* struct gatt_client client;
* client.p_att_tb = client_att_tb;
* client.att_nb = 2;
* client.gatt_msg_handler = client_msg_handler;
* }
* example2 : //in this case, there will no be uuids being registed.
* func()
* {
* struct gatt_client client;
* client.p_att_tb = NULL;
* client.att_nb = 0;
* client.gatt_msg_handler = client_msg_handler;
* }
* @endcode
*/
uint8_t gatt_add_client(struct gatt_client *p_client);
/*
* @fn gatt_discovery_all_peer_svc
*
* @brief Discover all peer device services.
*
* @param[in] client_id : client index, this is return value after calling gatt_add_client.
* @param[in] conidx : connection index
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_discovery_all_peer_svc(uint8_t client_id, uint8_t conidx);
/*
* @fn gatt_discovery_peer_svc
*
* @brief Discover assigned peer device service.
*
* @param[in] client_id : client index, this is return value after calling gatt_add_client.
* @param[in] conidx : connection index
* @param[in] uuid : assigned service
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_discovery_peer_svc(uint8_t client_id, uint8_t conidx, struct gatt_uuid *uuid);
/*
* @fn gatt_discovery_peer_char
*
* @brief Discover peer device characteristic when only the peer specified service handle range is known.
*
* @param[in] client_id : client index, this is return value after calling gatt_add_client.
* @param[in] conidx : connection index
* @param[in] start_hdl : start handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
* @param[in] end_hdl : end handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_discovery_peer_char(uint8_t client_id, uint8_t conidx, uint16_t start_hdl, uint16_t end_hdl);
/*
* @fn gatt_discovery_peer_char_by_uuid
*
* @brief Discover peer device characteristic by UUID when only the service handle range is known and the peer specified characteristic UUID is known.
*
* @param[in] client_id : client index, this is return value after calling gatt_add_client.
* @param[in] conidx : connection index
* @param[in] start_hdl : start handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
* @param[in] end_hdl : end handle of the peer specified service, shall be set in the range of 0x0001 - 0xffff
* @param[in] uuid : uuid of the specified characteristic
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_discovery_peer_char_by_uuid(uint8_t client_id, uint8_t conidx, uint16_t start_hdl, uint16_t end_hdl, struct gatt_uuid *uuid);
/*
* @fn gatt_discovery_peer_desc
*
* @brief Discover peer device describtion when only the peer specified characteristic handle range is known.
*
* @param[in] client_id : client index, this is return value after calling gatt_add_client.
* @param[in] conidx : connection index
* @param[in] start_hdl : start handle of the peer specified characteristic value handle + 1, shall be set in the range of 0x0001 - 0xffff
* @param[in] end_hdl : end handle of the specified characteristic, shall be set in the range of 0x0001 - 0xffff
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_discovery_peer_desc(uint8_t client_id, uint8_t conidx, uint16_t start_hdl, uint16_t end_hdl);
/*
* @fn gatt_client_write_req
*
* @brief request write operation with ATT_WRITE_REQUEST
*
* @param[in] write_att : write operation parameter.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_write_req(struct gatt_client_write_param *write_att);
/*
* @fn gatt_client_write_cmd
*
* @brief request write operation with ATT_WRITE_COMMAND
*
* @param[in] write_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_write_cmd(struct gatt_client_write_param *write_att);
/*
* @fn gatt_cilent_write_req_with_handle
*
* @brief request write operation with ATT_WRITE_REQUEST by handle
*
* @param[in] write_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_cilent_write_req_with_handle(struct gatt_client_write_param_handle *write_att);
/*
* @fn gatt_cilent_write_cmd_with_handle
*
* @brief request write operation with ATT_WRITE_COMMAND by handle
*
* @param[in] write_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_cilent_write_cmd_with_handle(struct gatt_client_write_param_handle *write_att);
/*
* @fn gatt_client_read
*
* @brief Read request.
*
* @param[in] read_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_read(struct gatt_client_read_param *read_att);
/*
* @fn gatt_client_read_with_handle
*
* @brief Read request by handle.
*
* @param[in] read_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_read_with_handle(struct gatt_client_read_param_handle *read_att);
/*
* @fn gatt_client_read_with_uuid
*
* @brief Read request by uuid.
*
* @param[in] read_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_read_with_uuid(struct gatt_client_read_param_uuid *read_att);
/*
* @fn gatt_client_read_multiple_with_handle
*
* @brief Read multiple request by handle. Only attribute values that have a known fixed size can be read.
*
* @param[in] read_att : client information.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_read_multiple_with_handle(struct gatt_client_read_multiple_param *read_att);
/*
* @fn gatt_client_enable_ntf_ind
*
* @brief enable notification or indication.
*
* @param[in] event_enable : client information.
* type : event type.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_client_enable_ntf_ind(struct gatt_client_enable_event *event_enable, enum gatt_event_type type);
/*
* @fn gatt_notification
*
* @brief Sending notification.
*
* @param[in] ntf_att : in which service and which attribute the notification will be sent
* This parameter contains servcie ID and attribute ID
* to indicate exact which attribute will be used to send notification.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_notification(struct gatt_send_event *ntf_att);
/*
* @fn gatt_notification_with_handle
*
* @brief Sending notification.
*
* @param[in] ntf_att : in which service and which attribute the notification will be sent
* This parameter contains servcie ID and attribute handle
* to indicate exact which attribute will be used to send notification.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_notification_with_handle(struct gatt_send_event_handle *ntf_att);
/*********************************************************************
* @fn gatt_indication
*
* @brief Sending indication.
*
* @param[in] ind_att : in which service and which attribute the indication will be sent
* This parameter contains servcie ID and attribute ID
* to indicate exact which attribute will be used to send indication.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_indication(struct gatt_send_event *ind_att);
/*********************************************************************
* @fn gatt_indication_with_handle
*
* @brief Sending indication.
*
* @param[in] ind_att : in which service and which attribute the indication will be sent
* This parameter contains servcie ID and attribute handle
* to indicate exact which attribute will be used to send indication.
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_indication_with_handle(struct gatt_send_event_handle *ind_att);
/*
* @fn gatt_mtu_exchange_req
*
* @brief Exchange MTU with peer device.
*
* @param[in] user_id : client index or service index, this is return value after calling gatt_add_client() or gatt_add_service().
* @param[in] conidx : connection index
* @param[in] mtu :
*
* @return @ref ble_api_err_t.
*/
ble_api_err_t gatt_mtu_exchange_req(uint8_t user_id, uint8_t conidx, uint16_t mtu);
#endif // _GATT_API_H

View File

@ -0,0 +1,45 @@
#ifndef _GATT_DEFINES_H
#define _GATT_DEFINES_H
/// Length of an handle
#define GATT_HANDLE_LEN (2)
/// Length of 16-bit UUID in octets
#define GATT_UUID_16_LEN (2)
/// Length of 32-bit UUID in octets
#define GATT_UUID_32_LEN (4)
/// Length of 128-bit UUID in octets
#define GATT_UUID_128_LEN (16)
/// Length of Database Hash in octets
#define GATT_DB_HASH_LEN (16)
/// GATT UUID Type
enum gatt_uuid_type
{
/// 16-bit UUID value
GATT_UUID_16 = 0x00,
/// 32-bit UUID value
GATT_UUID_32 = 0x01,
/// 128-bit UUID value
GATT_UUID_128 = 0x02,
/// Invalid UUID Type
GATT_UUID_INVALID = 0x03,
};
/// GATT attribute security level
enum gatt_sec_lvl
{
/// Attribute value is accessible on an unencrypted link.
GATT_SEC_NOT_ENC = 0x00,
/// Attribute value is accessible on an encrypted link or modified with using write signed procedure
/// on unencrypted link if bonded using an unauthenticated pairing.
GATT_SEC_NO_AUTH = 0x01,
/// Attribute value is accessible on an encrypted link or modified with using write signed procedure
/// on unencrypted link if bonded using an authenticated pairing.
GATT_SEC_AUTH = 0x02,
/// Attribute value is accessible on an encrypted link or modified with using write signed procedure
/// on unencrypted link if bonded using a secure connection pairing.
GATT_SEC_SECURE_CON = 0x03,
};
#endif // _GATT_DEFINES_H

View File

@ -0,0 +1,300 @@
/**
* Copyright (c) 2019, Freqchip
*
* All rights reserved.
*
*
*/
#ifndef GATT_SIG_UUID_H
#define GATT_SIG_UUID_H
/*********************************************************************
* INCLUDES
*/
#include <stdio.h>
#include <stdint.h>
/*********************************************************************
* CONSTANTS
*/
// SIG UUID size is always 2.
#define ATT_BT_UUID_SIZE 2
/*
* WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published
* in the Bluetooth Assigned Numbers page. Do not change these values.
* Changing them will cause Bluetooth interoperability issues.
*/
/**
* GATT Services
*/
#define GAP_SERVICE_UUID 0x1800 // Generic Access Profile
#define GATT_SERVICE_UUID 0x1801 // Generic Attribute Profile
/**
* GATT Declarations
*/
#define GATT_PRIMARY_SERVICE_UUID 0x2800 // Primary Service
#define GATT_SECONDARY_SERVICE_UUID 0x2801 // Secondary Service
#define GATT_INCLUDE_UUID 0x2802 // Include
#define GATT_CHARACTER_UUID 0x2803 // Characteristic
/**
* GATT Descriptors
*/
#define GATT_CHAR_EXT_PROPS_UUID 0x2900 // Characteristic Extended Properties
#define GATT_CHAR_USER_DESC_UUID 0x2901 // Characteristic User Description
#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 // Client Characteristic Configuration
#define GATT_SERV_CHAR_CFG_UUID 0x2903 // Server Characteristic Configuration
#define GATT_CHAR_FORMAT_UUID 0x2904 // Characteristic Presentation Format
#define GATT_CHAR_AGG_FORMAT_UUID 0x2905 // Characteristic Aggregate Format
#define GATT_VALID_RANGE_UUID 0x2906 // Valid Range
#define GATT_EXT_REPORT_REF_UUID 0x2907 // External Report Reference Descriptor
#define GATT_REPORT_REF_UUID 0x2908 // Report Reference Descriptor
/**
* GATT Characteristics
*/
#define GATT_DEVICE_NAME_UUID 0x2A00 // Device Name
#define GATT_APPEARANCE_UUID 0x2A01 // Appearance
#define GATT_PERI_PRIVACY_FLAG_UUID 0x2A02 // Peripheral Privacy Flag
#define GATT_RECONNECT_ADDR_UUID 0x2A03 // Reconnection Address
#define GATT_PERI_CONN_PARAM_UUID 0x2A04 // Peripheral Preferred Connection Parameters
#define GATT_SERVICE_CHANGED_UUID 0x2A05 // Service Changed
#define GATT_ADDR_RESOL_SUPP 0x2AA6 // Central Address Resolution supported
#define GATT_RSLV_PRIV_ADDR_ONLY 0x2AC9 // Resolvable Private Address only
/*
* WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published
* in the Bluetooth Assigned Numbers page. Do not change these values.
* Changing them will cause Bluetooth interoperability issues.
*/
/**
* GATT Service UUIDs
*/
#define IMMEDIATE_ALERT_SERV_UUID 0x1802 // Immediate Alert
#define LINK_LOSS_SERV_UUID 0x1803 // Link Loss
#define TX_PWR_LEVEL_SERV_UUID 0x1804 // Tx Power
#define CURRENT_TIME_SERV_UUID 0x1805 // Current Time Service
#define REF_TIME_UPDATE_SERV_UUID 0x1806 // Reference Time Update Service
#define NEXT_DST_CHANGE_SERV_UUID 0x1807 // Next DST Change Service
#define GLUCOSE_SERV_UUID 0x1808 // Glucose
#define THERMOMETER_SERV_UUID 0x1809 // Health Thermometer
#define DEVINFO_SERV_UUID 0x180A // Device Information
#define NWA_SERV_UUID 0x180B // Network Availability
#define HEARTRATE_SERV_UUID 0x180D // Heart Rate
#define PHONE_ALERT_STS_SERV_UUID 0x180E // Phone Alert Status Service
#define BATT_SERV_UUID 0x180F // Battery Service
#define BLOODPRESSURE_SERV_UUID 0x1810 // Blood Pressure
#define ALERT_NOTIF_SERV_UUID 0x1811 // Alert Notification Service
#define HID_SERV_UUID 0x1812 // Human Interface Device
#define SCAN_PARAM_SERV_UUID 0x1813 // Scan Parameters
#define RSC_SERV_UUID 0x1814 // Running Speed and Cadence
#define CSC_SERV_UUID 0x1816 // Cycling Speed and Cadence
#define CYCPWR_SERV_UUID 0x1818 // Cycling Power
#define LOC_NAV_SERV_UUID 0x1819 // Location and Navigation
#define IPSS_SERV_UUID 0x1820 // Internet Protocol Support
#define FITMACHINE_SERV_UUID 0x1826 // Fitmachine
/**
* GATT Characteristic UUIDs
*/
#define ALERT_LEVEL_UUID 0x2A06 // Alert Level
#define TX_PWR_LEVEL_UUID 0x2A07 // Tx Power Level
#define DATE_TIME_UUID 0x2A08 // Date Time
#define DAY_OF_WEEK_UUID 0x2A09 // Day of Week
#define DAY_DATE_TIME_UUID 0x2A0A // Day Date Time
#define EXACT_TIME_256_UUID 0x2A0C // Exact Time 256
#define DST_OFFSET_UUID 0x2A0D // DST Offset
#define TIME_ZONE_UUID 0x2A0E // Time Zone
#define LOCAL_TIME_INFO_UUID 0x2A0F // Local Time Information
#define TIME_WITH_DST_UUID 0x2A11 // Time with DST
#define TIME_ACCURACY_UUID 0x2A12 // Time Accuracy
#define TIME_SOURCE_UUID 0x2A13 // Time Source
#define REF_TIME_INFO_UUID 0x2A14 // Reference Time Information
#define TIME_UPDATE_CTRL_PT_UUID 0x2A16 // Time Update Control Point
#define TIME_UPDATE_STATE_UUID 0x2A17 // Time Update State
#define GLUCOSE_MEAS_UUID 0x2A18 // Glucose Measurement
#define BATT_LEVEL_UUID 0x2A19 // Battery Level
#define TEMP_MEAS_UUID 0x2A1C // Temperature Measurement
#define TEMP_TYPE_UUID 0x2A1D // Temperature Type
#define IMEDIATE_TEMP_UUID 0x2A1E // Intermediate Temperature
#define MEAS_INTERVAL_UUID 0x2A21 // Measurement Interval
#define BOOT_KEY_INPUT_UUID 0x2A22 // Boot Keyboard Input Report
#define SYSTEM_ID_UUID 0x2A23 // System ID
#define MODEL_NUMBER_UUID 0x2A24 // Model Number String
#define SERIAL_NUMBER_UUID 0x2A25 // Serial Number String
#define FIRMWARE_REV_UUID 0x2A26 // Firmware Revision String
#define HARDWARE_REV_UUID 0x2A27 // Hardware Revision String
#define SOFTWARE_REV_UUID 0x2A28 // Software Revision String
#define MANUFACTURER_NAME_UUID 0x2A29 // Manufacturer Name String
#define IEEE_11073_CERT_DATA_UUID 0x2A2A // IEEE 11073-20601 Regulatory Certification Data List
#define CURRENT_TIME_UUID 0x2A2B // Current Time
#define SCAN_REFRESH_UUID 0x2A31 // Scan Refresh
#define BOOT_KEY_OUTPUT_UUID 0x2A32 // Boot Keyboard Output Report
#define BOOT_MOUSE_INPUT_UUID 0x2A33 // Boot Mouse Input Report
#define GLUCOSE_CONTEXT_UUID 0x2A34 // Glucose Measurement Context
#define BLOODPRESSURE_MEAS_UUID 0x2A35 // Blood Pressure Measurement
#define IMEDIATE_CUFF_PRESSURE_UUID 0x2A36 // Intermediate Cuff Pressure
#define HEARTRATE_MEAS_UUID 0x2A37 // Heart Rate Measurement
#define BODY_SENSOR_LOC_UUID 0x2A38 // Body Sensor Location
#define HEARTRATE_CTRL_PT_UUID 0x2A39 // Heart Rate Control Point
#define NETWORK_AVAIL_UUID 0x2A3E // Network Availability
#define ALERT_STATUS_UUID 0x2A3F // Alert Status
#define RINGER_CTRL_PT_UUID 0x2A40 // Ringer Control Point
#define RINGER_SETTING_UUID 0x2A41 // Ringer Setting
#define ALERT_CAT_ID_BMASK_UUID 0x2A42 // Alert Category ID Bit Mask
#define ALERT_CAT_ID_UUID 0x2A43 // Alert Category ID
#define ALERT_NOTIF_CTRL_PT_UUID 0x2A44 // Alert Notification Control Point
#define UNREAD_ALERT_STATUS_UUID 0x2A45 // Unread Alert Status
#define NEW_ALERT_UUID 0x2A46 // New Alert
#define SUP_NEW_ALERT_CAT_UUID 0x2A47 // Supported New Alert Category
#define SUP_UNREAD_ALERT_CAT_UUID 0x2A48 // Supported Unread Alert Category
#define BLOODPRESSURE_FEATURE_UUID 0x2A49 // Blood Pressure Feature
#define HID_INFORMATION_UUID 0x2A4A // HID Information
#define REPORT_MAP_UUID 0x2A4B // Report Map
#define HID_CTRL_PT_UUID 0x2A4C // HID Control Point
#define REPORT_UUID 0x2A4D // Report
#define PROTOCOL_MODE_UUID 0x2A4E // Protocol Mode
#define SCAN_INTERVAL_WINDOW_UUID 0x2A4F // Scan Interval Window
#define PNP_ID_UUID 0x2A50 // PnP ID
#define GLUCOSE_FEATURE_UUID 0x2A51 // Glucose Feature
#define RECORD_CTRL_PT_UUID 0x2A52 // Record Access Control Point
#define RSC_MEAS_UUID 0x2A53 // RSC Measurement
#define RSC_FEATURE_UUID 0x2A54 // RSC Feature
#define SC_CTRL_PT_UUID 0x2A55 // SC Control Point
#define CSC_MEAS_UUID 0x2A5B // CSC Measurement
#define CSC_FEATURE_UUID 0x2A5C // CSC Feature
#define SENSOR_LOC_UUID 0x2A5D // Sensor Location
#define CYCPWR_MEAS_UUID 0x2A63 // Cycling Power Measurement
#define CYCPWR_VECTOR_UUID 0x2A64 // Cycling Power Vector
#define CYCPWR_FEATURE_UUID 0x2A65 // Cycling Power Feature
#define CYCPWR_CTRL_PT_UUID 0x2A66 // Cycling Power Control Point
#define LOC_SPEED_UUID 0x2A67 // Location and Speed
#define NAV_UUID 0x2A68 // Navigation
#define POS_QUALITY_UUID 0x2A69 // Position Quality
#define LN_FEATURE_UUID 0x2A6A // LN Feature
#define LN_CTRL_PT_UUID 0x2A6B // LN Control Point
#define GATT_UUID_FITNESS_MACHINE_FEATURE 0x2ACC
#define GATT_UUID_TREADMILL_DATA 0x2ACD //<2F>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GATT_UUID_CROSS_TRAINER_DATA 0x2ACE //<2F><>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GATT_UUID_ROWER_DATA 0x2AD1 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GATT_UUID_INDOOR_BIKE_DATA 0x2AD2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GATT_UUID_STEP_CLIMBER_DATA 0x2ACF //<2F><><EFBFBD>һ<EFBFBD>
#define GATT_UUID_STAIR_CLIMBER_DATA 0x2AD0 //<2F><>¥<EFBFBD>ݻ<EFBFBD>
#define GATT_UUID_TRAINING_STATUS 0x2AD3
#define GATT_UUID_SUPPORT_SPEED_RANGE 0x2AD4
#define GATT_UUID_SUPPORT_INCLINATION_RANGE 0x2AD5
#define GATT_UUID_SUPPORT_RESISTANCE_LEVEL_RANGE 0x2AD6
#define GATT_UUID_SUPPORT_HEART_RATE_RANGE 0x2AD7
#define GATT_UUID_SUPPORT_POWER_RANGE 0x2AD8
#define GATT_UUID_FITNESS_MACHINE_CONTROL_POINT 0x2AD9
#define GATT_UUID_FITNESS_MACHINE_STATUS 0x2ADA
/**
* GATT Unit UUIDs
*/
#define GATT_UNITLESS_UUID 0x2700 // <Symbol>, <Expressed in terms of SI base units>
#define GATT_UNIT_LENGTH_METER_UUID 0x2701 // m, m
#define GATT_UNIT_MASS_KGRAM_UUID 0x2702 // kg, kg
#define GATT_UNIT_TIME_SECOND_UUID 0x2703 // s, s
#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID 0x2704 // A, A
#define GATT_UNIT_THERMODYN_TEMP_K_UUID 0x2705 // K, K
#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID 0x2706 // mol, mol
#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID 0x2707 // cd, cd
#define GATT_UNIT_AREA_SQ_MTR_UUID 0x2710 // m^2, m^2
#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID 0x2711 // m^3, m^3
#define GATT_UNIT_VELOCITY_MPS_UUID 0x2712 // m/s, m s^-1
#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID 0x2713 // m/s^2, m s^-2
#define GATT_UNIT_WAVENUMBER_RM_UUID 0x2714 // ? m^-1
#define GATT_UNIT_DENSITY_KGPCM_UUID 0x2715 // p, kg m^-3
#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID 0x2716 // pA, kg m^-2
#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID 0x2717 // v, m^3 kg^-1
#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID 0x2718 // j, A m^-2
#define GATT_UNIT_MAG_FIELD_STRENGTH_UUID 0x2719 // H, A m
#define GATT_UNIT_AMOUNT_CONC_MPCM_UUID 0x271A // c, mol m^-3
#define GATT_UNIT_MASS_CONC_KGPCM_UUID 0x271B // c, kg m^-3
#define GATT_UNIT_LUMINANCE_CPSM_UUID 0x271C // Lv, cd m^-2
#define GATT_UNIT_REFRACTIVE_INDEX_UUID 0x271D // n, 1
#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID 0x271E // u, 1
#define GATT_UNIT_PLANE_ANGLE_RAD_UUID 0x2720 // rad, m m-1
#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID 0x2721 // sr, m2 m-2
#define GATT_UNIT_FREQUENCY_HTZ_UUID 0x2722 // Hz, s-1
#define GATT_UNIT_FORCE_NEWTON_UUID 0x2723 // N, m kg s-2
#define GATT_UNIT_PRESSURE_PASCAL_UUID 0x2724 // Pa, N/m2 = m2 kg s-2
#define GATT_UNIT_ENERGY_JOULE_UUID 0x2725 // J, N m = m2 kg s-2
#define GATT_UNIT_POWER_WATT_UUID 0x2726 // W, J/s = m2 kg s-3
#define GATT_UNIT_E_CHARGE_C_UUID 0x2727 // C, sA
#define GATT_UNIT_E_POTENTIAL_DIF_V_UUID 0x2728 // V, W/A = m2 kg s-3 A-1
#define GATT_UNIT_CELSIUS_TEMP_DC_UUID 0x272F // oC, t/oC = T/K - 273.15
#define GATT_UNIT_TIME_MINUTE_UUID 0x2760 // min, 60 s
#define GATT_UNIT_TIME_HOUR_UUID 0x2761 // h, 3600 s
#define GATT_UNIT_TIME_DAY_UUID 0x2762 // d, 86400 s
#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID 0x2763 // o, (pi/180) rad
#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID 0x2764 // ', (pi/10800) rad
#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID 0x2765 // '', (pi/648000) rad
#define GATT_UNIT_AREA_HECTARE_UUID 0x2766 // ha, 10^4 m^2
#define GATT_UNIT_VOLUME_LITRE_UUID 0x2767 // l, 10^-3 m^3
#define GATT_UNIT_MASS_TONNE_UUID 0x2768 // t, 10^3 kg
#define GATT_UINT_LENGTH_YARD_UUID 0x27A0 // yd, 0.9144 m
#define GATT_UNIT_LENGTH_PARSEC_UUID 0x27A1 // pc, 3.085678 ?1016 m
#define GATT_UNIT_LENGTH_INCH_UUID 0x27A2 // in, 0.0254 m
#define GATT_UNIT_LENGTH_FOOT_UUID 0x27A3 // ft, 0.3048 m
#define GATT_UNIT_LENGTH_MILE_UUID 0x27A4 // mi, 1609.347 m
#define GATT_UNIT_PRESSURE_PFPSI_UUID 0x27A5 // psi, 6.894757 ?103 Pa
#define GATT_UNIT_VELOCITY_KMPH_UUID 0x27A6 // km/h, 0.2777778 m^s-1
#define GATT_UNIT_VELOCITY_MPH_UUID 0x27A7 // mi/h, 0.44704 m^ s-1
#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID 0x27A8 // r/min, 0.1047198 rad s-1
#define GATT_UNIT_ENERGY_GCAL_UUID 0x27A9 //
#define GATT_UNIT_ENERGY_KCAL_UUID 0x27AA // kcal, 4190.02 J
#define GATT_UNIT_ENERGY_KWH_UUID 0x27AB // kWh, 3600000 J
#define GATT_UNIT_THERMODYN_TEMP_DF_UUID 0x27AC // oF, t/oF = T/K ?1.8 - 459.67
#define GATT_UNIT_PERCENTAGE_UUID 0x27AD // %
#define GATT_UNIT_PER_MILE_UUID 0x27AE //
#define GATT_UNIT_PERIOD_BPM_UUID 0x27AF //
#define GATT_UNIT_E_CHARGE_AH_UUID 0x27B0 //
#define GATT_UNIT_MASS_DENSITY_MGPD_UUID 0x27B1 //
#define GATT_UNIT_MASS_DENSITY_MMPL_UUID 0x27B2 //
#define GATT_UNIT_TIME_YEAR_UUID 0x27B3 //
#define GATT_UNIT_TIME_MONTH_UUID 0x27B4 //
/*********************************************************************
* MACROS
*/
#define BUILD_UINT16(loByte, hiByte) \
((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))
#define HI_UINT16(a) (((a) >> 8) & 0xFF)
#define LO_UINT16(a) ((a) & 0xFF)
#define UUID16_ARR(uuid16) {uuid16&0xff,(uuid16&0xff00)>>8}
#define UUID128_ARR(uuid16) {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, \
0x00, 0x10, 0x00, 0x00, (uuid16 & 0xff),(uuid16&0xff00)>>8, 0x00, 0x00}
/*********************************************************************
* TYPEDEFS
*/
/*********************************************************************
* VARIABLES
*/
#endif /* GATT_SIG_UUID_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,159 @@
#ifndef __L2CAP_API_H
#define __L2CAP_API_H
#include <stdint.h>
#define L2CAP_COC_EVT_SPSM_ADDED 0x00 //!< new SPSM is added
#define L2CAP_COC_EVT_SPSM_REMOVED 0x01 //!< an added SPSM is removed
#define L2CAP_COC_EVT_CONNECTED 0x02 //!< Connection Oriented Channel is created.
#define L2CAP_COC_EVT_MTU_CHANGED 0x03 //!< MTU of created channel is changed
#define L2CAP_COC_EVT_DISCONNECTED 0x04 //!< Created channel is disconnected
#define L2CAP_COC_EVT_DATA_SENT 0x05 //!< data is sent to peer device
#define L2CAP_COC_EVT_CONNECT_REQ 0x06 //!< receive connect request from peer device
#define L2CAP_COC_EVT_DATA_RECV 0x07 //!< receive data from peer device
typedef struct _l2cap_coc_evt {
uint8_t event;
uint8_t status;
union {
/// parameter for L2CAP_COC_EVT_CONNECTED event
struct {
uint8_t conidx; //!< BLE connection index
uint8_t chan_lid; //!< channel link ID of created COC, this field will be useld in
//!< reconfig, disconnect, send data, etc. operation
uint16_t local_rx_mtu;
uint16_t peer_rx_mtu;
} connected;
/// parameter for L2CAP_COC_EVT_MTU_CHANGED event
struct {
uint8_t conidx;
uint8_t chan_lid;
uint16_t local_rx_mtu;
uint16_t peer_rx_mtu;
} mtu_changed;
/// parameter for L2CAP_COC_EVT_DISCONNECTED event
struct {
uint8_t conidx;
uint8_t chan_lid;
uint16_t reason;
} disconnected;
/// parameter for L2CAP_COC_EVT_DATA_SENT event
struct {
uint8_t conidx;
uint8_t chan_lid;
} sent;
/// parameter for L2CAP_COC_EVT_CONNECT_REQ event
struct {
uint16_t token; //!< used in l2cap_coc_conn_cfm to response connection request
uint8_t conidx;
uint8_t nb_chan;
uint16_t spsm;
uint16_t peer_rx_mtu;
} conn_req;
/// parameter for L2CAP_COC_EVT_DATA_RECV event
struct {
uint8_t conidx;
uint8_t chan_lid;
uint16_t status; //!< Error is detected if status is not 0.
uint16_t length;
uint8_t *data;
} data_recv;
} p;
} l2cap_coc_evt_t;
typedef void (*l2cap_coc_evt_cb_t)(l2cap_coc_evt_t *evt);
/*
* @fn l2cap_coc_spsm_new
*
* @brief add new SPSM to l2cap.
*
* @param[in] spsm : new SPSM
* @param[in] sec_lvl : reserved, keep this field to 0
*/
void l2cap_coc_spsm_new(uint16_t spsm, uint8_t sec_lvl);
/*
* @fn l2cap_coc_spsm_delete
*
* @brief remove added SPSM from l2cap.
*
* @param[in] spsm : SPSM to be removed
*/
void l2cap_coc_spsm_delete(uint16_t spsm);
/*
* @fn l2cap_coc_connect
*
* @brief remove added SPSM from l2cap.
*
* @param[in] conidx : BLE connection index
* @param[in] nb_ch : How many channel to create.
* @param[in] spsm : which spsm to connect.
* @param[in] rx_mtu : local RX MTU.
*/
void l2cap_coc_connect(uint8_t conidx, uint8_t nb_ch, uint16_t spsm, uint16_t rx_mtu);
/*
* @fn l2cap_coc_reconfig
*
* @brief used to reset local rx mtu.
*
* @param[in] conidx : BLE connection index
* @param[in] rx_mtu_new : new local RX MTU
* @param[in] nb_ch : how many channel to change MTU
* @param[in] chan_lids : link id of channels to change MTU
*/
void l2cap_coc_reconfig(uint8_t conidx, uint16_t rx_mtu_new, uint8_t nb_ch, uint8_t *chan_lids);
/*
* @fn l2cap_coc_disconnect
*
* @brief disconnect created channel.
*
* @param[in] conidx : BLE connection index
* @param[in] chan_lid : link id of channel to disconnect
*/
void l2cap_coc_disconnect(uint8_t conidx, uint8_t chan_lid);
/*
* @fn l2cap_coc_send_data
*
* @brief used to send data to peer device.
*
* @param[in] conidx : BLE connection index
* @param[in] chan_lid : link id of channel to send data
* @param[in] len : how many data to send, should not be more than peer_rx_mtu
* @param[in] data : storage pointer of sending data
*/
void l2cap_coc_send_data(uint8_t conidx, uint8_t chan_lid, uint16_t len, uint8_t *data);
/*
* @fn l2cap_coc_conn_cfm
*
* @brief used to confirm connect request from peer device.
*
* @param[in] token : used to identify connect request by internal implementation of l2cap, this filed should be
* same with "token" field in L2CAP_COC_EVT_CONNECT_REQ event.
* @param[in] conidx : BLE connection index
* @param[in] nb_chan : how many channels to create
* @param[in] local_rx_mtu : local RX MTU
*/
void l2cap_coc_conn_cfm(uint16_t token, uint8_t conidx, uint8_t nb_chan, uint16_t local_rx_mtu);
/*
* @fn l2cap_coc_init
*
* @brief used to set callback function used for dealing l2cap COC events.
*
* @param[in] cb : ballback function to handle events
*/
void l2cap_coc_init(l2cap_coc_evt_cb_t cb);
#endif // __L2CAP_API_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,298 @@
#ifndef __OVERIDE_H
#define __OVERIDE_H
/***************************************************************************
*
* File:
* $Id: overide.h 582 2009-01-20 23:07:22Z gladed $
* $Product: iAnywhere HID SDK v1.x $
* $Revision: 582 $
*
* Description:
* This file contains declarations that are used to override
* the configure options set in config files such as
* btconfig.h. If no overrides are needed then this file
* should be empty. It still must exist.
*
* Created:
* July 15, 1999
*
* Copyright 1999-2004 Extended Systems, Inc. ALL RIGHTS RESERVED.
*
* Unpublished Confidential Information of Extended Systems, Inc.
* Do Not Disclose.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of Extended Systems, Inc.
*
* Use of this work is governed by a license granted by Extended Systems,
* Inc. This work contains confidential and proprietary information of
* Extended Systems, Inc. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
/* WARNING: The values in this overide.h file were selected specifically for
* this sample application. If you change them, the sample application may fail
* to compile or not work properly.
*/
#define BT_STACK XA_ENABLED
#define TCP_STACK XA_DISABLED
#define IRDA_STACK XA_DISABLED
#define XA_DEBUG XA_DISABLED
#define HCI_REMOVE_STATIC_BUFFER
#define L2CAP_REMOVE_STATIC_BUFFER
#define RFCOMM_REMOVE_STATIC_BUFFER
#define SDP_REMOVE_STATIC_BUFFER
#define AVRCP_REMOVE_STATIC_BUFFER
#define RADIO_INIT_SIMPLIFY
#define EVM_REPLACE_TIMER
#define RFCOMM_TIMER_OPT XA_ENABLED
/* set default access to non-discover and non-connecte, leave configuration based on pskeys to decide which state will be */
//#define BT_DEFAULT_ACCESS_MODE_NC BAM_GENERAL_ACCESSIBLE
#define BT_DEFAULT_ACCESS_MODE_NC BAM_NOT_SET
#define BT_ALLOW_SCAN_WHILE_CON XA_ENABLED
#define BT_DEFAULT_PAGE_SCAN_WINDOW 0x20
#define BT_DEFAULT_PAGE_SCAN_INTERVAL 0x400
#define BT_DEFAULT_INQ_SCAN_WINDOW 0x20
#define BT_DEFAULT_INQ_SCAN_INTERVAL 0x400
//enable multilink
//#define BT_DEFAULT_ACCESS_MODE_C BAM_GENERAL_ACCESSIBLE
/*
* Set number of devices.
*/
#define NUM_BT_DEVICES 1
#define NUM_KNOWN_DEVICES 8
#define NUM_SCO_CONNS NUM_BT_DEVICES
#define HCI_ALLOW_PRESCAN XA_DISABLED
#define HCI_NUM_EVENTS 8
#define BT_SCO_HCI_DATA XA_ENABLED
/* L2CAP definitions */
#define L2CAP_NUM_PROTOCOLS 10
#define L2CAP_PING_SUPPORT XA_DISABLED
#define BT_PACKET_HEADER_LEN 28 /* Required for MP3 */
#define L2CAP_NUM_CHANNELS 16
//#define L2CAP_NUM_ENHANCED_CHANNELS (NUM_BT_DEVICES*2) // avdtp_stream and avrcp_browsing
#define L2CAP_MTU 1691
//#define L2CAP_MPS 512
#define L2CAP_MANGLER_TESTING XA_DISABLED
#define L2CAP_ENHANCED_IOP_TESTING XA_DISABLED
#define L2CAP_PRELUDE_SIZE 7
#define SDP_SERVER_SEND_SIZE L2CAP_MTU
#define RFCOMM_PROTOCOL XA_ENABLED
#define XA_LOAD_LIST XA_MODULE(AVDTP) XA_MODULE(CMGR) \
XA_MODULE(AVDEV) XA_MODULE(A2DP) \
XA_MODULE(AVRCP) XA_MODULE(HF) \
XA_MODULE(PBAP) XA_MODULE(OBEX) XA_MODULE(GOEP) \
XA_MODULE(HFG)
//#define BT_ALLOW_SCAN_WHILE_CON XA_ENABLED
#define AT_ROLE_TERMINAL XA_ENABLED
#define AT_ROLE_MOBILE XA_ENABLED
#define AT_HEADSET XA_DISABLED
#define AT_HANDSFREE XA_ENABLED
#define AT_PHONEBOOK XA_DISABLED
#define AT_SMS XA_DISABLED
#define AT_DUN XA_DISABLED
#define HF_USE_CALL_MANAGER XA_DISABLED//XA_ENABLED
#define HF_USE_MESSAGING_COMMANDS XA_DISABLED
#define HF_USE_RESP_HOLD XA_DISABLED
#define HF_USE_PHONEBOOK_COMMANDS XA_DISABLED//XA_ENABLED
#define HF_SNIFF_TIMER -1
#define HF_WIDE_BAND_SPEECH XA_ENABLED
#define HCI_NUM_PACKETS 6
/* -------------used to do simplity begin---------------- */
#define HF_USE_IIA XA_DISABLED
#define HF_TX_BUFFER_SIZE 32
#define HF_RECV_BUFFER_SIZE 512
#define HFG_USE_IIA XA_ENABLED
#define HFG_TX_BUFFER_SIZE 256
#define HFG_RECV_BUFFER_SIZE 256
#define HFG_CODEC_NEG XA_DISABLED
/* -------------used to do simplity end----------------- */
// TODO
//#define HF_SDK_FEATURES (HF_FEATURE_CLI_PRESENTATION | \
// HF_FEATURE_VOICE_RECOGNITION | \
// HF_FEATURE_VOLUME_CONTROL)
/* SBC definitions */
#define SBC_ENCODER XA_DISABLED
#define SBC_DECODER XA_DISABLED
/* A2DP definitions */
#define A2DP_SOURCE XA_ENABLED
#define A2DP_SINK XA_ENABLED
/* AVRCP definitions */
#define AVRCP_VERSION_1_3_ONLY XA_DISABLED
#define AVRCP_ADVANCED_TARGET XA_ENABLED
#define AVRCP_ADVANCED_CONTROLLER XA_ENABLED
#define AVRCP_BROWSING_TARGET XA_DISABLED
#define AVRCP_BROWSING_CONTROLLER XA_DISABLED
#define AVRCP_LIST_PLAYERS_ENABLED XA_DISABLED
#ifndef SIMPLIFY_AVRCP
#define AVRCP_ADVANCED_RESPONSE_SIZE 128
#else
#define AVRCP_ADVANCED_RESPONSE_SIZE 32
#endif
/* add by owen. when sniff is enable, accept event for press will not be discard because of timeout */
#define AVRCP_RTX_CMD_TIMEOUT 2000
/* Select the appropriate math operation type */
//#define SBC_MATH_FUNCTIONS SBC_MATH_USE_FIXED_HI_RES
/* #define SBC_MATH_FUNCTIONS SBC_MATH_USE_FIXED_LO_RES */
/* #define SBC_MATH_FUNCTIONS SBC_MATH_USE_FIXED_ASM */
/* #define SBC_MATH_FUNCTIONS SBC_MATH_USE_FLOAT */
#ifdef HID_DEVICE_ENABLE
#define HID_DESCRIPTOR_LEN 0xC6
#define HID_DESCRIPTOR \
0x05, 0x01, \
0x09, 0x06, \
0xa1, 0x01, \
0x85, 0x01, \
0x05, 0x07, \
0x19, 0xe0, \
0x29, 0xe7, \
0x15, 0x00, \
0x25, 0x01, \
0x75, 0x01, \
0x95, 0x08, \
0x81, 0x02, \
0x95, 0x01, \
0x75, 0x08, \
0x81, 0x03, \
0x95, 0x05, \
0x75, 0x01, \
0x05, 0x08, \
0x19, 0x01, \
0x29, 0x05, \
0x91, 0x02, \
0x95, 0x01, \
0x75, 0x03, \
0x91, 0x03, \
0x95, 0x06, \
0x75, 0x08, \
0x15, 0x00, \
0x26, 0xff, 0x00, \
0x05, 0x07, \
0x19, 0x00, \
0x29, 0xff, \
0x81, 0x00, \
0xc0, \
0x05, 0x0c, \
0x09, 0x01, \
0xa1, 0x01, \
0x85, 0x03, \
0x15, 0x00, \
0x25, 0x01, \
0x75, 0x01, \
0x95, 0x1e, \
0x0a, 0x24, 0x02, \
0x0a, 0x25, 0x02, \
0x0a, 0x26, 0x02, \
0x0a, 0x27, 0x02, \
0x0a, 0x21, 0x02, \
0x0a, 0x2a, 0x02, \
0x0a, 0x23, 0x02, \
0x0a, 0x8a, 0x01, \
0x09, 0xe2, \
0x09, 0xea, \
0x09, 0xe9, \
0x09, 0xcd, \
0x09, 0xb7, \
0x09, 0xb6, \
0x09, 0xb5, \
0x0a, 0x83, 0x01, \
0x0a, 0x94, 0x01, \
0x0a, 0x92, 0x01, \
0x0a, 0x09, 0x02, \
0x09, 0xb2, \
0x09, 0xb3, \
0x09, 0xb4, \
0x09, 0x8d, \
0x09, 0x04, \
0x09, 0x30, \
0x0a, 0x07, 0x03, \
0x0a, 0x0a, 0x03, \
0x0a, 0x0b, 0x03, \
0x0a, 0xb1, 0x01, \
0x09, 0xb8, \
0x81, 0x02, \
0x95, 0x01, \
0x75, 0x02, \
0x81, 0x03, \
0xc0, \
0x05, 0x01, \
0x09, 0x80, \
0xa1, 0x01, \
0x85, 0x04, \
0x05, 0x01, \
0x19, 0x81, \
0x29, 0x83, \
0x15, 0x00, \
0x25, 0x01, \
0x95, 0x03, \
0x75, 0x01, \
0x81, 0x06, \
0x95, 0x01, \
0x75, 0x05, \
0x81, 0x01, \
0xc0
#define HID_BATTERY_POWER TRUE
#define HID_REMOTE_WAKE FALSE
#define HID_BOOT_DEVICE FALSE
#endif //#ifdef HID_DEVICE_ENABLE
//#ifdef PBAP_ENABLE
#define OBEX_ROLE_CLIENT XA_ENABLED
#define OBEX_ROLE_SERVER XA_ENABLED
#define OBEX_PACKET_FLOW_CONTROL XA_ENABLED
#define OBEX_HEADER_BUILD XA_ENABLED
#define OBEX_BODYLESS_GET XA_ENABLED
#define OBEX_ALLOW_SERVER_TP_DISCONNECT XA_ENABLED
#define OBEX_DYNAMIC_OBJECT_SUPPORT XA_ENABLED
#define OBEX_SERVER_CONS_SIZE 1
#define OBEX_NUM_TX_PACKETS 2
#define GOEP_DOES_UNICODE_CONVERSIONS XA_ENABLED
#define GOEP_MAX_TYPE_LEN 19
#define PBAP_NUM_SERVERS 0
#define PBAP_NUM_CLIENTS 1
//#endif
#define SPP_SERVER XA_ENABLED
#define SPP_CLIENT XA_ENABLED
#define OEM_STACK XA_DISABLED
#endif /* __OVERIDE_H */

View File

@ -0,0 +1,678 @@
#ifndef _PAN_API
#define _PAN_API
#include "bt_types.h"
#include "me_api.h"
#include "pan_pkt.h"
#define NUM_BNEP_PANUS 1
#define NUM_PAN_ARP_ADDRS 10
#define NUM_BT_PKTS (NUM_BNEP_PANUS * 4)
#define BNEP_ADDR_SIZE BD_ADDR_SIZE
#define BNEP_NUM_TIMERS 3
/*---------------------------------------------------------------------------
* BnepEthernetProtocolType type
*
* Some of the more common Ethernet Protocol types in BNEP packets.
*/
typedef uint16_t BnepEthernetProtocolType;
#define ETHER_TYPE_IPV4 0x0800
#define ETHER_TYPE_ARP 0x0806
#define ETHER_TYPE_IPV6 0x86DD
/*---------------------------------------------------------------------------
* BnepPacketType type
*
* The high order bit of the BNEP packet type is the Extension Flag. The
* one bit Extension Flag indicates if one or more extension headers
* follow the BNEP header before the data payload.
*
*/
typedef uint8_t BnepPacketType;
#define BNEP_GENERAL_ETHERNET 0x00
#define BNEP_CONTROL 0x01
#define BNEP_COMPRESSED_ETHERNET 0x02
#define BNEP_COMPRESSED_ETHERNET_SOURCE_ONLY 0x03
#define BNEP_COMPRESSED_ETHERNET_DEST_ONLY 0x04
/*---------------------------------------------------------------------------
* BnepControlType type
*
*/
typedef uint8_t BnepControlType;
#define BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD 0x00
#define BNEP_SETUP_CONNECTION_REQUEST_MSG 0x01
#define BNEP_SETUP_CONNECTION_RESPONSE_MSG 0x02
#define BNEP_FILTER_NET_TYPE_SET_MSG 0x03
#define BNEP_FILTER_NET_TYPE_RESPONSE_MSG 0x04
#define BNEP_FILTER_MULTI_ADDR_SET_MSG 0x05
#define BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG 0x06
/*---------------------------------------------------------------------------
* PanPacketType type
*
* Indicates the packet type when sending or receiving a data packet.
* All packets include their associated IP header unless otherwise
* indicated.
*/
typedef BnepPacketType PanPacketType;
/* Packet type unknown.
*/
#define PANPKT_UNKNOWN 0x40
/* Packet type is General Ethernet and includes the MAC header. The packet
* must be parsed to determine higher layer protocols. This packet is
* normally forwarded to the remote network.
*/
#define PANPKT_ETHER_PKT 0x41
/* Packet is an ARP request.
*/
#define PANPKT_ARP_REQUEST 0x42
/* Packet is an ARP reply.
*/
#define PANPKT_ARP_REPLY 0x43
/* Packet type is IP.
*/
#define PANPKT_IP 0x44
/* Packet is an ICMP request (Ping echo.)
*/
#define PANPKT_ICMP_REQUEST 0x45
/* Packet is an ICMP reply (Ping echo reply.)
*/
#define PANPKT_ICMP_REPLY 0x46
/* Packet type is TCP.
*/
#define PANPKT_TCP 0x47
/* Packet type is UDP.
*/
#define PANPKT_UDP 0x48
/* Packet is a DHCP request.
*/
#define PANPKT_DHCP_REQUEST 0x49
/* Packet is a DHCP reply.
*/
#define PANPKT_DHCP_REPLY 0x4a
/* Packet is a BNEP network filter (no IP header.)
*/
#define PANPKT_NET_FILTER 0x4b
/* Packet is a BNEP multicast filter (no IP header.)
*/
#define PANPKT_MCAST_FILTER 0x4c
/* End of PanPacketType */
#define ETHER_HDR_SIZE (BNEP_ADDR_SIZE*2 + sizeof(BnepEthernetProtocolType))
#define ETHER_RANGE_SIZE (sizeof(BnepEthernetProtocolType)*2)
#define BNEP_TYPE_SIZE sizeof(BnepPacketType)
#define BNEP_GNRL_HDR_SIZE (BNEP_TYPE_SIZE + ETHER_HDR_SIZE)
#define BNEP_CONTROL_TYPE_SIZE sizeof(BnepControlType)
#define BNEP_CONTROL_HDR_SIZE (BNEP_TYPE_SIZE + BNEP_CONTROL_TYPE_SIZE)
#define PAN_PANU_NUM_ATTRIBUTES 9
#define PAN_GN_NUM_ATTRIBUTES 11
#define PAN_NAP_NUM_ATTRIBUTES 13
#define PAN_NUM_SEARCH_ATTRIBUTES 21
/*---------------------------------------------------------------------------
* BnepFilterResponseMsg type
*
*/
typedef uint16_t BnepFilterResponseMsg;
#define BNEP_FR_OPERATION_SUCCESS 0x0000
#define BNEP_FR_UNSUPPORTED 0x0001
#define BNEP_FR_INVALID_PROTOCOL 0x0002
#define BNEP_FR_FAILED_MAX_FILTERS 0x0003
#define BNEP_FR_FAILED_SECURITY 0x0004
/** Indicates an open request is in progress on a client. Use
* PAN_SetupConnection to complete the connection with a BNEP Setup
* Connection control message. This event precedes the PANEVENT_OPEN
* event on a client.
*/
#define PANEVENT_SETUP_CONNECTION 0x81
/** Indicates an open request on a server. Use PAN_ControlResponse to
* complete the connection with a BNEP Setup Connection response. This
* event will follow a PANEVENT_OPEN event on a server.
*/
#define PANEVENT_SETUP_CONN_REQ 0x82
/** Indicates a BNEP control packet other than SETUP_CONNECTION has been
* received.
*/
#define PANEVENT_CONTROL_IND 0x83
/** Indicates an Open request is in progress on a server or complete on
* a client.
*/
#define PANEVENT_OPEN 0x87
/** Indicates the connection is closed.
*/
#define PANEVENT_CLOSED 0x88
/** Indicates an SDP service query failed on an open.
*/
#define PANEVENT_SDP_FAILED 0x89
/** Indicates a data packet is available. The parms.pkt parameter points
* to the packet. The packet is of type PanPacketType indicated in the
* parms.type parameter. The packet length is indicated in the
* parms.rxPktLen parameter.
*/
#define PANEVENT_DATA_IND 0x8a
/** Indicates the PanPacket used to send data has been released and may
* be freed or reused.
*/
#define PANEVENT_DATA_HANDLED 0x8b
/* End of PanEvent */
#define PANBTPKT_FREE 0
#define PANBTPKT_INUSE 1
#define PANBTPKT_INUSE_INT 2
#define PANBTPKT_INUSE_EXT 3
/* Forward reference to PanCallbackParms defined below */
typedef struct _PanCallbackParms PanCallbackParms;
/*---------------------------------------------------------------------------
* PanCallback type
*
* PAN Events and data are passed to the application through a callback
* function of this type defined by the application.
*/
typedef void (*PanCallback)(PanCallbackParms *parms);
/*---------------------------------------------------------------------------
* BNEP_ADDR structure
*
* Represents a 48-bit Bluetooth or Ethernet device address.
*/
typedef struct _BNEP_ADDR
{
uint8_t addr[BNEP_ADDR_SIZE];
} BNEP_ADDR;
/*---------------------------------------------------------------------------
* BnepPanu structure
*
* Maintains connection information for a PANU channel.
*/
typedef struct _BnepPanu {
BNEP_ADDR bnepAddr; /* BNEP_ADDR of remote device */
uint16_t l2ChannelId; /* L2CAP channel ID for connection */
uint8_t state; /* PANU state */
BtRemoteDevice *remDev; /* Remote device of connection */
EvmTimer timer[BNEP_NUM_TIMERS]; /* Timers for Control commands */
uint32_t controlTimeout; /* Timeout value for Control commands */
} BnepPanu;
/*----------------------------------------------------------------------
* PanService structure
*
* PAN service registration structure used to register a service
* through the PAN_Register function.
*/
typedef struct _PanService {
PanCallback callback;
uint16_t type;
} PanService;
/* End of PanService */
/*----------------------------------------------------------------------
* PanPacket structure
*
* PAN Packet allocation structure.
*/
typedef struct _PanPacket {
uint8_t header[BNEP_GNRL_HDR_SIZE];
uint8_t body[];
} PanPacket;
/* End of PanPacket */
/* ---------------------------------------------------------------------------
* BtPacket container
*/
typedef struct _PanBtPkt
{
uint16_t context;
BtPacket btPkt;
} PanBtPkt;
/*----------------------------------------------------------------------
* PanSetupConnPkt structure
*
* PAN Setup Connection Request allocation structure.
*/
typedef struct _PanSetupConnPkt {
uint8_t header[BNEP_CONTROL_HDR_SIZE];
uint8_t uuidSize;
uint8_t dstUuid[2];
uint8_t srcUuid[2];
} PanSetupConnPkt;
/* End of PanSetupConnPkt */
/*----------------------------------------------------------------------
* PanControlRespPkt structure
*
* PAN Control response message allocation structure.
*/
typedef struct _PanControlRespPkt {
uint8_t header[BNEP_CONTROL_HDR_SIZE];
uint8_t message[2];
} PanControlRespPkt;
/* End of PanControlRespPkt */
/*---------------------------------------------------------------------------
* PanRecvCb type
*
* Describes the PAN Receive data callback function. Used when user decide to
* deal receicved data from remote device directly.
*/
typedef void (* PanRecvCb)(uint8_t *, uint16_t);
/* End of PanRecvCb */
/*--------------------------------------------------------------------------
* PanUser structure
*
* Maintains PANU connection info and status during an application
* session. A NAP, GN or PANU uses this structure to maintain
* information on connected PANU(s). The PanUser structure is always
* allocated by the application and is passed into the SDK through
* the PAN_Open function by a client or the PAN_Listen function by a
* server.
*/
typedef struct _PanUser {
/* === Internal use only === */
BnepPanu bnepPanu; /* remote BnepPanu */
BNEP_ADDR destMac; /* storage for dest MAC address */
uint8_t state;
PanRecvCb recv_cb; /* callback for receive data */
/* NAP */
uint32_t remIpAddr;
uint32_t remAddrContext;
/* SDP Client */
uint16_t dstService;
SdpQueryToken sdpQueryToken;
uint8_t sdpSrchAttrib[PAN_NUM_SEARCH_ATTRIBUTES];
} PanUser;
/* End of PanUser */
/*---------------------------------------------------------------------------
* PanCallbackParms structure
*
* Describes a callback event and any data that relates to the event.
*/
typedef struct _PanCallbackParms
{
/* Completion status based on the event type. Reason will be
* L2capDiscReason for PANEVENT_CLOSED events or BtStatus for others.
*/
uint16_t status;
uint8_t event; /* Type of PANEVENT_XX event */
/* Handle to the PanUser structure associated with this event. Valid
* after a connection is established.
*/
PanUser *pan;
/* Type of packet associated with this event. Valid on
* PANEVENT_DATA_HANDLED and PANEVENT_DATA_IND events.
*/
uint8_t type;
/* On PANEVENT_DATA_HANDLED event, points to the sent data packet.
* On PANEVENT_DATA_IND event, points to the received packet.
* The PanPacketType field above indicates the type.
*/
uint8_t *pkt;
/* Length of received data packet. Valid on
* PANEVENT_DATA_IND events.
*/
uint16_t rxPktLen;
} PanCallbackParmsT;
/* End of PanCallbackParms */
/*---------------------------------------------------------------------------
* bnep_addr_ntoa()
*
* Convert a MSB BNEP_ADDR to MSB ASCII notation aa:bb:cc:dd:ee:ff.
* AddrString should point to no less than 20 bytes. It will be
* null-terminated upon return.
*
* Parameters:
* bnepAddr - Pointer to BNEP_ADDR to convert.
* addrString - Pointer to storage for the converted BNEP address string.
*
* Returns:
* pointer to the converted/provided AddrString
*/
char *bnep_addr_ntoa(const BNEP_ADDR *bnepAddr, char *addrString);
/*---------------------------------------------------------------------------
* BNEP_Init()
*
* Initializes the BNEP layer.
*
* Returns:
* TRUE - BNEP was successfully initialized.
*
* FALSE - BNEP failed to initialize. This can
* happen when BNEP cannot be registered with L2CAP.
*/
int BNEP_Init(void);
/*---------------------------------------------------------------------------
* PAN_Init()
*
* Initialize PAN. This should be the first function called for PAN.
*
* Returns:
* TRUE - PAN was successfully initialized.
* FALSE - PAN failed to initialize.
*/
int PAN_Init(void);
/*---------------------------------------------------------------------------
* PAN_Register()
*
* Register a callback for events associated with the PanService. An
* application may register for only one service in a session.
*
* Parameters:
* service - pointer to PanService structure with the PanCallback and
* PanServiceType fields initialized for the desired service.
*
* Returns:
* BT_STATUS_SUCCESS - The registration succeeded.
*
* BT_STATUS_FAILED - The registration failed.
*/
BtStatus PAN_Register(PanService *service);
/*---------------------------------------------------------------------------
* PAN_Open()
*
* Initiate an open request for a PAN service connection.
*
* Parameters:
* remDev - The target remote device for the connection.
* pan - handle to the PanUser structure used to maintain the
* connection.
* cb - callback function used to handle received data directly
* tgtService - Service required for the connection.
*
* Returns:
* BT_STATUS_PENDING - The open request succeeded.
*
* BT_STATUS_FAILED - The open request failed.
*/
BtStatus PAN_Open(BtRemoteDevice *remDev, PanUser *pan, PanRecvCb cb, uint16_t tgtService);
/*---------------------------------------------------------------------------
* PAN_SetupConnection()
*
* Send a BNEP Setup Connection message from a client to complete an
* open connection request.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
* setupPkt - Setup connection packet.
*
* Returns:
* BT_STATUS_PENDING - The send succeeded. (If accepted by the remote
* device, a PANEVENT_OPEN event will occur.)
*
* BT_STATUS_FAILED - The send failed.
*/
BtStatus PAN_SetupConnection(PanUser *pan, PanSetupConnPkt *setupPkt);
/*---------------------------------------------------------------------------
* PAN_ControlResponse()
*
* Send a BNEP Setup Connection message from a server to complete an
* open connection request.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
* type - BNEP Control response type.
* controlRespPkt - control response packet.
*
* Returns:
* BT_STATUS_PENDING - The send succeeded.
*
* BT_STATUS_FAILED - The send failed.
*/
BtStatus PAN_ControlResponse(PanUser *pan, BnepControlType type,
PanControlRespPkt *controlRespPkt);
/*---------------------------------------------------------------------------
* PAN_ForwardPkt()
*
* Forward a data packet received from the BNEP protocol stack. The
* packet must include the Ethernet MAC header. No PANEVENT_DATA_HANDLED
* event will follow this function, as it was received from the BNEP
* stack and does not require allocation from the application memory
* pool.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
* pkt - pointer to the Ethernet data packet received from the BNEP
* stack.
* len - length of data packet.
*
* Returns:
* BT_STATUS_PENDING - The send succeeded.
*
* BT_STATUS_FAILED - The send failed.
*/
BtStatus PAN_ForwardPkt(PanUser *pan, uint8_t *pkt, uint16_t len);
/*---------------------------------------------------------------------------
* PAN_Close()
*
* Close the connection associated with the PanUser structure.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
*
* Returns:
* BT_STATUS_SUCCESS - The close succeeded.
*
* BT_STATUS_FAILED - The close failed.
*/
BtStatus PAN_Close(PanUser *pan);
/*---------------------------------------------------------------------------
* PAN_SendPkt()
*
* Send a data packet created by the application. A PANEVENT_DATA_HANDLED
* will be sent to the registered callback to notify when the
* packet can be returned to the memory pool.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
* panPkt - pointer to the data packet encapsulated in the PanPacket
* structure.
* type - data packet type.
* len - length of data packet.
*
* Returns:
* BT_STATUS_PENDING - The send succeeded.
*
* BT_STATUS_FAILED - The send failed.
*/
BtStatus PAN_SendPkt(PanUser *pan, PanPacket *panPkt, PanPacketType type, uint16_t len);
/*---------------------------------------------------------------------------
* PAN_SendArp()
*
* Send an ARP to resolve the specified IP address to a MAC address.
*
* Parameters:
* pan - handle to the PanUser structure associated with this address.
* destIP - IP address to resolve to a MAC address.
*
* Returns:
* The MAC address in a BNEP_ADDR structure.
*/
BNEP_ADDR *PAN_SendArp(PanUser *pan, uint32_t destIP);
/*---------------------------------------------------------------------------
* PAN_MakeArpHdr()
*
* Helper function to build an ARP header.
*
* Parameters:
* arpHdr - pointer to memory buffer large enough for ARP header.
* dstIP - IP address of destination.
*
* Returns:
* BT_STATUS_SUCCESS - The operation succeeded.
*
* BT_STATUS_FAILED - The operation failed.
*/
BtStatus PAN_MakeArpHdr(ArpHeader *arpHdr, uint32_t dstIP);
/*---------------------------------------------------------------------------
* PAN_GetLocalIpAddr_v2()
*
* Get the local IP address.
*
* Parameters:
* None
*
* Returns:
* The local IP address as an uint32_t.
*/
uint32_t PAN_GetLocalIpAddr_v2(void);
/*---------------------------------------------------------------------------
* PAN_SetLocalIpAddr_v2()
*
* Set the local IP address.
*
* Parameters:
* addr - local IP address.
*
* Returns:
* None.
*/
void PAN_SetLocalIpAddr_v2(uint32_t addr);
/*---------------------------------------------------------------------------
* PAN_GetRemoteIpAddr_v2()
*
* Get the remote IP address.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
*
* Returns:
* The remote IP address as an uint32_t.
*/
uint32_t PAN_GetRemoteIpAddr_v2(PanUser *pan);
/*---------------------------------------------------------------------------
* PAN_SetRemoteMacAddr()
*
* Set the MAC address of the remote PAN device.
*
* Parameters:
* pan - handle to the PanUser structure used to maintain the
* connection.
* macAddr - MAC address of remote PAN device.
*
* Returns:
* BT_STATUS_SUCCESS - The registration succeeded.
*
* BT_STATUS_FAILED - The registration failed.
*/
BtStatus PAN_SetRemoteMacAddr(PanUser *pan, uint8_t *macAddr);
/*---------------------------------------------------------------------------
* PAN_SetDhcpAddr_v2()
*
* Set the address to use for DHCP requests.
*
* Parameters:
* addr - DHCP address to use.
*
* Returns:
* None.
*/
void PAN_SetDhcpAddr_v2(uint32_t addr);
/*---------------------------------------------------------------------------
* PanFindFreeBtPkt()
*---------------------------------------------------------------------------
*
* Synopsis: Find available packet.
*
* Return: packet pointer or 0.
*/
PanBtPkt *PanFindFreeBtPkt(void);
/*---------------------------------------------------------------------------
* BNEP_SendPkt()
*
* Send a BNEP packet to the remote device. The bnepPkt parameter
* points to one of the valid BNEP packet types: General, Compressed,
* Source only compressed or Destination only compressed and may
* contain extension headers.
*
* Parameters:
* panu - Identifies the BNEP PANU channel that owns the packet.
* btPacket - A pointer to the BtPacket used to send the BNEP packet
* through L2CAP.
* bnepPkt - A pointer to the BNEP packet to send.
* bnepPktLen - Length of the BNEP packet.
*
* Returns:
* BT_STATUS_PENDING - The send packet process has been successfully
* started.
*
* BT_STATUS_INVALID_PARM - An invalid parameter was used.
*
* BT_STATUS_FAILED - L2CAP_Send failure.
*
* BT_STATUS_IN_PROGRESS - BNEP is busy sending another packet.
*/
BtStatus BNEP_SendPkt(BnepPanu *panu,
BtPacket *btPacket,
uint8_t *bnepPkt,
uint16_t bnepPktLen);
#endif // _PAN_API

View File

@ -0,0 +1,167 @@
#ifndef __PAN_PKT_H
#define __PAN_PKT_H
/*****************************************************************************
*
* File:
* $Id: pan_pkt.h 1284 2009-04-08 22:49:58Z suneelk $
* $Product: iAnywhere PAN SDK v1.x $
* $Revision: 1284 $
*
* Description: This file contains code for the PAN profile.
*
* Created: Feb 7, 2003
*
* Copyright 2000-2004 Extended Systems, Inc. ALL RIGHTS RESERVED.
* Portions copyright 2005-2008 iAnywhere Solutions, Inc.
*
* Unpublished Confidential Information of iAnywhere Solutions, Inc.
* Do Not Disclose.
*
* No part of this work may be used or reproduced in any form or by any means,
* or stored in a database or retrieval system, without prior written
* permission of iAnywhere Solutions, Inc.
*
* Use of this work is governed by a license granted by iAnywhere Solutions, Inc.
* This work contains confidential and proprietary information of iAnywhere
* Solutions, Inc. which is protected by copyright, trade secret, trademark and
* other intellectual property rights.
*
****************************************************************************/
#define IPPROTO_IP 0 /* dummy for IP */
#define IPPROTO_ICMP 1 /* Control Message Protocol */
#define IPPROTO_IPV4 4 /* IPv4 */
#define IPPROTO_TCP 6 /* TCP */
#define IPPROTO_UDP 17 /* UDP */
#define NET_PROTOCOL_TYPE_ARP 0x0806 /* Address Resolution Protocol */
#define NET_PROTOCOL_TYPE_VLAN 0x8100 /* VLAN( Virtual lan)-tagged frame (IEEE 802.1Q)*/
#define NET_PROTOCOL_TYPE_IPV4 0x0800 /* Internet Protocol, Version 4 (IPv4)*/
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 /* minimum icmp packet size (just header) */
#define BOOTP_SERVER 0x0043
#define BOOTP_CLIENT 0x0044
#define DHCPDISCOVER 1
#define DHCPOFFER 2
#define DHCPREQUEST 3
#define DHCPDECLINE 4
#define DHCPACK 5
#define DHCPNAK 6
#define DHCPRELEASE 7
/* ---------------------------------------------------------------------------
* ARP header
*/
typedef __PACKED_STRUCT _ArpHeader {
uint16_t macType; /* MAC address type */
uint16_t protoType; /* Protocol address type */
uint8_t macLen; /* MAC address length */
uint8_t protoLen; /* Protocol address length */
uint16_t op; /* ARP operation (1=request, 2=reply) */
uint8_t srcMac[6]; /* MAC source address */
uint32_t srcIP; /* IP source address */
uint8_t dstMac[6]; /* MAC destination address */
uint32_t dstIP; /* IP destination address */
} ArpHeader;
/* ---------------------------------------------------------------------------
* IP header
*/
typedef __PACKED_STRUCT _IpHeader {
uint32_t srcIP; /* source address */
uint32_t dstIP; /* destination address */
uint8_t hdrLen:4; /* length of the header in 32 bit units */
uint8_t version:4; /* Version of IP */
uint8_t tos; /* Type of service */
uint16_t totalLen; /* total length of the packet */
uint16_t id; /* unique identifier */
uint16_t offset; /* fragment offset */
uint8_t ttl; /* time to live */
uint8_t proto; /* protocol (TCP, UDP etc) */
uint16_t cksum; /* IP checksum */
} IpHeader;
/* ---------------------------------------------------------------------------
* ICMP header
*/
typedef __PACKED_STRUCT _IcmpHeader {
uint8_t type;
uint8_t code; /* type sub code */
uint16_t cksum;
uint16_t id;
uint16_t seq;
uint32_t timestamp; /* Timestamp at the beginning of data */
} IcmpHeader;
/* ---------------------------------------------------------------------------
* UDP header
*/
typedef __PACKED_STRUCT _UdpHeader {
uint16_t srcPort; /* Source port # */
uint16_t dstPort; /* Destination port # */
uint16_t len; /* Udp packet length */
uint16_t cksum; /* Udp checksum (optional) */
} UdpHeader;
/* ---------------------------------------------------------------------------
* DHCP header
*/
typedef __PACKED_STRUCT _DhcpHeader {
uint8_t op;
uint8_t htype;
uint8_t hlen;
uint8_t hops;
uint32_t xid;
uint16_t secs;
uint16_t flags;
uint32_t ciaddr;
uint32_t yiaddr;
uint32_t siaddr;
uint32_t giaddr;
uint8_t chaddr[16];
uint8_t sname[64];
uint8_t file[128];
uint8_t cookie[4];
uint8_t options[312];
} DhcpHeader;
/* ---------------------------------------------------------------------------
* TCP header
*/
typedef __PACKED_STRUCT _TcpHeader {
uint16_t srcPort; /* Source port # */
uint16_t dstPort; /* Destination port # */
uint32_t seq;
uint32_t ack;
uint8_t reserved:4; /* reserved */
uint8_t offset:4; /* length of the header, in 32 bit units */
uint8_t flags;
uint16_t window;
uint16_t cksum; /* calculated from TCP Pseudo Header */
uint16_t urgent;
uint8_t options[];
/* 0 to 44 bytes of options may be placed at the end of the TCP header.
* The options must be padded to make the TCP header length a multiple
* of 32 bits.
*/
} TcpHeader;
/* ---------------------------------------------------------------------------
* TCP Pseudo header (used for checksum calculation)
*/
typedef __PACKED_STRUCT _TcpPseudoHeader {
uint32_t srcIP; /* Source IP address */
uint32_t dstIP; /* Destination IP address */
uint8_t zero;
uint8_t proto; /* IP protocol */
uint16_t len; /* totoal length */
} TcpPseudoHeader;
#endif /* __PAN_PKT_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,152 @@
#ifndef __RFCOMM_API_H
#define __RFCOMM_API_H
#include "btconfig.h"
#include "me_api.h"
#include "sec_api.h"
typedef struct _RfDeferEvent {
ListEntry node;
void *func;
void *channel;
} RfDeferEvent;
/*---------------------------------------------------------------------------
* RfChannel structure
*
* Represents a single RFCOMM channel. The RFCOMM user must create
* this structure and fill in the "callback", "maxFrameSize", and
* "priority" fields prior to calling RF_OpenClientChannel. Only the
* "callback" filed must be set when calling RF_RegisterServerChannel.
*/
typedef struct _RfChannel
{
ListEntry node; /* Used internally by RFCOMM. */
/* Callback function for channel events */
void* callback;
/* Frame size for the channel. This value must be between
* RF_MIN_FRAME_SIZE and RF_MAX_FRAME_SIZE.
*/
uint16_t maxFrameSize;
/* Priority of the channel. Channels with higher priority have smaller
* "priority" values. Generally, data on higher priority channels is
* sent before lower priority channels. The priority must be between
* RF_DEFAULT_PRIORITY (0) and RF_LOWEST_PRIORITY (63).
*/
uint8_t priority;
/* User context. In some environments the context of the application
* during a callback is not known. In these cases, a pointer to the
* application's context can be stored in userContext and then
* retrieved during the callback.
*/
void *userContext;
/* === Internal use only === */
BtSecurityToken secToken;
uint8_t state;
uint8_t muxId;
uint8_t dlcId;
uint8_t dlci;
uint16_t flags;
ListEntry txQueue;
EvmTimer timer;
uint8_t cmdSent;
uint8_t rfSignals;
int16_t rxCredit;
uint16_t txCredit;
uint8_t grantedCredit;
uint8_t initialRxCredit;
uint16_t initialFrameSize;
RfDeferEvent deferEvent;
}RfChannel;
typedef uint8_t RfSignals;
/*---------------------------------------------------------------------------
* RfModemStatus structure
*
* Represents the status of V.24 signals. To send signals on a connection,
* create and fill in this structure, then call RF_SetModemStatus.
*
* When the remote device sends these signals, RFCOMM generates an
* RFEVENT_MODEM_STATUS_IND event. During this event, you can read the
* status in the RfCallbackParms "ptrs.modemStatus" field.
*/
typedef struct _RfModemStatus
{
RfSignals signals; /* Contains all signals that apply to this status
* message.
*/
uint8_t breakLen; /* Indicates the length of the break signal in 200 ms
* units. If 0, no break signal was sent. Must be
* between 0 and 15 (inclusive).
*/
} RfModemStatus;
typedef uint8_t RfLineStatus;
typedef uint8_t RfBaudRate;
typedef uint8_t RfDataFormat;
typedef uint8_t RfFlowControl;
typedef uint16_t RfPortSettingsMask;
/*---------------------------------------------------------------------------
* RfPortSettings structure
*
* Represents port settings for an RFCOMM channel. Port settings
* are used for RS232 emulation. They are informational and have
* no real effect on the data stream at the RFCOMM level. To change
* port settings for a channel, this structure is filled and provided
* to RFCOMM using the RF_RequestPortSettings function.
*
* When the remote device changes port settings, RFCOMM provides
* this structure along with the RFEVENT_PORT_NEG_IND event. The
* RFCOMM user can then review the settings, then accept or reject
* them with RF_AcceptPortSettings.
*
* Fields in this structure may be valid or invalid, depending on
* the contents of the "parmMask" field.
*/
typedef struct _RfPortSettings
{
RfBaudRate baudRate; /* Indicates the baud rate */
RfDataFormat dataFormat; /* Contains data bits, stop bits, and
* parity settings.
*/
RfFlowControl flowControl; /* Indicates port flow control options */
uint8_t xonChar; /* Indicates the XON character */
uint8_t xoffChar; /* Indicates the XOFF character */
/* Contains a bitmask of settings.
*
* When changing port settings with RF_RequestPortSettings, "parmMask"
* indicates which port settings are being changed.
*
* During an RFEVENT_PORT_NEG_IND event, "parmMask" describes which
* parameters the remote device sent.
*/
RfPortSettingsMask parmMask;
} RfPortSettings;
typedef struct _RfService
{
/* Identifies the ID that corresponds to this service. This ID value
* can be set to 0 before this structure is used if the desired RFCOMM
* Server ID not known. If it is set to 0, then, after the service has been
* registered with RFCOMM, it will contain a valid RFCOMM Server ID. If
* the desired RFCOMM Server ID is known, then this ID value can be set to
* that value before registering with RFCOMM. In either case, make sure to
* register this ID with SDP so that remote devices can locate this RFCOMM
* service. This ID can also be used as the channel in * BtSecurityRecords
* (for incoming connections only).
*/
uint8_t serviceId;
} RfService;
#endif

View File

@ -0,0 +1,78 @@
#ifndef __SDP_API_H
#define __SDP_API_H
#include "bt_types.h"
#include "me_api.h"
typedef uint16_t SdpAttributeId;
/*---------------------------------------------------------------------------
* SdpAttribute structure
*
* Defines an attribute's ID and value. SdpAttribute structures
* are stored in a SdpRecord prior to calling the SDP_AddRecord
* function.
*/
typedef struct _SdpAttribute
{
SdpAttributeId id; /* Attribute ID. */
uint16_t len; /* Length of the value buffer */
const uint8_t *value; /* An array of bytes that contains the value
* of the attribute. The buffer is in
* Data Element form (see SdpDataElemType
* and SdpDataElemSize).
*/
/* Group: The following field is for internal use only */
uint16_t flags;
} SdpAttribute;
/*---------------------------------------------------------------------------
* SdpRecord structure
*
* Defines the contents of a service record. Service records are
* initialized and provided to SDP_AddRecord.
*/
typedef struct _SdpRecord
{
ListEntry node; /* For internal use only. */
uint8_t num; /* Total number of attributes in "attribs". */
/* Pointer to an array of attributes.
*
* Store the attributes in ascending order by attribute ID, and
* do not add two attributes with the same ID.
*
* Do not include an AID_SERVICE_RECORD_HANDLE attribute. This
* attribute is handled automatically by SDP.
*/
SdpAttribute *attribs;
/* The service class fields of the class of device. Use the values defined
* in me.h. The device class portion is ignored.
*/
BtClassOfDevice classOfDevice;
/* Group: The following fields are for internal use only. */
uint32_t handle; /* Service Record Handle */
uint32_t recordState; /* Service Record State */
uint16_t flags; /* Flag to keep track of marked attributes */
uint16_t handleFlag; /* Flag to keep track of service record handle */
uint16_t stateFlag; /* Flag to keep track of service record state */
} SdpRecord;
typedef struct
{
uint8_t *sdpatt_table;
uint8_t *sdpdeviceId_table;
uint16_t att_table_size;
uint16_t deviceId_size;
}sdp_AttTable_Info_t;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,263 @@
#ifndef __SPP_API_H
#define __SPP_API_H
#include <stdbool.h>
#include "bt_types.h"
#include "rfcomm_api.h"
#include "sdp_api.h"
/*---------------------------------------------------------------------------
* Serial Port Profile (SPP) layer
*
* The Serial Port Profile (SPP) specification defines procedures
* and protocols for Bluetooth devices emulating RS232 or other serial
* connections.
*/
/****************************************************************************
*
* Section: Configuration Constants
*
* The following defines are configuration constants that allow
* an implementer to include/exclude functionality from SPP.
*
****************************************************************************/
/*---------------------------------------------------------------------------
* SPP_SERVER constant
* Configuration constant to enable code for Serial Port Profile
* server. If the device is client-only, this should be defined as
* XA_DISABLED in overide.h.
*/
#ifndef SPP_SERVER
#define SPP_SERVER XA_ENABLED
#endif
/*---------------------------------------------------------------------------
* SPP_CLIENT constant
* Configuration constant to enable code for Serial Port Profile
* client. If the device is server-only, this should be defined as
* XA_DISABLED in overide.h.
*/
#ifndef SPP_CLIENT
#define SPP_CLIENT XA_ENABLED
#endif
/****************************************************************************
*
* Types
*
****************************************************************************/
/*---------------------------------------------------------------------------
* SppEvent type
*
* The application is notified of various indications and confirmations
* through a callback function. Depending on the event, different
* elements of the SppCallbackParms "SppCallbackParms.p" union will be
* valid.
*/
typedef uint16_t SppEvent;
/** A connection has been established with a remote device.
*
* When this callback is received, the "SppCallbackParms.p.remDev" field
* contains a pointer to the remote device context.
*/
#define SPP_EVENT_REMDEV_CONNECTED 0
/** A connection has been terminated for a remote device.
*
* When this callback is received, the "SppCallbackParms.p.other" field
* contains a 0.
*/
#define SPP_EVENT_REMDEV_DISCONNECTED 1
#define SPP_EVENT_SEND_COMPLETE 2
#define SPP_EVENT_DATA_IND 3
/* End of SppEvent */
/*---------------------------------------------------------------------------
* SppPortType type
*
* Identifies the serial port as a client (outgoing) or server (incoming).
*/
typedef uint8_t SppPortType;
#define SPP_SERVER_PORT 0x01
#define SPP_CLIENT_PORT 0x02
/* End of SppPortType */
#if SPP_SERVER == XA_ENABLED
/*---------------------------------------------------------------------------
* SppService structure
*
* Servers need this data type for registering with RFCOMM. A particular
* service may have one or more ports available. For example, a device
* might provide access to 2 modems. It is providing a single service
* (modem) via 2 serial ports.
*/
typedef struct _SppService {
RfService service; /* Required for registering service w/RFCOMM */
const uint8_t *name; /* name of service */
uint16_t nameLen; /* Length of name */
uint16_t numPorts; /* Number of ports in this service */
SdpRecord *sdpRecord; /* Description of the service */
} SppService;
#endif /* SPP_SERVER == XA_ENABLED */
#if SPP_CLIENT == XA_ENABLED
/*---------------------------------------------------------------------------
* SppClient structure
* Contains all fields unique to clients. SppClient is a data type in
* device structures (SppDev) for clients.
*/
typedef struct _SppClient {
/* === Internal use only === */
BtRemoteDevice *remDev;
uint8_t serverId;
SdpQueryToken sdpToken;
} SppClient;
#endif
typedef struct _SppCallbackParms SppCallbackParms;
typedef struct _SppDev SppDev;
enum spp_type_t{
SPP_DATA_SBC,
SPP_DATA_AAC,
SPP_DATA_RAW,
SPP_CMD,
};
enum spp_cmd_type_t{
SPP_CMD_TWS_SLAVE_INF,
SPP_CMD_BUTTON_EVENT,
//SPP_CMD_AUDIO_PLAY,
//SPP_CMD_AUDIO_PAUSE,
//SPP_CMD_AUDIO_NEXT,
//SPP_CMD_AUDIO_PREV,
//SPP_CMD_VOLUME_DOWN,
//SPP_CMD_VOLUME_UP,
//SPP_CMD_VOLUME_ADJUST,
SPP_CMD_POWER_OFF,
};
/*---------------------------------------------------------------------------
* SppCallbackParms structure
*
* A pointer to this structure is sent to the application's callback function
* notifying the application of state changes or important events.
*/
struct _SppCallbackParms {
SppEvent event; /* Event associated with the callback */
BtStatus status; /* Status of the callback event */
/* For certain events, a single member of this union will be valid.
* See SppEvent documentation for more information.
*/
union {
void *other;
BtRemoteDevice *remDev;
BtPacket *pkt;
} p;
};
/*---------------------------------------------------------------------------
* SppCallback type
*
* A function of this type is called to indicate events to the application.
*/
typedef void (*SppCallback)(SppDev *locDev, SppCallbackParms *Info);
/* End of SppCallback */
typedef struct _SppModeStruct {
BtRemoteDevice *remDev;
SppCallback callback;
} SppModeStruct;
/*---------------------------------------------------------------------------
* SppDev structure
* This structure defines an SPP device. A user of SPP must allocate
* one SppDev for each serial device. Members should not be accessed
* directly.
*/
struct _SppDev {
/* Pointer to platform-specific data. This pointer is passed to all
* platform-specific functions (prefaced SPPOS_).
*/
void *osDev;
SppPortType portType; /* SPP_SERVER_PORT or SPP_CLIENT_PORT */
/* Fields specific to clients and servers */
union {
#if SPP_CLIENT == XA_ENABLED
SppClient client;
#endif
#if SPP_SERVER == XA_ENABLED
SppService *sppService;
#endif
} type;
/* === Internal use only === */
SppCallback callback; /* application callback function */
BtSecurityRecord sppSec;
/* Server / Client elements */
uint8_t state; /* device state */
RfChannel channel;
CmgrHandler cmgrHandler;
RfModemStatus rModemStatus; /* remote modem status */
RfModemStatus lModemStatus; /* local modem status */
RfLineStatus lineStatus;
RfPortSettings portSettings;
uint8_t xonChar;
uint8_t xoffChar;
int16_t highWater; /* when rRing.dataLen >= highWater,
flow off rx */
uint8_t credit; /* rx credits outstanding */
uint8_t msr; /* Modem Status Register */
int16_t breakLen;
};
/* SPP_Open has not been called or SPP_Closed was last called */
#define DEVICE_STATE_CLOSED 0
/* SPP_Open has been called but the device is not connected. */
#define DEVICE_STATE_DISCONNECTED 1
/* The device is opened and connected to a remote device. */
#define DEVICE_STATE_CONNECTED 2
//bool spp_Init(void);
BtStatus spp_send(SppDev *dev, uint8_t *data, uint16_t datalen);
BtStatus spp_connect(SppDev *dev, BD_ADDR *addr);
BtStatus spp_disconnect(SppDev *dev);
BtStatus spp_register(SppDev *dev, BtSecurityParms *sec_parm, uint8_t role, SppCallback callback);
#endif /* __SPP_API_H */

View File

@ -0,0 +1,202 @@
/*
******************************************************************************
* @file driver_display.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2022
* @brief display abstract interfase.
******************************************************************************
* @attention
*
* Copyright (c) 2022 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include <stdint.h>
#include "app_lvgl.h"
#include "app_config.h"
#include "driver_display.h"
#ifdef DISPLAY_TYPE_GC9C01
#include "driver_gc9c01.h"
#endif
#ifdef DISPLAY_TYPE_JD9854
#include "driver_jd9854.h"
#endif
#ifdef DISPLAY_TYPE_SH8601A
#include "driver_sh8601a.h"
#endif
#ifdef DISPLAY_TYPE_ICNA3310
#include "driver_icna3310.h"
#endif
#ifdef DISPLAY_TYPE_SH8601Z
#include "driver_sh8601z.h"
#endif
#ifdef DISPLAY_TYPE_NV3047_RGB
#include "driver_nv3047_rgb.h"
#endif
#ifdef DISPLAY_TYPE_ST7701_RGB
#include "driver_st7701_rgb.h"
#endif
#ifdef DISPLAY_TYPE_NV3041A
#include "driver_nv3041a.h"
#endif
void display_init(void)
{
#ifdef DISPLAY_TYPE_GC9C01
gc9c01_init();
#endif
#ifdef DISPLAY_TYPE_JD9854
jd9854_init();
#endif
#ifdef DISPLAY_TYPE_SH8601A
sh8601a_init();
#endif
#ifdef DISPLAY_TYPE_ICNA3310
icna3310_init();
#endif
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_init();
#endif
#ifdef DISPLAY_TYPE_NV3047_RGB
extern void* get_display_buffer1(void);
extern void rgb_display_controller_init(void);
rgb_display_controller_init();
rgb_display_init(get_display_buffer1());
#endif
#ifdef DISPLAY_TYPE_ST7701_RGB
extern void* get_display_buffer1(void);
st7701_init(get_display_buffer1());
#endif
#ifdef DISPLAY_TYPE_NV3041A
nv3041a_init();
#endif
}
void display_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
#ifdef DISPLAY_TYPE_GC9C01
gc9c01_set_window(x_s, x_e, y_s, y_e);
#endif
#ifdef DISPLAY_TYPE_JD9854
jd9854_set_window(x_s, x_e, y_s, y_e);
#endif
#ifdef DISPLAY_TYPE_SH8601A
sh8601a_set_window(x_s, x_e, y_s, y_e);
#endif
#ifdef DISPLAY_TYPE_ICNA3310
icna3310_set_window(x_s, x_e, y_s, y_e);
#endif
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_set_window(x_s, x_e, y_s, y_e);
#endif
#ifdef DISPLAY_TYPE_NV3041A
nv3041a_set_window(x_s, x_e, y_s, y_e);
#endif
}
void display_update(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
#ifdef DISPLAY_TYPE_GC9C01
gc9c01_display(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_JD9854
jd9854_display(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_SH8601A
sh8601a_display(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_ICNA3310
icna3310_display(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_display(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_NV3041A
nv3041a_display(pixel_count, pixel_width, data);
#endif
}
void display_update_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
#ifdef DISPLAY_TYPE_GC9C01
gc9c01_display_dma(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_JD9854
jd9854_display_dma(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_SH8601A
sh8601a_display_dma(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_ICNA3310
icna3310_display_dma(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_display_dma(pixel_count, pixel_width, data);
#endif
#ifdef DISPLAY_TYPE_NV3047_RGB
#endif
#ifdef DISPLAY_TYPE_ST7701_RGB
#endif
#ifdef DISPLAY_TYPE_NV3041A
nv3041a_display_dma(pixel_count, pixel_width, data);
#endif
}
void display_power_off(void)
{
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_power_off();
#endif
}
void display_power_on(void)
{
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_power_on();
#endif
}
void display_update_dma_isr(void)
{
#ifdef DISPLAY_TYPE_GC9C01
gc9c01_display_dma_isr();
#endif
#ifdef DISPLAY_TYPE_JD9854
jd9854_display_dma_isr();
#endif
#ifdef DISPLAY_TYPE_SH8601A
sh8601a_display_dma_isr();
#endif
#ifdef DISPLAY_TYPE_ICNA3310
icna3310_display_dma_isr();
#endif
#ifdef DISPLAY_TYPE_SH8601Z
sh8601z_display_dma_isr();
#endif
#ifdef DISPLAY_TYPE_ST7701_RGB
st7701_rgb_display_dma_irq();
#endif
#ifdef DISPLAY_TYPE_NV3041A
nv3041a_display_dma_isr();
#endif
}

View File

@ -0,0 +1,162 @@
#ifndef __DRIVER_DISPLAY_H__
#define __DRIVER_DISPLAY_H__
#include <stdint.h>
#include "driver_spi.h"
#include "driver_dma.h"
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
// Macro Variables definitions
//
//*****************************************************************************
#define __DISPLAY_CS_SET() display_cs_set()
#define __DISPLAY_CS_CLEAR() display_cs_clear()
#define __DISPLAY_RESET_SET() display_reset_set()
#define __DISPLAY_RESET_CLEAR() display_reset_clear()
#define __DISPLAY_VCI_SET() display_vci_set()
#define __DISPLAY_VCI_CLEAR() display_vci_clear()
#define __DISPLAY_DELAY_MS(counter) display_delay_ms(counter)
//*****************************************************************************
//
// Global Variables definitions
//
//*****************************************************************************
extern SPI_HandleTypeDef spi_display_handle;
extern DMA_HandleTypeDef dma_display_handle;
//*****************************************************************************
//
// External function definitions
//
//*****************************************************************************
/************************************************************************************
* @fn display_cs_set
*
* @brief Set display driver CS pin to HIGH, this function should be implemented by user when
* CS is controlled by software.
*/
void display_cs_set(void);
/************************************************************************************
* @fn display_cs_release
*
* @brief Set display driver CS pin to LOW, this function should be implemented by user when
* CS is controlled by software.
*/
void display_cs_clear(void);
/************************************************************************************
* @fn display_reset_set
*
* @brief Set display driver RESET pin to HIGH, this function should be implemented by user..
*/
void display_reset_set(void);
/************************************************************************************
* @fn display_reset_clear
*
* @brief Set display driver RESET pin to LOW, this function should be implemented by user.
*/
void display_reset_clear(void);
/************************************************************************************
* @fn display_vci_set
*
* @brief Set display driver VCI pin to HIGH, this function should be implemented by user..
*/
void display_vci_set(void);
/************************************************************************************
* @fn display_vci_clear
*
* @brief Set display driver VCI pin to LOW, this function should be implemented by user.
*/
void display_vci_clear(void);
/************************************************************************************
* @fn display_delay_ms
*
* @brief Used in display driver. co_delay_100us or vTaskDelay can be used for implementation
* by user.
*/
void display_delay_ms(uint32_t counter);
/************************************************************************************
* @fn display_init
*
* @brief Initial display drivers.
*/
void display_init(void);
/************************************************************************************
* @fn display_set_window
*
* @brief used to define area of frame memory where MCU can access.
*
* @param x_s: SC.
* x_e: EC.
* y_s: SP.
* y_e: EP.
*/
void display_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
/************************************************************************************
* @fn display_update
*
* @brief transfer data to framebuffer of display controller in block mode.
*
* @param pixel_count: total pixels count to be sent.
* pixel_width: this parameter should be 16, 24.
* data: pointer to data buffer
*/
void display_update(uint32_t pixel_count, uint8_t pixel_width, void *data);
/************************************************************************************
* @fn display_update_dma
*
* @brief transfer data to framebuffer of display controller in DMA mode.
*
* @param pixel_count: total pixels count to be sent.
* pixel_width: this parameter should be 16, 24.
* data: pointer to data buffer
*/
void display_update_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
/************************************************************************************
* @fn display_update_dma_isr
*
* @brief this function will be called in DMA isr handler when dma transfer is done.
*/
void display_update_dma_isr(void);
/************************************************************************************
* @fn display_power_off
*
* @brief used to power off display to save power.
*/
void display_power_off(void);
/************************************************************************************
* @fn display_power_on
*
* @brief turn on display.
*/
void display_power_on(void);
#ifdef __cplusplus
}
#endif
#endif /* __DRIVER_DISPLAY_H__ */

View File

@ -0,0 +1,238 @@
#include "driver_display.h"
static void reg_write(uint8_t addr, uint8_t *value, uint8_t length)
{
uint8_t sdat[length + 4];
sdat[0] = 0x02;
sdat[1] = 0x00;
sdat[2] = addr;
sdat[3] = 0x00;
memcpy(&sdat[4], value, length);
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
__DISPLAY_CS_SET();
}
static void reg_read(uint8_t addr, uint8_t *value, uint8_t length)
{
uint8_t sdat[4];
sdat[0] = 0x03;
sdat[1] = 0x00;
sdat[2] = addr;
sdat[3] = 0x00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
spi_master_receive_X1(&spi_display_handle, value, length);
__DISPLAY_CS_SET();
}
void icna3310_init(void)
{
uint8_t buffer[4];
__DISPLAY_VCI_CLEAR();
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(200);
__DISPLAY_VCI_SET();
__DISPLAY_DELAY_MS(50);
__DISPLAY_RESET_SET();
__DISPLAY_DELAY_MS(5);
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(5);
__DISPLAY_RESET_SET();
__DISPLAY_DELAY_MS(5);
// __DISPLAY_VCI_CLEAR();
// __DISPLAY_RESET_CLEAR();
// __DISPLAY_DELAY_MS(20);
// __DISPLAY_RESET_SET();
// __DISPLAY_DELAY_MS(40);
// __DISPLAY_VCI_SET();
// __DISPLAY_DELAY_MS(80);
buffer[0] = 0x20;
reg_write(0xFE, &buffer[0], 1);
buffer[0] = 0x5a;
reg_write(0xF4, &buffer[0], 1);
buffer[0] = 0x59;
reg_write(0xF5, &buffer[0], 1);
buffer[0] = 0x40;
reg_write(0xFE, &buffer[0], 1);
buffer[0] = 0x0a;
reg_write(0x08, &buffer[0], 1);
buffer[0] = 0x00;
reg_write(0xFE, &buffer[0], 1);
buffer[0] = 0x80;
reg_write(0xC4, &buffer[0], 1);//SPI sram write enable
buffer[0] = 0x55;
reg_write(0x3A, &buffer[0], 1);//55 RGB565, 77 RGB888
buffer[0] = 0x00;
reg_write(0x35, &buffer[0], 1);
buffer[0] = 0x20;
reg_write(0x53, &buffer[0], 1);
buffer[0] = 0xFF;
reg_write(0x51, &buffer[0], 1);
buffer[0] = 0xFF;
reg_write(0x63, &buffer[0], 1);
buffer[0] = 0x00;
buffer[1] = 0x06;
buffer[2] = 0x01;
buffer[3] = 0xD7;
reg_write(0x2A, &buffer[0], 4); // paritial update:466RGB
buffer[0] = 0x00;
buffer[1] = 0x00;
buffer[2] = 0x01;
buffer[3] = 0xD1;
reg_write(0x2B, &buffer[0], 4); // partial update:466line
// buffer[0] = 0x00;
// reg_write(0xFE, &buffer[0], 1);
reg_write(0x11, NULL, 0);
__DISPLAY_DELAY_MS(120);
// buffer[0] = 0x00;
// reg_write(0xFE, &buffer[0], 1);
reg_write(0x29, NULL, 0);
__DISPLAY_DELAY_MS(50);
}
void icna3310_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
uint8_t data[4];
x_s += 6;
x_e += 6;
data[0] = x_s >> 8;
data[1] = x_s & 0xff;
data[2] = x_e >> 8;
data[3] = x_e & 0xff;
reg_write(0x2A, &data[0], 4);
data[0] = y_s >> 8;
data[1] = y_s & 0xff;
data[2] = y_e >> 8;
data[3] = y_e & 0xff;
reg_write(0x2B, &data[0], 4);
// reg_write(0x2C, &data[0], 4);
}
void icna3310_adjust_brightness(uint8_t value) //Value 0x00 - 0xFF
{
uint8_t buffer[1];
buffer[0] = 0x00;
reg_write(0xFE, &buffer[0], 1);
buffer[0] = value;
reg_write(0x51, &buffer[0], 1);
}
void icna3310_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t frame_size;
if (pixel_width == 16) {
frame_size = SPI_FRAME_SIZE_16BIT;
}
else if (pixel_width == 32) {
frame_size = SPI_FRAME_SIZE_24BIT;
}
spi_display_handle.Init.Frame_Size = frame_size;
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
__DISPLAY_CS_SET();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
}
void icna3310_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t spi_trans_width;
uint32_t dma_sample_count;
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
dma_sample_count = pixel_count * pixel_width / 32;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
break;
default:
return;
}
switch (dma_display_handle.Init.Desination_Width) {
case DMA_TRANSFER_WIDTH_32:
spi_trans_width = SPI_FRAME_SIZE_32BIT;
break;
case DMA_TRANSFER_WIDTH_16:
spi_trans_width = SPI_FRAME_SIZE_16BIT;
break;
case DMA_TRANSFER_WIDTH_8:
spi_trans_width = SPI_FRAME_SIZE_8BIT;
break;
default:
return;
}
if (pixel_width != 32) {
spi_display_handle.Init.Frame_Size = spi_trans_width;
}
else {
spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_24BIT;
}
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_ENABLE(spi_display_handle.SPIx);
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
if ((spi_trans_width == SPI_FRAME_SIZE_32BIT)
&& (pixel_width != 32)) {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
}
else {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
}
__SPI_ENABLE(spi_display_handle.SPIx);
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
}
void icna3310_display_dma_isr(void)
{
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
// CS Release
__DISPLAY_CS_SET();
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
}

View File

@ -0,0 +1,16 @@
#ifndef __DRIVER_ICNA3310_H
#define __DRIVER_ICNA3310_H
#include <stdint.h>
void icna3310_init(void);
void icna3310_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
void icna3310_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
void icna3310_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
void icna3310_display_dma_isr(void);
#endif // __DRIVER_ICNA3310_H

View File

@ -0,0 +1,556 @@
#include "driver_display.h"
#include "driver_nv3041a.h"
#include "driver_parallel_interface.h"
extern PARALLEL_HandTypeDef hparallel;
static void WriteComm(uint8_t reg)
{
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
Parallel_write_cmd(&hparallel,reg);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
static void WriteData(uint8_t data)
{
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
Parallel_write_param(&hparallel,data);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
static void LCD_READ_DATA(uint8_t reg)
{
static uint16_t data=0;
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
//Parallel_write_cmd(&hparallel,reg);
// Parallel_read_data_cmd(&hparallel,reg,&data,1);
printf("reg_param:0x%x\r\n",data);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void display_backlight_set(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
void display_backlight_clear(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_CLEAR);
}
void nv3041a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
WriteComm(0x2a);//列地址设置
WriteData(x_s>>8);
WriteData(x_s&0xff);
WriteData(x_e>>8);
WriteData(x_e&0xff);
WriteComm(0x2b);//行地址设置
WriteData(y_s>>8);
WriteData(y_s&0xff);
WriteData(y_e>>8);
WriteData(y_e&0xff);
WriteComm(0x2c);//储存器写
// write_cmd(0x2c);
}
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i,j,size;
nv3041a_set_window(xsta,xend-1,ysta,yend-1);//设置显示范围
__PARALLEL_CS_SET(hparallel.PARALLELx);
if(hparallel.Init.DataBusSelect == DATA_BUS_8_BIT)
{
size=2;
}else{
size=2;
}
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
// LCD_WR_DATA(color);
/* writer data */
Parallel_write_data(&hparallel,(uint32_t *)&color,size);
}
}
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void nv3041a_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint32_t frame_size=0;
if (pixel_width == 8) {
frame_size = (pixel_count*4);
}
if (pixel_width == 16) {
// frame_size = SPI_FRAME_SIZE_16BIT;
frame_size = (pixel_count*2);
}
else if (pixel_width == 32) {
frame_size = (pixel_count);
}
__PARALLEL_CS_SET(hparallel.PARALLELx);
//Parallel_write_param(&hparallel,data);
Parallel_write_data(&hparallel,data,(frame_size));
//while(__PARALLEL_IS_BUS_BUSY(hparallel.PARALLELx));
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void nv3041a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t dma_trans_width=0;
uint32_t dma_sample_count=0;
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
//272x480 16
dma_sample_count = pixel_count * pixel_width / 32;
//dma_sample_count=dma_sample_count*4;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
// dma_sample_count=dma_sample_count*2;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
// dma_sample_count=dma_sample_count;
break;
default:
return;
}
// switch(hparallel.Init.DataBusSelect)
// {
// case DATA_BUS_8_BIT:
// dma_trans_width = 2;
// break;
//
// case DATA_BUS_16_BIT:
// dma_trans_width=2;
// break;
// }
dma_sample_count=dma_sample_count*2;
__PARALLEL_CS_SET(hparallel.PARALLELx);
__PARALLEL_SET_WR_LEN(hparallel.PARALLELx,dma_sample_count);
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&hparallel.PARALLELx->TX_FIFO, (dma_sample_count));
}
void nv3041a_display_dma_isr(void)
{
#if 0
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
// CS Release
__DISPLAY_CS_SET();
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
#endif
//printf("nv3041a_display_dma_isr1\r\n");
while(!( __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY));
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
//printf("nv3041a_display_dma_isr2\r\n");
}
#define pixel_size 100*100
uint16_t color_buffer[pixel_size]={0};
void nv3041a_init(void)
{
#define TFT_43 0
display_backlight_clear();
#if TFT_43 == 1
WriteComm(0xff);
WriteData(0xa5);
WriteComm(0xE7);//TE_output_en
WriteData(0x10);
WriteComm(0x35);//TE_ interface_en
WriteData(0x01);
WriteComm(0x3A);
WriteData(0x01);//00---666//01--565
WriteComm(0x40);
WriteData(0x01); //01:IPS/00:TN
WriteComm(0x41);
WriteData(0x03);//01--8bit//03--16bit
WriteComm(0x55);
WriteData(0x01);
WriteComm(0x44);//VBP
WriteData(0x15);//21NVu NV3041A-01
WriteComm(0x45);//VFP
WriteData(0x15);//21
WriteComm(0x7d);//vdds_trim[2:0]
WriteData(0x03);//2.07V
WriteComm(0xc1);//avdd_clp_en avdd_clp[1:0] avcl_clp_en avcl_clp[1:0]
WriteData(0xab);//6.74V/-5.16V
WriteComm(0xc2);//vgh_clp_en vgl_clp[2:0]
WriteData(0x17);
WriteComm(0xc3);//vgl_clp_en vgl_clp[2:0]
WriteData(0x10);//-10.951
WriteComm(0xc6);//avdd_ratio_sel avcl_ratio_sel vgh_ratio_sel[1:0] vgl_ratio_sel[1:0]
WriteData(0x3a);//35
WriteComm(0xc7);//mv_clk_sel[1:0] avdd_clk_sel[1:0] avcl_clk_sel[1:0]
WriteData(0x25); //2e
WriteComm(0xc8);// VGL_CLK_sel
WriteData(0x11);
WriteComm(0x6f);// user_gvdd
WriteData(0x2f);
WriteComm(0x78);// user_gvcl
WriteData(0x4b);
//WriteComm(0x7a);// user_vgsp
//WriteData(0x5f);
//test
WriteComm(0x7a);// user_vgsp
WriteData(0x49);
WriteComm(0xc9);
WriteData(0x00);
//gate_ed
WriteComm(0x51);//gate_st_o[7:0]
//WriteData(0x4b);
WriteData(0x20);
WriteComm(0x52);//gate_ed_o[7:0]
WriteData(0x7c);
WriteComm(0x53);//gate_st_e[7:0]
//WriteData(0x45);
WriteData(0x1c);
WriteComm(0x54);//gate_ed_e[7:0]
WriteData(0x77);
////sorce oldNVu NV3041A-01
WriteComm(0x46);//fsm_hbp_o[5:0]
WriteData(0x0a);
WriteComm(0x47);//fsm_hfp_o[5:0]
WriteData(0x2a);
WriteComm(0x48);//fsm_hbp_e[5:0]
WriteData(0x0a);
WriteComm(0x49);//fsm_hfp_e[5:0]
WriteData(0x1a);
WriteComm(0x56);//src_ld_wd[1:0] src_ld_st[5:0]
WriteData(0x43);
WriteComm(0x57);//pn_cs_en src_cs_st[5:0]
WriteData(0x42);
WriteComm(0x58);//src_cs_p_wd[6:0]
WriteData(0x3c);
WriteComm(0x59);//src_cs_n_wd[6:0]
WriteData(0x64);
WriteComm(0x5a);//src_pchg_st_o[6:0]
WriteData(0x41);
WriteComm(0x5b);//src_pchg_wd_o[6:0]
WriteData(0x3c);
WriteComm(0x5c);//src_pchg_st_e[6:0]
WriteData(0x02);
WriteComm(0x5d);//src_pchg_wd_e[6:0]
WriteData(0x3c);
WriteComm(0x5e);//src_pol_sw[7:0]
WriteData(0x1f);
WriteComm(0x60);//src_op_st_o[7:0]
WriteData(0x80);
WriteComm(0x61);//src_op_st_e[7:0]
WriteData(0x3f);
WriteComm(0x62);//src_op_ed_o[9:8] src_op_ed_e[9:8]
WriteData(0x21);
WriteComm(0x63);//src_op_ed_o[7:0]
WriteData(0x07);
WriteComm(0x64);//src_op_ed_e[7:0]
WriteData(0xe0);
WriteComm(0x65);//chopper
WriteData(0x01);//01-A2,02--A1NVu NV3041A-01
//WriteComm(0x67);
//WriteData(0x33);//01
WriteComm(0xca); //avdd_mux_st_o[7:0]
WriteData(0x20);
WriteComm(0xcb); //avdd_mux_ed_o[7:0]
WriteData(0x52);
WriteComm(0xcc); //avdd_mux_st_e[7:0]
WriteData(0x10);
WriteComm(0xcD); //avdd_mux_ed_e[7:0]
WriteData(0x42);
WriteComm(0xD0); //avcl_mux_st_o[7:0]
WriteData(0x20);
WriteComm(0xD1); //avcl_mux_ed_o[7:0]
WriteData(0x52);
WriteComm(0xD2); //avcl_mux_st_e[7:0]
WriteData(0x10);
WriteComm(0xD3); //avcl_mux_ed_e[7:0]
WriteData(0x42);
WriteComm(0xD4); //vgh_mux_st[7:0]
WriteData(0x0a);
WriteComm(0xD5); //vgh_mux_ed[7:0]
WriteData(0x32);
WriteComm(0xe5); //DVDD_TRIM
WriteData(0x05); //1.65 05
WriteComm(0xe6); //ESD_CTRL
WriteData(0x00);
WriteComm(0x6e); //LVD_en
WriteData(0x14);
//gammma 01
WriteComm(0x80); //gam_vrp0 63
WriteData(0x04);
WriteComm(0xA0); //gam_VRN0 63
WriteData(0x00);
WriteComm(0x81); //gam_vrp1 62
WriteData(0x07);
WriteComm(0xA1); //gam_VRN1 62-
WriteData(0x05);
WriteComm(0x82); //gam_vrp2 61
WriteData(0x06);
WriteComm(0xA2); //gam_VRN2 61-NVu NV3041A-01
WriteData(0x04);
WriteComm(0x83); //gam_vrp3 2
WriteData(0x39);
WriteComm(0xA3); //gam_VRN3 2-
WriteData(0x39);
WriteComm(0x84); //gam_vrp4 1
WriteData(0x3a);
WriteComm(0xA4); //gam_VRN4 1-
WriteData(0x3a);
WriteComm(0x85); //gam_vrp5 0
WriteData(0x3f); //2a~39-0.43
WriteComm(0xA5); //gam_VRN5 0-
WriteData(0x3f);
WriteComm(0x86); //gam_prp0 50
WriteData(0x2c); //33
WriteComm(0xA6); //gam_PRN0 50-
WriteData(0x2a); //2a
//WriteComm(0x87); //gam_prp1 14
//WriteData(0x46); //2d
//WriteComm(0xA7); //gam_PRN1 14-
//WriteData(0x44); //2d
WriteComm(0x87); //gam_prp1 14
WriteData(0x43); //2d
WriteComm(0xA7); //gam_PRN1 14-
WriteData(0x47); //2d
WriteComm(0x88); //gam_pkp0 59
WriteData(0x08); //0b
WriteComm(0xA8); //gam_PKN0 59-
WriteData(0x08); //0b
WriteComm(0x89); //gam_pkp1 57
WriteData(0x0f); //14
WriteComm(0xA9); //gam_PKN1 57-
WriteData(0x0f); //14
WriteComm(0x8a); //gam_pkp2 54
WriteData(0x17); //1a
WriteComm(0xAa); //gam_PKN2 54-
WriteData(0x17); //1a
WriteComm(0x8b); //gam_PKP3 44
WriteData(0x10);
WriteComm(0xAb); //gam_PKN3 44-
WriteData(0x10);
WriteComm(0x8c); //gam_PKP4 38
WriteData(0x16);
WriteComm(0xAc); //gam_PKN4 38-
WriteData(0x16);//NVu NV3041A-01
WriteComm(0x8d); //gam_PKP5 32
WriteData(0x14);
WriteComm(0xAd); //gam_PKN5 32-
WriteData(0x14);
WriteComm(0x8e); //gam_PKP6 26
WriteData(0x11); //16
WriteComm(0xAe); //gam_PKN6 26-
WriteData(0x11); //13
WriteComm(0x8f); //gam_PKP7 20
WriteData(0x14); //1c
WriteComm(0xAf); //gam_PKN7 20-
WriteData(0x14); //0a
WriteComm(0x90); //gam_PKP8 10
WriteData(0x06);
WriteComm(0xB0); //gam_PKN8 10-
WriteData(0x06);
WriteComm(0x91); //gam_PKP9 6
WriteData(0x0f);
WriteComm(0xB1); //gam_PKN9 6-
WriteData(0x0f);
WriteComm(0x92); //gam_PKP10 4
WriteData(0x16);
WriteComm(0xB2); //gam_PKN10 4-
WriteData(0x16);
WriteComm(0xff);
WriteData(0x00);
WriteComm(0x11);
WriteComm(0x36);
WriteData(0x00);
system_delay_us(120*1000);
WriteComm(0x29);
system_delay_us(20*1000);
#else
WriteComm(0xF7);
WriteData(0xA9);
WriteData(0x51);
WriteData(0X2C);
WriteData(0X82);
WriteComm(0xC0);
WriteData(0x0F);
WriteData(0x0f);
// VGH = 5VCI VGL = -3VCI
WriteComm(0xC1);
WriteData(0x47);
WriteComm(0xC5);
WriteData(0x00);
WriteData(0x4D);
WriteData(0x80);
WriteComm(0xB1);
WriteData(0xB0);
WriteData(0X11);
WriteComm(0xB1);
WriteData(0xA0);
WriteComm(0xB4);
WriteData(0x02);
WriteComm(0x36);
WriteData(0x28);
WriteComm(0x3A);
WriteData(0x55); //RGB565
WriteComm(0x20);
WriteData(0x00); //IPS
WriteComm(0xE9);
WriteData(0x00);
WriteComm(0xF7);
WriteData(0xA9);
WriteData(0x51);
WriteData(0x2C);
WriteData(0x82);
WriteComm(0xE0);
WriteData(0x00);
WriteData(0x07);
WriteData(0x0B);
WriteData(0x03);
WriteData(0x0F);
WriteData(0x05);
WriteData(0x30);
WriteData(0x56);
WriteData(0x47);
WriteData(0x04);
WriteData(0x0B);
WriteData(0x0A);
WriteData(0x2D);
WriteData(0x37);
WriteData(0x0F);
WriteComm(0xE1);
WriteData(0x00);
WriteData(0x0E);
WriteData(0x13);
WriteData(0x04);
WriteData(0x11);
WriteData(0x07);
WriteData(0x39);
WriteData(0x45);
WriteData(0x50);
WriteData(0x07);
WriteData(0x10);
WriteData(0x0D);
WriteData(0x32);
WriteData(0x36);
WriteData(0x0F);
WriteComm(0x11);
system_delay_us(120*1000);
// Delay(480);
WriteComm(0x29);
#endif
// LCD_READ_DATA(0x36);
// for(uint32_t i=0;i<pixel_size;i++)
// {
// color_buffer[i]=0xf800;
// }
// nv3041a_set_window(0,240-1,0,320-1);
// __PARALLEL_CS_SET(hparallel.PARALLELx);
// /* writer data */
// Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
// __PARALLEL_CS_RELEASE(hparallel.PARALLELx);
// system_delay_us(2000*1000);
#if 0
for(uint32_t i=0;i<pixel_size;i++)
{
color_buffer[i]=0xf800;
}
nv3041a_set_window(0,100-1,0,100-1);
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer data */
Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
system_delay_us(100);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
system_delay_us(1000*1000);
#if 0
extern uint32_t *user_get_display_framebuffer(void);
uint16_t *buf = (uint16_t*)user_get_display_framebuffer();
nv3041a_set_window(0,100-1,0,100-1);
for(uint32_t i=0;i<pixel_size;i++)
{
color_buffer[i]=0x001f;
}
nv3041a_display_dma(pixel_size,16,color_buffer);
system_delay_us(2000*1000);
uint16_t color_buf[16]={
0xf800,0x001f,0x01e0,0xffff,0x0fff,
};
static uint8_t index=0;
while(1)
{
for(uint32_t i=0;i<480*272;i++)
{
buf[i]=color_buf[index];
}
++index;
index%=4;
nv3041a_set_window(0,480-1,0,272-1);
nv3041a_display_dma((480*272),16,buf);
system_delay_us(2000*1000);
if(index==0)break;
}
for(uint32_t i=0;i<480*272;i++)
{
buf[i]=0xf800;
}
nv3041a_set_window(0,480-1,0,272-1);
nv3041a_display_dma((480*272),16,buf);
system_delay_us(2000*1000);
#endif
// LCD_Fill(0,0,240,320,0x001f);
// system_delay_us(2000*1000);
// LCD_Fill(0,0,240,320,0x01e0);
// system_delay_us(2000*1000);
// LCD_Fill(0,0,240,320,0xffff);
printf("LCD_Fill\r\n");
#endif
}

View File

@ -0,0 +1,14 @@
#ifndef __DRIVER_NV3041A_H
#define __DRIVER_NV3041A_H
#include <stdint.h>
void nv3041a_init(void);
void nv3041a_display_dma_isr(void);
void nv3041a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
void nv3041a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
void nv3041a_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
#endif // __DRIVER_SH8601A_H

View File

@ -0,0 +1,201 @@
/*
******************************************************************************
* @file RGB_demo.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2023
* @brief RGB interface module Demo.
******************************************************************************
* @attention
*
* Copyright (c) 2023 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "driver_nv3047_rgb.h"
#if (BOARD_SEL == BOARD_EVB_FR3092E_RGB)
static GPIO_InitTypeDef GPIO_Handle;
PARALLEL_HandTypeDef hparallel;
SPI_HandleTypeDef spi_handle;
DMA_HandleTypeDef dma_handle;
DMA_HandleTypeDef dma1_handle;
struct_RGB_TypeDef_t rgb_handle;
unsigned char *coply = NULL;
void timer0_irq(void);
/************************************************************************************
* @fn rgb_display_controller_init
*
* @brief rgb_display_controller_init
*
*/
void rgb_display_controller_init(void)
{
/* init parallel CLOCK */
__SYSTEM_PARALLEL_CLK_ENABLE();
__SYSTEM_PARALLEL_CLK_SELECT_SPLL();
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
__SYSTEM_DMA0_CLK_ENABLE();
__SYSTEM_DMA1_CLK_ENABLE();
__SYSTEM_TIMER0_CLK_ENABLE();
//__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
printf("parallel clock:%d\r\n", system_get_peripheral_clock( PER_CLK_PARALLEL));
/* RGB io init */
/*
D0~D15 PC0~15
DCLK PB13
*/
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_DATA_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DATA_PORT, &GPIO_Handle);
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_DCLK_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DCLK_PORT, &GPIO_Handle);
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_VSYNC_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_VSYNC_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_HSYNC_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_HSYNC_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_DE_EN_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_DE_EN_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_RESET_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_RESET_PORT, &GPIO_Handle);
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_13;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(GPIOD, &GPIO_Handle);
rgb_lcd_reset_release();
/* backlight */
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_BACKLIGHT_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_BACKLIGHT_PORT, &GPIO_Handle);
rgb_lcd_backlight_set();
rgb_lcd_disp_set();//Display control / standby mode selection. Internal pull low.DISP = “Low” : Standby.DISP = “High” : Normal display.
system_delay_us(1000 * 20);
#ifdef RGB56_LCD_INIT_CONFIG
/* SPI CS */
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = RGB565_LCD_SPI_CS_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_SPI_CS_PORT, &GPIO_Handle);
/* SPI io init */
// B0,B2 B3
GPIO_Handle.Alternate = GPIO_FUNCTION_7;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = RGB565_LCD_SPI_CLK_GPIO|RGB565_LCD_SPI_MOSI_GPIO|RGB565_LCD_SPI_MISO_GPIO;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(RGB565_LCD_SPI_CLK_PORT, &GPIO_Handle);
/* SPI init */
spi_handle.SPIx = SPIMX8_0;
spi_handle.Init.Work_Mode = SPI_WORK_MODE_3;
spi_handle.Init.Frame_Size = SPI_FRAME_SIZE_9BIT;
spi_handle.Init.BaudRate_Prescaler = 100;
spi_handle.Init.TxFIFOEmpty_Threshold = 0;
spi_handle.Init.RxFIFOFull_Threshold = 0;
spi_master_init(&spi_handle);
#endif
/* PARALLEL Init */
hparallel.PARALLELx = PARALLEL0;
hparallel.Init.DataBusSelect = DATA_BUS_16_BIT;
hparallel.Init.ParallelMode = MODE_6800;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 0;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 1;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 2;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 3;
hparallel.Init.ReadClock = WDCLK_DIV_4;
hparallel.Init.WriteClock = WDCLK_DIV_2;
parallel_init(&hparallel);
hparallel.PARALLELx->CRM.WR_L_LEN = 2;
hparallel.PARALLELx->CRM.WR_H_LEN = 2;
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* DMA Init */
system_dmac_request_id_config(PARALLEL_INTERFACE,DMA0_REQUEST_ID_3);
dma_handle.DMAx = DMA0;
dma_handle.Channel = DMA_Channel2;
dma_handle.Init.Data_Flow = DMA_M2P_DMAC;
dma_handle.Init.Request_ID = DMA0_REQUEST_ID_3;
dma_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
dma_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_1;
dma_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
dma_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16;
dma_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16;
dma_init(&dma_handle);
}
/************************************************************************************
* @fn rgb_display_init
*
* @brief rgb_display_init
*
*/
void rgb_display_init(void* buffer)
{
coply = buffer;
/* rgb init */
rgb_init();
NVIC_ClearPendingIRQ(TIMER0_IRQn);
NVIC_EnableIRQ(TIMER0_IRQn);
NVIC_ClearPendingIRQ(DMA0_IRQn);
NVIC_EnableIRQ(DMA0_IRQn);
rgb_display_start(Timer0, &rgb_handle, 2, coply);
printf("%s:%d\r\n", __func__, __LINE__);
}
void timer0_irq(void)
{
rgb_timer_IRQHandler(Timer0, &rgb_handle);
}
__RAM_CODE void rgb_display_dma_irq(void)
{
if (dma_get_tfr_Status(&dma_handle))
{
rgb_dma_IRQHandler(&rgb_handle);
dma_clear_tfr_Status(&dma_handle);
}
}
#endif

View File

@ -0,0 +1,91 @@
#ifndef __DRIVER_NV3047_RGB_H__
#define __DRIVER_NV3047_RGB_H__
#include "fr30xx.h"
#include "app_config.h"
#include "rgb565.h"
#define RGB_ROW 480
#define RGB_COLUMN 272
#define RGB565_LCD_DCLK_PORT GPIOB
#define RGB565_LCD_DCLK_GPIO GPIO_PIN_14
#define RGB565_LCD_VSYNC_PORT GPIOB
#define RGB565_LCD_VSYNC_GPIO GPIO_PIN_13
#define RGB565_LCD_HSYNC_PORT GPIOB
#define RGB565_LCD_HSYNC_GPIO GPIO_PIN_15
#define RGB565_LCD_DISP_PORT GPIOD
#define RGB565_LCD_DISP_GPIO GPIO_PIN_12
#define RGB565_LCD_DE_EN_PORT GPIOB
#define RGB565_LCD_DE_EN_GPIO GPIO_PIN_12
#define RGB565_LCD_DATA_PORT GPIOC
#define RGB565_LCD_DATA_GPIO 0xFFFF //GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
#define RGB565_LCD_RESET_PORT GPIOA
#define RGB565_LCD_RESET_GPIO GPIO_PIN_4
#define RGB565_LCD_BACKLIGHT_PORT GPIOA
#define RGB565_LCD_BACKLIGHT_GPIO GPIO_PIN_4
#define RGB565_LCD_SPI_SEL SPIM0
#ifdef RGB565_LCD_TE_EN
#define RGB565_LCD_TE_PORT GPIO_B
#define RGB565_LCD_TE_GPIO GPIO_PIN_7
#endif
//#define RGB56_LCD_INIT_CONFIG
#ifdef RGB56_LCD_INIT_CONFIG
#define RGB565_LCD_SPI_CS_PORT GPIOD
#define RGB565_LCD_SPI_CS_GPIO GPIO_PIN_12
#define RGB565_LCD_SPI_CLK_PORT GPIOB
#define RGB565_LCD_SPI_CLK_GPIO GPIO_PIN_0
#define RGB565_LCD_SPI_MOSI_PORT GPIOB
#define RGB565_LCD_SPI_MOSI_GPIO GPIO_PIN_2
#define RGB565_LCD_SPI_MISO_PORT GPIOB
#define RGB565_LCD_SPI_MISO_GPIO GPIO_PIN_3
#define rgb_spi_cs_set() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_SET)
#define rgb_spi_cs_release() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_CLEAR)
#endif
/* signal drive*/
#define rgb_lcd_enable_set() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_SET)
#define rgb_lcd_enable_release() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_vsync_set() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_SET)
#define rgb_lcd_vsync_release() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_hsync_set() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_SET)
#define rgb_lcd_hsync_release() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_reset_set() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_SET)
#define rgb_lcd_reset_release() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_disp_set() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_SET)
#define rgb_lcd_disp_release() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_backlight_set() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_SET)
#define rgb_lcd_backlight_release() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_CLEAR)
/* Exported functions --------------------------------------------------------*/
/* rgb_demo */
void rgb_display_init(void* buffer);
void rgb_display_controller_init(void);
__RAM_CODE void rgb_display_dma_irq(void);
#endif

View File

@ -0,0 +1,526 @@
#include "driver_display.h"
#include "driver_sh8601a.h"
#define SH8601A_MAX_PARA_COUNT (300)
#define SH8601A_QSPI_INST_CMD_WRITE (0x02)
#define SH8601A_QSPI_INST_CMD_READ (0x03)
#define SH8601A_QSPI_INST_1WIRE_PIXEL_WRITE (0x02)
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE1 (0x32)
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE2 (0x12)
#define SH8601A_QSPI_SEQ_FINISH_CODE (0x00)
typedef struct _SH8601A_CMD_DESC {
uint8_t instruction;
uint8_t index;
uint16_t delay;
uint16_t wordcount;
uint8_t payload[SH8601A_MAX_PARA_COUNT];
} SH8601A_CMD_DESC;
const SH8601A_CMD_DESC SH8601A_PRE_OTP_POWERON_SEQ_CMD[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xE4, 1, 1, {0x01}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x90, 1, 6, {0x33, 0x00, 0xC6, 0x01, 0xC6, 0x01}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x91, 1, 20, {0x65, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x11}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x92, 1, 20, {0x61, 0xE3, 0x00, 0xC5, 0x01, 0x00, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x22}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x93, 1, 20, {0x69, 0x00, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xC5, 0x01, 0xE2, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x33}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x94, 1, 20, {0x6D, 0xE3, 0x00, 0xC5, 0x01, 0xE3, 0x00, 0xC5, 0x01, 0xE3, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x33}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x9D, 1, 168, {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x06, 0x0C, 0x12, 0x18, 0x1E, 0x24, 0x2A, 0x30, 0x36, 0x3C, 0x42, 0x48, 0x4E, 0x54, 0x5A, 0x60, 0x09, 0x0D, 0x12, 0x16, 0x1B, 0x24, 0x2D, 0x36, 0x3F, 0x5A, 0x63, 0x6C, 0x75, 0x7E, 0x87, 0x90, 0x05, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x23, 0x28, 0x2D, 0x32, 0x37, 0x3C, 0x41, 0x46, 0x4B, 0x50, 0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78, 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x60, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x9E, 1, 12, {0x3B, 0x00, 0x71, 0x00, 0xA3, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0x00, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0xA7, 0x00, 0xA7, 0x00, 0x05, 0x00, 0x05, 0x00, 0xA7, 0x00, 0xA7, 0x00, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB2, 1, 68, {0x19, 0x14, 0x19, 0x14, 0x01, 0xEE, 0x02, 0x30, 0x02, 0xE4, 0x02, 0x3F, 0x02, 0x06, 0x76, 0x78, 0xE8, 0x04, 0x06, 0x00, 0x00, 0x31, 0x16, 0x15, 0x3D, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x10, 0xFF, 0xFF, 0xE0, 0xAA, 0xAA, 0xFF, 0xFF, 0x24, 0x14, 0x04, 0x14, 0x13, 0x14, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB3, 1, 44, {0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x1F, 0x02, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x12, 0x05, 0x00, 0x06, 0x13, 0x04, 0x00, 0x08, 0x15, 0x09, 0x00, 0x07}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x40, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x03, 0x47, 0x8B, 0x30, 0x74, 0xB8, 0x12, 0x56, 0x9A, 0x21, 0x65, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x9A, 0x21, 0x65, 0xA9, 0x03, 0x47, 0x8B, 0x30, 0x74, 0xB8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x52, 0x00, 0x21, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x40, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x52, 0x00, 0x21, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBB, 1, 19, {0x01, 0x02, 0x07, 0x01, 0x46, 0x46, 0x46, 0xD9, 0x00, 0xAA, 0x00, 0x7D, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBD, 1, 22, {0x01, 0x00, 0x00, 0x64, 0x00, 0x62, 0x00, 0x04, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x10, 0x16, 0x16, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBE, 1, 106, {0x4B, 0x00, 0x69, 0x00, 0x87, 0x00, 0xA5, 0x00, 0xC3, 0x00, 0xE1, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x64, 0x00, 0xAA, 0x00, 0x19, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x26, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0x1C, 0x00, 0x64, 0x00, 0x00, 0x00, 0x89, 0x00, 0xD0, 0x01, 0xD0, 0x01, 0x4B, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBF, 1, 35, {0x03, 0xF0, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC2, 1, 136, {0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x97, 0x00, 0x83, 0x00, 0xEE, 0x00, 0xA8, 0x00, 0x94, 0x00, 0x16, 0x01, 0xCF, 0x00, 0xBC, 0x00, 0x3B, 0x01, 0xF4, 0x00, 0xE1, 0x00, 0x61, 0x01, 0x12, 0x01, 0x08, 0x01, 0x94, 0x01, 0x46, 0x01, 0x41, 0x01, 0xB7, 0x01, 0x6D, 0x01, 0x6B, 0x01, 0xDE, 0x01, 0x93, 0x01, 0x9C, 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xBB, 0x01, 0x27, 0x02, 0xE1, 0x01, 0xFC, 0x01, 0x52, 0x02, 0x0F, 0x02, 0x34, 0x02, 0x77, 0x02, 0x36, 0x02, 0x65, 0x02, 0xBE, 0x02, 0x7C, 0x02, 0xB9, 0x02, 0xFA, 0x02, 0xBA, 0x02, 0x08, 0x03, 0x31, 0x03, 0xF4, 0x02, 0x4F, 0x03, 0x63, 0x03, 0x29, 0x03, 0x8C, 0x03, 0x9E, 0x03, 0x5F, 0x03, 0xD1, 0x03, 0xFD, 0x03, 0xBC, 0x03, 0x4A, 0x04, 0x6E, 0x04, 0x28, 0x04, 0xC4, 0x04, 0xD1, 0x04, 0x91, 0x04, 0x49, 0x05, 0x3D, 0x05, 0xF1, 0x04, 0xC1, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC3, 1, 136, {0x00, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x97, 0x00, 0x83, 0x00, 0xEE, 0x00, 0xA8, 0x00, 0x94, 0x00, 0x16, 0x01, 0xCF, 0x00, 0xBC, 0x00, 0x3B, 0x01, 0xF4, 0x00, 0xE1, 0x00, 0x61, 0x01, 0x12, 0x01, 0x08, 0x01, 0x94, 0x01, 0x46, 0x01, 0x41, 0x01, 0xB7, 0x01, 0x6D, 0x01, 0x6B, 0x01, 0xDE, 0x01, 0x93, 0x01, 0x9C, 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xBB, 0x01, 0x27, 0x02, 0xE1, 0x01, 0xFC, 0x01, 0x52, 0x02, 0x0F, 0x02, 0x34, 0x02, 0x77, 0x02, 0x36, 0x02, 0x65, 0x02, 0xBE, 0x02, 0x7C, 0x02, 0xB9, 0x02, 0xFA, 0x02, 0xBA, 0x02, 0x08, 0x03, 0x31, 0x03, 0xF4, 0x02, 0x4F, 0x03, 0x63, 0x03, 0x29, 0x03, 0x8C, 0x03, 0x9E, 0x03, 0x5F, 0x03, 0xD1, 0x03, 0xFD, 0x03, 0xBC, 0x03, 0x4A, 0x04, 0x6E, 0x04, 0x28, 0x04, 0xC4, 0x04, 0xD1, 0x04, 0x91, 0x04, 0x49, 0x05, 0x3D, 0x05, 0xF1, 0x04, 0xC1, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC5, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x37, 0x00, 0x32, 0x00, 0x24, 0x01, 0xBD, 0x00, 0xAC, 0x00, 0x3D, 0x01, 0xD6, 0x00, 0xC5, 0x00, 0x50, 0x01, 0xE9, 0x00, 0xD8, 0x00, 0x66, 0x01, 0xFF, 0x00, 0xEE, 0x00, 0x95, 0x01, 0x2E, 0x01, 0x1E, 0x01, 0xB8, 0x01, 0x50, 0x01, 0x44, 0x01, 0xDB, 0x01, 0x73, 0x01, 0x68, 0x01, 0xF5, 0x01, 0x8E, 0x01, 0x84, 0x01, 0x21, 0x02, 0xBE, 0x01, 0xBA, 0x01, 0x4B, 0x02, 0xEB, 0x01, 0xEE, 0x01, 0x6B, 0x02, 0x0E, 0x02, 0x18, 0x02, 0xA9, 0x02, 0x51, 0x02, 0x6C, 0x02, 0xE2, 0x02, 0x8B, 0x02, 0xB2, 0x02, 0x0B, 0x03, 0xB7, 0x02, 0xE7, 0x02, 0x34, 0x03, 0xE5, 0x02, 0x1F, 0x03, 0x57, 0x03, 0x0A, 0x03, 0x4B, 0x03, 0xA3, 0x03, 0x52, 0x03, 0xA9, 0x03, 0xEB, 0x03, 0x9A, 0x03, 0x00, 0x04, 0x2F, 0x04, 0xDC, 0x03, 0x5A, 0x04, 0x64, 0x04, 0x14, 0x04, 0x9E, 0x04}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC6, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x4D, 0x00, 0x46, 0x00, 0x28, 0x01, 0xC1, 0x00, 0xB0, 0x00, 0x42, 0x01, 0xDB, 0x00, 0xCA, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x77, 0x01, 0x10, 0x01, 0xFF, 0x00, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xCE, 0x01, 0x67, 0x01, 0x5B, 0x01, 0xF1, 0x01, 0x8A, 0x01, 0x80, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x3D, 0x02, 0xDD, 0x01, 0xDD, 0x01, 0x66, 0x02, 0x08, 0x02, 0x11, 0x02, 0x8C, 0x02, 0x33, 0x02, 0x45, 0x02, 0xD0, 0x02, 0x79, 0x02, 0x9D, 0x02, 0x04, 0x03, 0xB0, 0x02, 0xDE, 0x02, 0x33, 0x03, 0xE5, 0x02, 0x1F, 0x03, 0x5D, 0x03, 0x11, 0x03, 0x53, 0x03, 0x89, 0x03, 0x3C, 0x03, 0x8A, 0x03, 0xDE, 0x03, 0x8D, 0x03, 0xF1, 0x03, 0x2F, 0x04, 0xDC, 0x03, 0x59, 0x04, 0x6F, 0x04, 0x20, 0x04, 0xAC, 0x04, 0xB3, 0x04, 0x64, 0x04, 0xFF, 0x04}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC7, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x63, 0x00, 0x5A, 0x00, 0x2C, 0x01, 0xC5, 0x00, 0xB4, 0x00, 0x48, 0x01, 0xE1, 0x00, 0xD0, 0x00, 0x65, 0x01, 0xFE, 0x00, 0xED, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xB5, 0x01, 0x4E, 0x01, 0x41, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x01, 0x02, 0x9B, 0x01, 0x93, 0x01, 0x1D, 0x02, 0xBA, 0x01, 0xB6, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x7C, 0x02, 0x21, 0x02, 0x2F, 0x02, 0xA4, 0x02, 0x4C, 0x02, 0x65, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC1, 0x02, 0x20, 0x03, 0xCE, 0x02, 0x04, 0x03, 0x51, 0x03, 0x04, 0x03, 0x44, 0x03, 0x83, 0x03, 0x36, 0x03, 0x82, 0x03, 0xB5, 0x03, 0x62, 0x03, 0xBF, 0x03, 0x0F, 0x04, 0xBD, 0x03, 0x2F, 0x04, 0x5C, 0x04, 0x0C, 0x04, 0x94, 0x04, 0xAB, 0x04, 0x5C, 0x04, 0xF5, 0x04, 0xFA, 0x04, 0xA8, 0x04, 0x50, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC8, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x2F, 0x01, 0xC8, 0x00, 0xB7, 0x00, 0x4D, 0x01, 0xE6, 0x00, 0xD5, 0x00, 0x6D, 0x01, 0x06, 0x01, 0xF5, 0x00, 0x8F, 0x01, 0x28, 0x01, 0x18, 0x01, 0xC1, 0x01, 0x5A, 0x01, 0x4E, 0x01, 0xEF, 0x01, 0x87, 0x01, 0x7D, 0x01, 0x0F, 0x02, 0xAB, 0x01, 0xA4, 0x01, 0x2F, 0x02, 0xCD, 0x01, 0xCB, 0x01, 0x63, 0x02, 0x04, 0x02, 0x0D, 0x02, 0x91, 0x02, 0x38, 0x02, 0x4A, 0x02, 0xBC, 0x02, 0x65, 0x02, 0x86, 0x02, 0x01, 0x03, 0xAC, 0x02, 0xD9, 0x02, 0x39, 0x03, 0xEA, 0x02, 0x25, 0x03, 0x6E, 0x03, 0x23, 0x03, 0x69, 0x03, 0xA4, 0x03, 0x53, 0x03, 0xAA, 0x03, 0xD7, 0x03, 0x85, 0x03, 0xE8, 0x03, 0x37, 0x04, 0xE5, 0x03, 0x64, 0x04, 0x8A, 0x04, 0x3C, 0x04, 0xCF, 0x04, 0xE0, 0x04, 0x8F, 0x04, 0x32, 0x05, 0x30, 0x05, 0xDF, 0x04, 0x92, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC9, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x8F, 0x00, 0x82, 0x00, 0x33, 0x01, 0xCC, 0x00, 0xBB, 0x00, 0x52, 0x01, 0xEB, 0x00, 0xDA, 0x00, 0x76, 0x01, 0x0F, 0x01, 0xFE, 0x00, 0x98, 0x01, 0x31, 0x01, 0x22, 0x01, 0xCD, 0x01, 0x65, 0x01, 0x5A, 0x01, 0xF8, 0x01, 0x92, 0x01, 0x89, 0x01, 0x1B, 0x02, 0xB8, 0x01, 0xB2, 0x01, 0x3C, 0x02, 0xDB, 0x01, 0xDC, 0x01, 0x70, 0x02, 0x14, 0x02, 0x1F, 0x02, 0xA1, 0x02, 0x49, 0x02, 0x60, 0x02, 0xCF, 0x02, 0x78, 0x02, 0x9C, 0x02, 0x11, 0x03, 0xBE, 0x02, 0xF0, 0x02, 0x4D, 0x03, 0xFF, 0x02, 0x3E, 0x03, 0x87, 0x03, 0x3A, 0x03, 0x87, 0x03, 0xC1, 0x03, 0x6E, 0x03, 0xCD, 0x03, 0xF7, 0x03, 0xA6, 0x03, 0x10, 0x04, 0x56, 0x04, 0x05, 0x04, 0x8B, 0x04, 0xB2, 0x04, 0x63, 0x04, 0xFD, 0x04, 0x10, 0x05, 0xBE, 0x04, 0x6A, 0x05, 0x64, 0x05, 0x14, 0x05, 0xD2, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCA, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA5, 0x00, 0x96, 0x00, 0x36, 0x01, 0xCF, 0x00, 0xBE, 0x00, 0x57, 0x01, 0xF0, 0x00, 0xDF, 0x00, 0x7E, 0x01, 0x17, 0x01, 0x06, 0x01, 0xA0, 0x01, 0x39, 0x01, 0x2B, 0x01, 0xD9, 0x01, 0x71, 0x01, 0x66, 0x01, 0x02, 0x02, 0x9C, 0x01, 0x94, 0x01, 0x26, 0x02, 0xC4, 0x01, 0xC1, 0x01, 0x49, 0x02, 0xE8, 0x01, 0xEB, 0x01, 0x7E, 0x02, 0x23, 0x02, 0x32, 0x02, 0xB1, 0x02, 0x59, 0x02, 0x76, 0x02, 0xDF, 0x02, 0x88, 0x02, 0xAF, 0x02, 0x22, 0x03, 0xD1, 0x02, 0x07, 0x03, 0x60, 0x03, 0x14, 0x03, 0x57, 0x03, 0x9F, 0x03, 0x4E, 0x03, 0xA4, 0x03, 0xDA, 0x03, 0x88, 0x03, 0xEC, 0x03, 0x13, 0x04, 0xC1, 0x03, 0x34, 0x04, 0x74, 0x04, 0x25, 0x04, 0xB3, 0x04, 0xD8, 0x04, 0x87, 0x04, 0x29, 0x05, 0x37, 0x05, 0xE7, 0x04, 0x9B, 0x05, 0x95, 0x05, 0x41, 0x05, 0x0B, 0x06}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCB, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0xBB, 0x00, 0xAA, 0x00, 0x3A, 0x01, 0xD3, 0x00, 0xC2, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCF, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x8C, 0x02, 0x33, 0x02, 0x44, 0x02, 0xC1, 0x02, 0x6A, 0x02, 0x8C, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC2, 0x02, 0x33, 0x03, 0xE4, 0x02, 0x1E, 0x03, 0x74, 0x03, 0x29, 0x03, 0x70, 0x03, 0xB6, 0x03, 0x63, 0x03, 0xC0, 0x03, 0xF3, 0x03, 0xA2, 0x03, 0x0A, 0x04, 0x2E, 0x04, 0xDB, 0x03, 0x58, 0x04, 0x93, 0x04, 0x45, 0x04, 0xDA, 0x04, 0xFE, 0x04, 0xAC, 0x04, 0x54, 0x05, 0x5F, 0x05, 0x0F, 0x05, 0xCC, 0x05, 0xC5, 0x05, 0x6E, 0x05, 0x43, 0x06}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCC, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x49, 0x00, 0x43, 0x00, 0x27, 0x01, 0xC0, 0x00, 0xAF, 0x00, 0x42, 0x01, 0xDB, 0x00, 0xCA, 0x00, 0x5A, 0x01, 0xF3, 0x00, 0xE2, 0x00, 0x74, 0x01, 0x0D, 0x01, 0xFC, 0x00, 0xA6, 0x01, 0x3F, 0x01, 0x32, 0x01, 0xCA, 0x01, 0x63, 0x01, 0x57, 0x01, 0xEE, 0x01, 0x87, 0x01, 0x7D, 0x01, 0x08, 0x02, 0xA3, 0x01, 0x9C, 0x01, 0x39, 0x02, 0xD9, 0x01, 0xD8, 0x01, 0x62, 0x02, 0x03, 0x02, 0x0C, 0x02, 0x87, 0x02, 0x2D, 0x02, 0x3D, 0x02, 0xCB, 0x02, 0x74, 0x02, 0x97, 0x02, 0x00, 0x03, 0xAB, 0x02, 0xD8, 0x02, 0x2D, 0x03, 0xDD, 0x02, 0x16, 0x03, 0x56, 0x03, 0x09, 0x03, 0x4A, 0x03, 0x82, 0x03, 0x35, 0x03, 0x81, 0x03, 0xD5, 0x03, 0x83, 0x03, 0xE6, 0x03, 0x24, 0x04, 0xD1, 0x03, 0x4B, 0x04, 0x65, 0x04, 0x14, 0x04, 0x9E, 0x04, 0xA7, 0x04, 0x58, 0x04, 0xF1, 0x04}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCD, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x7D, 0x00, 0x71, 0x00, 0x30, 0x01, 0xC9, 0x00, 0xB8, 0x00, 0x4E, 0x01, 0xE7, 0x00, 0xD6, 0x00, 0x6F, 0x01, 0x08, 0x01, 0xF7, 0x00, 0x91, 0x01, 0x2A, 0x01, 0x1A, 0x01, 0xC3, 0x01, 0x5C, 0x01, 0x50, 0x01, 0xF0, 0x01, 0x89, 0x01, 0x7F, 0x01, 0x11, 0x02, 0xAD, 0x01, 0xA7, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCE, 0x01, 0x65, 0x02, 0x07, 0x02, 0x10, 0x02, 0x93, 0x02, 0x3B, 0x02, 0x4E, 0x02, 0xC0, 0x02, 0x69, 0x02, 0x8B, 0x02, 0x03, 0x03, 0xAF, 0x02, 0xDD, 0x02, 0x3C, 0x03, 0xEE, 0x02, 0x2A, 0x03, 0x73, 0x03, 0x28, 0x03, 0x6F, 0x03, 0xA9, 0x03, 0x58, 0x03, 0xB0, 0x03, 0xDD, 0x03, 0x8B, 0x03, 0xEF, 0x03, 0x3C, 0x04, 0xEA, 0x03, 0x6A, 0x04, 0x92, 0x04, 0x44, 0x04, 0xD9, 0x04, 0xE9, 0x04, 0x98, 0x04, 0x3C, 0x05, 0x39, 0x05, 0xE8, 0x04, 0x9D, 0x05}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCE, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0xBB, 0x00, 0xAA, 0x00, 0x3A, 0x01, 0xD3, 0x00, 0xC2, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCF, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x8C, 0x02, 0x33, 0x02, 0x44, 0x02, 0xC1, 0x02, 0x6A, 0x02, 0x8C, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC2, 0x02, 0x33, 0x03, 0xE4, 0x02, 0x1E, 0x03, 0x74, 0x03, 0x29, 0x03, 0x70, 0x03, 0xB6, 0x03, 0x63, 0x03, 0xC0, 0x03, 0xF3, 0x03, 0xA2, 0x03, 0x0A, 0x04, 0x2E, 0x04, 0xDB, 0x03, 0x58, 0x04, 0x93, 0x04, 0x45, 0x04, 0xDA, 0x04, 0xFE, 0x04, 0xAC, 0x04, 0x54, 0x05, 0x5F, 0x05, 0x0F, 0x05, 0xCC, 0x05, 0xC5, 0x05, 0x6E, 0x05, 0x43, 0x06}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD3, 1, 11, {0x11, 0xC6, 0x01, 0xC6, 0x01, 0x08, 0x08, 0x14, 0x14, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD4, 1, 54, {0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD5, 1, 54, {0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD6, 1, 54, {0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD7, 1, 54, {0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xDF, 1, 19, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xEE, 1, 44, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF0, 1, 24, {0x10, 0x79, 0x77, 0x22, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x11, 0x38, 0xAA, 0x20, 0x20, 0x2A, 0x22, 0x2A, 0xCA, 0x88, 0x10, 0x10, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF1, 1, 25, {0x10, 0x09, 0x03, 0x00, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x00, 0x30, 0xAA, 0x20, 0x20, 0x2F, 0x23, 0x2F, 0x22, 0x2E, 0xCF, 0x88, 0x10, 0x10}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF1, 1, 25, {0x10, 0x09, 0x03, 0x00, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x11, 0x30, 0xAA, 0x10, 0x10, 0x26, 0x20, 0x25, 0x12, 0x16, 0xC5, 0x88, 0x10, 0x01}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF2, 1, 34, {0xFF, 0x53, 0x00, 0x11, 0x19, 0x0A, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x01, 0x01, 0xFF, 0x53, 0x10, 0x11, 0x19, 0x0A, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x01, 0x01, 0x01}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF3, 1, 36, {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF4, 1, 21, {0x99, 0x99, 0x99, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x94, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF5, 1, 21, {0x66, 0x66, 0x56, 0x55, 0x45, 0x44, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x62, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF8, 1, 16, {0x03, 0x22, 0x22, 0x77, 0x37, 0x00, 0x10, 0x10, 0x26, 0x20, 0x25, 0x12, 0x14, 0x05, 0x66, 0x66}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xD1}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 50, 1, {0x84}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x3A, 1, 1, {0x05}}, // 16bits pixel
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x81}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
const SH8601A_CMD_DESC SH8601A_POST_OTP_POWERON_SEQ_CMD[] = {
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0xC0, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x02, 0x46, 0x8A, 0x13, 0x57, 0x9B, 0x31, 0x75, 0xB9, 0x20, 0x64, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x64, 0xA8, 0x31, 0x75, 0xB9, 0x13, 0x57, 0x9B, 0x02, 0x46, 0x8A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xB0, 1, 1, {0x16}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 9, {0x01, 0x05, 0x00, 0xA2, 0x00, 0xA7, 0x00, 0xA7, 0x00}}, // 0x01=45Hz, 0x00=60Hz
//{SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
const SH8601A_CMD_DESC SH8601A_POWEROFF_SEQ_CMD[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0x28, 25, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x10, 50, 0, {0}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
const SH8601A_CMD_DESC SH8601A_OTP_WRITE[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 1000, 2, {0x01}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 10, 2, {0x00}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
static DMA_LLI_InitTypeDef *Link_Channel = (void *)0x1fffe000;
static void write_cmd(uint8_t cmd)
{
uint8_t spi_data[4];
spi_data[0] = SH8601A_QSPI_INST_CMD_WRITE;
spi_data[1] = 0x00;
spi_data[2] = cmd;
spi_data[3] = 0x00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
__DISPLAY_CS_SET();
}
static void write_buff(uint8_t *buffer, uint8_t len)
{
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)buffer, len);
__DISPLAY_CS_SET();
}
static void read_reg(uint8_t reg, uint8_t *buffer, uint16_t len)
{
uint8_t spi_data[4];
spi_data[0] = SH8601A_QSPI_INST_CMD_READ;
spi_data[1] = 0x00;
spi_data[2] = reg;
spi_data[3] = 0x00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
spi_master_receive_X1(&spi_display_handle, buffer, len);
__DISPLAY_CS_SET();
}
static void SH8601A_Reg_Write(const SH8601A_CMD_DESC* cmd)
{
uint16_t idx = 0;
while (cmd[idx].instruction != SH8601A_QSPI_SEQ_FINISH_CODE)
{
uint8_t sdat[cmd[idx].wordcount + 4];
sdat[0] = cmd[idx].instruction;
sdat[1] = 0;
sdat[2] = cmd[idx].index; // Set in the middle 8 bits ADDR[15:8] of the 24 bits ADDR[23:0]
sdat[3] = 0;
for(uint16_t i=0; i<cmd[idx].wordcount; i++)
{
sdat[i+4] = cmd[idx].payload[i];
}
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
__DISPLAY_CS_SET();
if (cmd[idx].delay != 0)
{
__DISPLAY_DELAY_MS(cmd[idx].delay);
}
idx++;
}
}
static void SH8601A_Init_Pre_OTP(void)
{
//pull low RESX
//power on VBAT: VBAT = 3.7V
//power on VDDI: VDDI = 1.8V
//pull high VCI_EN: enable VCI = 3.3V
//delay 10ms
//pull high RESX: IC reset
//delay 10ms
SH8601A_Reg_Write(SH8601A_PRE_OTP_POWERON_SEQ_CMD);
}
static void SH8601A_Init_Post_OTP(void)
{
//pull low RESX
//power on VBAT: VBAT = 3.7V
//power on VDDI: VDDI = 1.8V
//pull high VCI_EN: enable VCI = 3.3V
//delay 10ms
//pull high RESX: IC reset
//delay 10ms
SH8601A_Reg_Write(SH8601A_POST_OTP_POWERON_SEQ_CMD);
}
static void SH8601A_Power_Off(void)
{
SH8601A_Reg_Write(SH8601A_POWEROFF_SEQ_CMD);
//delay 100ms
//pull low RESX
//delay 10ms
//pull low VCI_EN: disable VCI
//power off VDDI
//power off VBAT
}
static void SH8601A_OTP_Write(void)
{
/*********************************************
* Register read:
* Index: 0xCF (OTP_STATUS)
* Para: 1 Byte read
* Check BANK_CHECK_MCS[1:0]:
* - 00h: No writen, 3 times writable
* - 01h: 1 time written, 2 times writable
* - 02h: 2 times written, 1 time writable
* - 03h: 3 time written, no longer be written
**********************************************/
//power on VOTP: VOTP = 6V external supply
//delay 20ms
SH8601A_Reg_Write(SH8601A_OTP_WRITE);
//power off VOTP
//delay 20ms
/*********************************************
* OTP status verification:
* Index: 0xCF (OTP_STATUS)
* Para: 3 Bytes read
* Check PRG_ERR_1:
* - 0: OK
* - 1: FAIL
OTP rewrite(power off -> power on -> rewrite)
* Check PRG_ERR_0:
* - 0: OK
* - 1: FAIL
Not rewrite OTP
**********************************************/
/* Go to power off sequence */
}
static void sh8601a_read_regs(void)
{
uint8_t buffer[6];
read_reg(0x90, buffer, 6);
read_reg(0x2A, buffer, 4);
read_reg(0x2B, buffer, 4);
}
void sh8601a_init(void)
{
__DISPLAY_VCI_CLEAR();
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(20);
__DISPLAY_VCI_SET();
__DISPLAY_DELAY_MS(40);
__DISPLAY_RESET_SET();
__DISPLAY_DELAY_MS(80);
SH8601A_Init_Pre_OTP();
}
void sh8601a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
uint8_t data[8];
data[0] = 0x02;
data[1] = 0x00;
data[2] = 0x2A;
data[3] = 0x00;
data[4] = x_s >> 8;
data[5] = x_s & 0xff;
data[6] = x_e >> 8;
data[7] = x_e & 0xff;
write_buff(data, 8);
data[0] = 0x02;
data[1] = 0x00;
data[2] = 0x2B;
data[3] = 0x00;
data[4] = y_s >> 8;
data[5] = y_s & 0xff;
data[6] = y_e >> 8;
data[7] = y_e & 0xff;
write_buff(data, 8);
// write_cmd(0x2c);
}
void sh8601a_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t frame_size;
if (pixel_width == 16) {
frame_size = SPI_FRAME_SIZE_16BIT;
}
else if (pixel_width == 32) {
frame_size = SPI_FRAME_SIZE_24BIT;
}
spi_display_handle.Init.Frame_Size = frame_size;
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
__DISPLAY_CS_SET();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
}
void sh8601a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
//#define USE_DMA_LINK_MODE
uint8_t spi_trans_width;
uint32_t dma_sample_count;
#ifdef USE_DMA_LINK_MODE
#define DMA_SINGLE_TRANSFER_SIZE 20000
uint32_t link_count;
uint32_t i;
uint32_t link_trans_size;
dma_LinkParameter_t LinkParameter;
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
dma_sample_count = pixel_count * pixel_width / 32;
link_trans_size = 4 * DMA_SINGLE_TRANSFER_SIZE;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
link_trans_size = 2 * DMA_SINGLE_TRANSFER_SIZE;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
link_trans_size = DMA_SINGLE_TRANSFER_SIZE;
break;
default:
return;
}
link_count = dma_sample_count / DMA_SINGLE_TRANSFER_SIZE;
if(dma_sample_count % DMA_SINGLE_TRANSFER_SIZE)
{
link_count++;
}
for (i = 0; i < link_count; i++)
{
uint8_t all_set = (dma_sample_count <= DMA_SINGLE_TRANSFER_SIZE);
LinkParameter.SrcAddr = (uint32_t)data + i * link_trans_size;
LinkParameter.DstAddr = (uint32_t)&spi_display_handle.SPIx->DR;
if(all_set)
{
LinkParameter.NextLink = 0;
}
else
{
LinkParameter.NextLink = (uint32_t)&Link_Channel[i + 1];
}
LinkParameter.Data_Flow = dma_display_handle.Init.Data_Flow;
LinkParameter.Request_ID = dma_display_handle.Init.Request_ID;
LinkParameter.Source_Master_Sel = dma_display_handle.Init.Source_Master_Sel;
LinkParameter.Desination_Master_Sel = dma_display_handle.Init.Desination_Master_Sel;
LinkParameter.Source_Inc = dma_display_handle.Init.Source_Inc;
LinkParameter.Desination_Inc = dma_display_handle.Init.Desination_Inc;
LinkParameter.Source_Width = dma_display_handle.Init.Source_Width;
LinkParameter.Desination_Width = dma_display_handle.Init.Desination_Width;
LinkParameter.Source_Burst_Len = dma_display_handle.Init.Source_Burst_Len;
LinkParameter.Desination_Burst_Len = dma_display_handle.Init.Desination_Burst_Len;
LinkParameter.Size = all_set ? dma_sample_count : DMA_SINGLE_TRANSFER_SIZE;
LinkParameter.gather_enable = 0;
LinkParameter.scatter_enable = 0;
dma_sample_count -= DMA_SINGLE_TRANSFER_SIZE;
dma_linked_list_init(&Link_Channel[i], &LinkParameter);
}
#else
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
dma_sample_count = pixel_count * pixel_width / 32;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
break;
default:
return;
}
#endif
switch (dma_display_handle.Init.Desination_Width) {
case DMA_TRANSFER_WIDTH_32:
spi_trans_width = SPI_FRAME_SIZE_32BIT;
break;
case DMA_TRANSFER_WIDTH_16:
spi_trans_width = SPI_FRAME_SIZE_16BIT;
break;
case DMA_TRANSFER_WIDTH_8:
spi_trans_width = SPI_FRAME_SIZE_8BIT;
break;
default:
return;
}
spi_display_handle.Init.Frame_Size = spi_trans_width;
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_ENABLE(spi_display_handle.SPIx);
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
if (spi_trans_width == SPI_FRAME_SIZE_32BIT) {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
}
else {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
}
__SPI_ENABLE(spi_display_handle.SPIx);
#ifndef USE_DMA_LINK_MODE
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
#else
dma_linked_list_start_IT(Link_Channel, &LinkParameter, &dma_display_handle);
#endif
}
void sh8601a_display_dma_isr(void)
{
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
// CS Release
__DISPLAY_CS_SET();
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
}

View File

@ -0,0 +1,16 @@
#ifndef __DRIVER_SH8601A_H
#define __DRIVER_SH8601A_H
#include <stdint.h>
void sh8601a_init(void);
void sh8601a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
void sh8601a_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
void sh8601a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
void sh8601a_display_dma_isr(void);
#endif // __DRIVER_SH8601A_H

View File

@ -0,0 +1,501 @@
#include "driver_display.h"
#include "driver_sh8601z.h"
#define SH8601A_MAX_PARA_COUNT (300)
#define SH8601A_QSPI_INST_CMD_WRITE (0x02)
#define SH8601A_QSPI_INST_CMD_READ (0x03)
#define SH8601A_QSPI_INST_1WIRE_PIXEL_WRITE (0x02)
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE1 (0x32)
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE2 (0x12)
#define SH8601A_QSPI_SEQ_FINISH_CODE (0x00)
typedef struct _SH8601A_CMD_DESC {
uint8_t instruction;
uint8_t index;
uint16_t delay;
uint16_t wordcount;
uint8_t payload[SH8601A_MAX_PARA_COUNT];
} SH8601A_CMD_DESC;
static const SH8601A_CMD_DESC SH8601A_PRE_OTP_POWERON_SEQ_CMD[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0x6F}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xBF}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xBF}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x3A, 1, 1, {0x05}}, // 16bits pixel
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 25, 1, {0x20}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
static const SH8601A_CMD_DESC SH8601A_POST_OTP_POWERON_SEQ_CMD[] = {
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0xC0, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x02, 0x46, 0x8A, 0x13, 0x57, 0x9B, 0x31, 0x75, 0xB9, 0x20, 0x64, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x64, 0xA8, 0x31, 0x75, 0xB9, 0x13, 0x57, 0x9B, 0x02, 0x46, 0x8A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xB0, 1, 1, {0x16}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 9, {0x01, 0x05, 0x00, 0xA2, 0x00, 0xA7, 0x00, 0xA7, 0x00}}, // 0x01=45Hz, 0x00=60Hz
//{SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
//{SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
static const SH8601A_CMD_DESC SH8601A_POWEROFF_SEQ_CMD[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0x28, 15, 0, {0}},
{SH8601A_QSPI_INST_CMD_WRITE, 0x10, 0, 0, {0}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
static const SH8601A_CMD_DESC SH8601A_OTP_WRITE[] = {
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 1000, 2, {0x01}},
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 10, 2, {0x00}},
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
};
#ifdef USE_DMA_LINK_MODE
static DMA_LLI_InitTypeDef *Link_Channel = (void *)0x1fffe000;
#endif
static void write_cmd(uint8_t cmd)
{
uint8_t spi_data[4];
spi_data[0] = SH8601A_QSPI_INST_CMD_WRITE;
spi_data[1] = 0x00;
spi_data[2] = cmd;
spi_data[3] = 0x00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
__DISPLAY_CS_SET();
}
static void write_buff(uint8_t *buffer, uint8_t len)
{
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)buffer, len);
__DISPLAY_CS_SET();
}
static void read_reg(uint8_t reg, uint8_t *buffer, uint16_t len)
{
uint8_t spi_data[4];
spi_data[0] = SH8601A_QSPI_INST_CMD_READ;
spi_data[1] = 0x00;
spi_data[2] = reg;
spi_data[3] = 0x00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
spi_master_receive_X1(&spi_display_handle, buffer, len);
__DISPLAY_CS_SET();
}
static void SH8601A_Reg_Write(const SH8601A_CMD_DESC* cmd)
{
uint16_t idx = 0;
while (cmd[idx].instruction != SH8601A_QSPI_SEQ_FINISH_CODE)
{
uint8_t sdat[cmd[idx].wordcount + 4];
sdat[0] = cmd[idx].instruction;
sdat[1] = 0;
sdat[2] = cmd[idx].index; // Set in the middle 8 bits ADDR[15:8] of the 24 bits ADDR[23:0]
sdat[3] = 0;
for(uint16_t i=0; i<cmd[idx].wordcount; i++)
{
sdat[i+4] = cmd[idx].payload[i];
}
__DISPLAY_CS_CLEAR();
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
__DISPLAY_CS_SET();
if (cmd[idx].delay != 0)
{
__DISPLAY_DELAY_MS(cmd[idx].delay);
}
idx++;
}
}
static void SH8601A_Init_Pre_OTP(void)
{
//pull low RESX
//power on VBAT: VBAT = 3.7V
//power on VDDI: VDDI = 1.8V
//pull high VCI_EN: enable VCI = 3.3V
//delay 10ms
//pull high RESX: IC reset
//delay 10ms
SH8601A_Reg_Write(SH8601A_PRE_OTP_POWERON_SEQ_CMD);
}
static void SH8601A_Init_Post_OTP(void)
{
//pull low RESX
//power on VBAT: VBAT = 3.7V
//power on VDDI: VDDI = 1.8V
//pull high VCI_EN: enable VCI = 3.3V
//delay 10ms
//pull high RESX: IC reset
//delay 10ms
SH8601A_Reg_Write(SH8601A_POST_OTP_POWERON_SEQ_CMD);
}
static void SH8601A_Power_Off(void)
{
SH8601A_Reg_Write(SH8601A_POWEROFF_SEQ_CMD);
//delay 100ms
//pull low RESX
//delay 10ms
//pull low VCI_EN: disable VCI
//power off VDDI
//power off VBAT
}
static void SH8601A_OTP_Write(void)
{
/*********************************************
* Register read:
* Index: 0xCF (OTP_STATUS)
* Para: 1 Byte read
* Check BANK_CHECK_MCS[1:0]:
* - 00h: No writen, 3 times writable
* - 01h: 1 time written, 2 times writable
* - 02h: 2 times written, 1 time writable
* - 03h: 3 time written, no longer be written
**********************************************/
//power on VOTP: VOTP = 6V external supply
//delay 20ms
SH8601A_Reg_Write(SH8601A_OTP_WRITE);
//power off VOTP
//delay 20ms
/*********************************************
* OTP status verification:
* Index: 0xCF (OTP_STATUS)
* Para: 3 Bytes read
* Check PRG_ERR_1:
* - 0: OK
* - 1: FAIL
OTP rewrite(power off -> power on -> rewrite)
* Check PRG_ERR_0:
* - 0: OK
* - 1: FAIL
Not rewrite OTP
**********************************************/
/* Go to power off sequence */
}
static void sh8601a_read_regs(void)
{
uint8_t buffer[6];
read_reg(0x90, buffer, 6);
read_reg(0x2A, buffer, 4);
read_reg(0x2B, buffer, 4);
}
void sh8601z_init(void)
{
__DISPLAY_VCI_CLEAR();
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(10);
__DISPLAY_VCI_SET();
__DISPLAY_DELAY_MS(10);
__DISPLAY_RESET_SET();
__DISPLAY_DELAY_MS(10);
SH8601A_Init_Pre_OTP();
}
void sh8601z_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
uint8_t data[8];
x_s += 16;
x_e += 16;
data[0] = 0x02;
data[1] = 0x00;
data[2] = 0x2A;
data[3] = 0x00;
data[4] = x_s >> 8;
data[5] = x_s & 0xff;
data[6] = x_e >> 8;
data[7] = x_e & 0xff;
write_buff(data, 8);
data[0] = 0x02;
data[1] = 0x00;
data[2] = 0x2B;
data[3] = 0x00;
data[4] = y_s >> 8;
data[5] = y_s & 0xff;
data[6] = y_e >> 8;
data[7] = y_e & 0xff;
write_buff(data, 8);
// write_cmd(0x2c);
}
void sh8601z_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t frame_size;
if (pixel_width == 16) {
frame_size = SPI_FRAME_SIZE_16BIT;
}
else if (pixel_width == 32) {
frame_size = SPI_FRAME_SIZE_24BIT;
}
spi_display_handle.Init.Frame_Size = frame_size;
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
__DISPLAY_CS_SET();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
}
void sh8601z_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
//#define USE_DMA_LINK_MODE
uint8_t spi_trans_width;
uint32_t dma_sample_count;
#ifdef USE_DMA_LINK_MODE
#define DMA_SINGLE_TRANSFER_SIZE 20000
uint32_t link_count;
uint32_t i;
uint32_t link_trans_size;
dma_LinkParameter_t LinkParameter;
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
dma_sample_count = pixel_count * pixel_width / 32;
link_trans_size = 4 * DMA_SINGLE_TRANSFER_SIZE;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
link_trans_size = 2 * DMA_SINGLE_TRANSFER_SIZE;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
link_trans_size = DMA_SINGLE_TRANSFER_SIZE;
break;
default:
return;
}
link_count = dma_sample_count / DMA_SINGLE_TRANSFER_SIZE;
if(dma_sample_count % DMA_SINGLE_TRANSFER_SIZE)
{
link_count++;
}
for (i = 0; i < link_count; i++)
{
uint8_t all_set = (dma_sample_count <= DMA_SINGLE_TRANSFER_SIZE);
LinkParameter.SrcAddr = (uint32_t)data + i * link_trans_size;
LinkParameter.DstAddr = (uint32_t)&spi_display_handle.SPIx->DR;
if(all_set)
{
LinkParameter.NextLink = 0;
}
else
{
LinkParameter.NextLink = (uint32_t)&Link_Channel[i + 1];
}
LinkParameter.Data_Flow = dma_display_handle.Init.Data_Flow;
LinkParameter.Request_ID = dma_display_handle.Init.Request_ID;
LinkParameter.Source_Master_Sel = dma_display_handle.Init.Source_Master_Sel;
LinkParameter.Desination_Master_Sel = dma_display_handle.Init.Desination_Master_Sel;
LinkParameter.Source_Inc = dma_display_handle.Init.Source_Inc;
LinkParameter.Desination_Inc = dma_display_handle.Init.Desination_Inc;
LinkParameter.Source_Width = dma_display_handle.Init.Source_Width;
LinkParameter.Desination_Width = dma_display_handle.Init.Desination_Width;
LinkParameter.Source_Burst_Len = dma_display_handle.Init.Source_Burst_Len;
LinkParameter.Desination_Burst_Len = dma_display_handle.Init.Desination_Burst_Len;
LinkParameter.Size = all_set ? dma_sample_count : DMA_SINGLE_TRANSFER_SIZE;
LinkParameter.gather_enable = 0;
LinkParameter.scatter_enable = 0;
dma_sample_count -= DMA_SINGLE_TRANSFER_SIZE;
dma_linked_list_init(&Link_Channel[i], &LinkParameter);
}
#else
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
dma_sample_count = pixel_count * pixel_width / 32;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
break;
default:
return;
}
#endif
switch (dma_display_handle.Init.Desination_Width) {
case DMA_TRANSFER_WIDTH_32:
spi_trans_width = SPI_FRAME_SIZE_32BIT;
break;
case DMA_TRANSFER_WIDTH_16:
spi_trans_width = SPI_FRAME_SIZE_16BIT;
break;
case DMA_TRANSFER_WIDTH_8:
spi_trans_width = SPI_FRAME_SIZE_8BIT;
break;
default:
return;
}
spi_display_handle.Init.Frame_Size = spi_trans_width;
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
spi_display_handle.MultWireParam.Instruct = 0x32;
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_display_handle.MultWireParam.Address = 0x002C00;
__DISPLAY_CS_CLEAR();
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_ENABLE(spi_display_handle.SPIx);
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
if (spi_trans_width == SPI_FRAME_SIZE_32BIT) {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
}
else {
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
}
__SPI_ENABLE(spi_display_handle.SPIx);
#ifndef USE_DMA_LINK_MODE
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
#else
dma_linked_list_start_IT(Link_Channel, &LinkParameter, &dma_display_handle);
#endif
}
void sh8601z_power_off(void)
{
SH8601A_Power_Off();
__DISPLAY_DELAY_MS(100);
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(10);
__DISPLAY_VCI_CLEAR();
}
void sh8601z_power_on(void)
{
__DISPLAY_VCI_CLEAR();
__DISPLAY_RESET_CLEAR();
__DISPLAY_DELAY_MS(10);
__DISPLAY_VCI_SET();
__DISPLAY_DELAY_MS(10);
__DISPLAY_RESET_SET();
__DISPLAY_DELAY_MS(10);
SH8601A_Init_Pre_OTP();
}
void sh8601z_display_dma_isr(void)
{
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
// CS Release
__DISPLAY_CS_SET();
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
}

View File

@ -0,0 +1,20 @@
#ifndef __DRIVER_SH8601A_H
#define __DRIVER_SH8601A_H
#include <stdint.h>
void sh8601z_init(void);
void sh8601z_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
void sh8601z_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
void sh8601z_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
void sh8601z_power_off(void);
void sh8601z_power_on(void);
void sh8601z_display_dma_isr(void);
#endif // __DRIVER_SH8601A_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,139 @@
#ifndef __DRIVER_ST7701_RGB_H__
#define __DRIVER_ST7701_RGB_H__
#include "fr30xx.h"
#include "app_config.h"
#define RGB_ROW 480
#define RGB_COLUMN 480
/* Exported functions --------------------------------------------------------*/
typedef struct
{
uint32_t VerticalSignalCount;
unsigned char *rgb_TxData;
}struct_RGB_TypeDef_t;
#define RGB565_LCD_DCLK_PORT GPIOB
#define RGB565_LCD_DCLK_GPIO GPIO_PIN_13
#define RGB565_LCD_VSYNC_PORT GPIOB
#define RGB565_LCD_VSYNC_GPIO GPIO_PIN_14
#define RGB565_LCD_HSYNC_PORT GPIOB
#define RGB565_LCD_HSYNC_GPIO GPIO_PIN_15
#define RGB565_LCD_DISP_PORT GPIOA
#define RGB565_LCD_DISP_GPIO GPIO_PIN_6
#define RGB565_LCD_DE_EN_PORT GPIOB
#define RGB565_LCD_DE_EN_GPIO GPIO_PIN_12
#define RGB565_LCD_DATA_PORT GPIOC
#define RGB565_LCD_DATA_GPIO 0xFFFF //GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
#define RGB565_LCD_RESET_PORT GPIOD
#define RGB565_LCD_RESET_GPIO GPIO_PIN_13
#define RGB565_LCD_BACKLIGHT_PORT GPIOA
#define RGB565_LCD_BACKLIGHT_GPIO GPIO_PIN_6
#ifdef RGB565_LCD_TE_EN
#define RGB565_LCD_TE_PORT GPIO_B
#define RGB565_LCD_TE_GPIO GPIO_PIN_7
#endif
#define RGB56_LCD_INIT_CONFIG
#ifdef RGB56_LCD_INIT_CONFIG
#define RGB565_LCD_SPI_CS_PORT GPIOD
#define RGB565_LCD_SPI_CS_GPIO GPIO_PIN_12
#define RGB565_LCD_SPI_CLK_PORT GPIOB
#define RGB565_LCD_SPI_CLK_GPIO GPIO_PIN_0
#define RGB565_LCD_SPI_MOSI_PORT GPIOB
#define RGB565_LCD_SPI_MOSI_GPIO GPIO_PIN_2
#define RGB565_LCD_SPI_MISO_PORT GPIOB
#define RGB565_LCD_SPI_MISO_GPIO GPIO_PIN_3
#define RGB565_LCD_SPI_SEL SPIM0
#define rgb_spi_cs_set() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_CLEAR)
#define rgb_spi_cs_release() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_SET)
#endif
/* signal drive*/
#define rgb_lcd_enable_set() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_SET)
#define rgb_lcd_enable_release() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_vsync_set() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_SET)
#define rgb_lcd_vsync_release() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_hsync_set() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_SET)
#define rgb_lcd_hsync_release() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_reset_set() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_SET)
#define rgb_lcd_reset_release() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_disp_set() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_SET)
#define rgb_lcd_disp_release() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_CLEAR)
#define rgb_lcd_backlight_set() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_SET)
#define rgb_lcd_backlight_release() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_CLEAR)
#define __RGB_LCD_DENABLE_SET rgb_lcd_enable_release
#define __RGB_LCD_DENABLE_RELEASE rgb_lcd_enable_set
#define __RGB_LCD_VSYNC_SET rgb_lcd_vsync_set
#define __RGB_LCD_VSYNC__RELEASE rgb_lcd_vsync_release
#define __RGB_LCD_HSYNC_SET rgb_lcd_hsync_set
#define __RGB_LCD_HSYNC__RELEASE rgb_lcd_hsync_release
#define __RGB_LCD_RESET_SET rgb_lcd_reset_set
#define __RGB_LCD_RESET_RELEASE rgb_lcd_reset_release
#define __RGB_SPI_CS_RELEASE rgb_spi_cs_release
#define __RGB_SPI_CS_SET rgb_spi_cs_set
#define __8080_DATA_WR_LEN(__LEVEL__) __PARALLEL_SET_WR_LEN(hparallel.PARALLELx,__LEVEL__)
#define __8080_TXFIFO_EMPTY() __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY
#define __8080_WRITE_BLANK() hparallel.PARALLELx->TX_FIFO = 0
#define __TIMER_CLEAR_IQR(__TIMERx__) timer_int_clear(__TIMERx__)
#define __TIMER_INIT(__TIMERx__, __LoadCount__) timer_init(__TIMERx__, (24000 * __LoadCount__))
#define __TIMER_INT_ENABLE(__TIMERx__) timer_int_enable(__TIMERx__)
#define __TIMER_START(__TIMERx__) timer_start(__TIMERx__)
#define __DMA_GET_TFR_STATUS() dma_get_tfr_Status(&dma_handle)
#define __DMA_CLEAR_TFR_STATUS() dma_clear_tfr_Status(&dma_handle)
#define __DMA_TO_8080_START_IT(__BUFFER__,__SIZE__) dma_start_IT(&dma_handle, (uint32_t)__BUFFER__, (uint32_t)&hparallel.PARALLELx->TX_FIFO, __SIZE__)
#define __SPI_WRITE_DATA(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_handle, (void *)__BUFFER__, __SIZE__)
/* Exported functions --------------------------------------------------------*/
/* rgb_display_start */
/* rgb_timer_IRQHandler */
/* rgb_dma_IRQHandler */
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata);
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb);
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb);
void st7701_init(void* buffer);
void st7701_rgb_display_dma_irq(void);
__RAM_CODE void rgb_display_dma_irq(void);
#endif

View File

@ -0,0 +1,350 @@
/*
******************************************************************************
* @file driver_flash.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2021
* @brief Internal XIP Flash module driver.
* This file provides firmware functions to manage the internal
* stacked xip flash
******************************************************************************
* @attention
*
* Copyright (c) 2022 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "fr30xx.h"
#include "driver_psram.h"
#include "co_util.h"
#define PSRAM_ENABLE_Q_MODE 1
#define PSRAM_LATENCY_CFG 3
#define PSRAM_HIGH_SPEED 1
#define PSRAM_OSPI_IF OSPI
#define PSRAM_READ_IDENTIFICATION 0x9F
#define PSRAM_READ_OPCODE 0x03
#define PSRAM_FAST_READ_OPCODE 0x0B
#define PSRAM_FAST_QUAL_READ_OPCODE 0xEB
#define PSRAM_PAGE_PROGRAM_OPCODE 0x02
#define PSRAM_PAGE_QUAL_PROGRAM_OPCODE 0x38
#define PSRAM_ENTER_QUAD_MODE_OPCODE 0x35
#define PSRAM_EXIT_QUAD_MODE_OPCODE 0xF5
#define PSRAM_RESET_ENABLE_OPCODE 0x66
#define PSRAM_RESET_OPCODE 0x99
static const struct qspi_stig_reg_t psram_read_ctrl_cmd = {
.enable_bank = 0,
.dummy_cycles = PSRAM_LATENCY_CFG-1,
.write_bytes = 0,
.enable_write = 0,
.addr_bytes = QSPI_STIG_ADDR_BYTES_4,
.enable_mode = 0,
.enable_cmd_addr = 1,
.read_bytes = 2,
.enable_read = 1,
.opcode = 0x40,
};
static const struct qspi_stig_reg_t psram_write_ctrl_cmd = {
.enable_bank = 0,
.dummy_cycles = 0,
.write_bytes = 2,
.enable_write = 1,
.addr_bytes = QSPI_STIG_ADDR_BYTES_4,
.enable_mode = 0,
.enable_cmd_addr = 1,
.read_bytes = 0,
.enable_read = 0,
.opcode = 0xC0,
};
static const struct qspi_stig_reg_t psram_read_id_cmd = {
.enable_bank = 0,
.dummy_cycles = 0,
.write_bytes = 0,
.enable_write = 0,
.addr_bytes = 0,
.enable_mode = 0,
.enable_cmd_addr = 0,
.read_bytes = 3,
.enable_read = 1,
.opcode = PSRAM_READ_IDENTIFICATION,
};
static const struct qspi_stig_reg_t enter_quad_mode_cmd = {
.enable_bank = 0,
.dummy_cycles = 0,
.write_bytes = 0,
.enable_write = 0,
.addr_bytes = 0,
.enable_mode = 0,
.enable_cmd_addr = 0,
.read_bytes = 0,
.enable_read = 0,
.opcode = PSRAM_ENTER_QUAD_MODE_OPCODE,
};
static const struct qspi_stig_reg_t reset_enable_cmd = {
.enable_bank = 0,
.dummy_cycles = 0,
.write_bytes = 0,
.enable_write = 0,
.addr_bytes = 0,
.enable_mode = 0,
.enable_cmd_addr = 0,
.read_bytes = 0,
.enable_read = 0,
.opcode = PSRAM_RESET_ENABLE_OPCODE,
};
static const struct qspi_stig_reg_t reset_cmd = {
.enable_bank = 0,
.dummy_cycles = 0,
.write_bytes = 0,
.enable_write = 0,
.addr_bytes = 0,
.enable_mode = 0,
.enable_cmd_addr = 0,
.read_bytes = 0,
.enable_read = 0,
.opcode = PSRAM_RESET_OPCODE,
};
static uint8_t psram_read_mode(uint8_t mode)
{
uint8_t result[2];
__QSPI_CMD_ADDRESS_SET(PSRAM_OSPI_IF, mode);
qspi_stig_cmd(PSRAM_OSPI_IF, psram_read_ctrl_cmd, QSPI_STIG_CMD_READ, 2, result);
return result[0];
}
static void psram_write_mode(uint8_t mode, uint8_t data)
{
uint8_t buffer[2];
buffer[0] = data;
buffer[1] = data;
__QSPI_CMD_ADDRESS_SET(PSRAM_OSPI_IF, mode);
qspi_stig_cmd(PSRAM_OSPI_IF, psram_write_ctrl_cmd, QSPI_STIG_CMD_WRITE, 2, buffer);
}
#if 0
static void psram_controller_init(uint16_t page_boundary)
{
while(__QSPI_IS_BUSY(PSRAM_OSPI_IF));
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, 0x20);
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, (PSRAM_LATENCY_CFG<<1)-1);
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, 0xA0);
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, PSRAM_LATENCY_CFG-1);
__QSPI_WRITE_WEL_DISABLE(PSRAM_OSPI_IF);
__QSPI_POLL_DISABLE(PSRAM_OSPI_IF);
//init configuration register
__QSPI_CFG_CPOL_SET(PSRAM_OSPI_IF, 0);
__QSPI_CFG_CPHA_SET(PSRAM_OSPI_IF, 0);
__QSPI_CFG_DAC_ENABLE(PSRAM_OSPI_IF);
__QSPI_CFG_LEGACY_DISABLE(PSRAM_OSPI_IF);
__QSPI_CFG_REMAP_ENABLE(PSRAM_OSPI_IF);
#if PSRAM_HIGH_SPEED
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_6);
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
#else
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_16);
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
#endif
// __QSPI_CFG_AHB_DECODER_ENABLE(PSRAM_OSPI_IF);
__QSPI_READ_CAPTURE_LP_CLK_EN(PSRAM_OSPI_IF);
__QSPI_DELAY_CS_START_SET(PSRAM_OSPI_IF, 2);
__QSPI_DELAY_CS_END_SET(PSRAM_OSPI_IF, 2);
__QSPI_DELAY_CS_DESSERT_SET(PSRAM_OSPI_IF, 2);
__QSPI_DEVICE_PAGE_SIZE_SET(PSRAM_OSPI_IF, page_boundary);
// __QSPI_DEVICE_CS0_SIZE_SET(PSRAM_OSPI_IF, 3); // 4Gb space
__QSPI_CS_CTRL_RD_BRK_ENABLE(PSRAM_OSPI_IF);
__QSPI_CS_CTRL_DIS_CS_AFT_FIRST_BYTE_SET(PSRAM_OSPI_IF);
__QSPI_CS_PAGE_BOUNDARY_SET(PSRAM_OSPI_IF, page_boundary);
__QSPI_CS_PAGE_BOUNDARY_PROTECT_ENABLE(PSRAM_OSPI_IF);
// __QSPI_REMAP_ADDRESS_SET(PSRAM_OSPI_IF, PSRAM_DAC_BASE);
__QSPI_DEVICE_ADDR_BYTES_SET(PSRAM_OSPI_IF, QSPI_DEVICE_ADDR_BYTES_4);
__QSPI_CFG_DTR_ENABLE(PSRAM_OSPI_IF);
__QSPI_CFG_OCTAL_XCCELA_ENABLE(PSRAM_OSPI_IF);
__QSPI_ENABLE(PSRAM_OSPI_IF);
}
void psram_init(void)
{
// uint8_t mode[7];
uint8_t value;
#if PSRAM_HIGH_SPEED
psram_controller_init(0x0040);
#else
psram_controller_init(0x0008);
#endif
value = (1<<5) | ((PSRAM_LATENCY_CFG-3)<<2) | (0<<0);
psram_write_mode(0x00, value);
#if PSRAM_LATENCY_CFG == 3
value = (0<<5);
#elif PSRAM_LATENCY_CFG == 4
value = (4<<5);
#elif PSRAM_LATENCY_CFG == 5
value = (2<<5);
#elif PSRAM_LATENCY_CFG == 6
value = (6<<5);
#elif PSRAM_LATENCY_CFG == 7
value = (1<<5);
#else
#error "UNACCEPTABLE configure"
#endif
printf("write 0x%02x to mode reg4.\r\n", value);
psram_write_mode(0x04, value);
co_delay_100us(1);
// mode[0] = psram_read_mode(0x00);
// printf("mode 0: 0x%02x\r\n", mode[0]);
// mode[1] = psram_read_mode(0x01);
// printf("mode 1: 0x%02x\r\n", mode[1]);
// mode[2] = psram_read_mode(0x02);
// printf("mode 2: 0x%02x\r\n", mode[2]);
// mode[3] = psram_read_mode(0x03);
// printf("mode 3: 0x%02x\r\n", mode[3]);
// mode[4] = psram_read_mode(0x04);
// printf("mode 4: 0x%02x\r\n", mode[4]);
// mode[5] = psram_read_mode(0x06);
// printf("mode 6: 0x%02x\r\n", mode[5]);
// mode[6] = psram_read_mode(0x08);
// printf("mode 8: 0x%02x\r\n", mode[6]);
}
#else
static void psram_enter_quad(void)
{
qspi_stig_cmd(PSRAM_OSPI_IF, enter_quad_mode_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
}
static void psram_controller_init(uint16_t page_boundary)
{
while(__QSPI_IS_BUSY(PSRAM_OSPI_IF));
#if PSRAM_ENABLE_Q_MODE == 1
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_FAST_READ_OPCODE);
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 4);
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_PAGE_QUAL_PROGRAM_OPCODE);
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 0);
#else
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_FAST_QUAL_READ_OPCODE);
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_STAND);
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 6);
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_PAGE_QUAL_PROGRAM_OPCODE);
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 0);
#endif
//init configuration register
__QSPI_CFG_CPOL_SET(PSRAM_OSPI_IF, 0);
__QSPI_CFG_CPHA_SET(PSRAM_OSPI_IF, 0);
__QSPI_CFG_DAC_ENABLE(PSRAM_OSPI_IF);
__QSPI_CFG_LEGACY_DISABLE(PSRAM_OSPI_IF);
__QSPI_CFG_REMAP_ENABLE(PSRAM_OSPI_IF);
#if PSRAM_HIGH_SPEED
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_2);
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 4);
#else
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_8);
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
#endif
// __QSPI_CFG_AHB_DECODER_ENABLE(PSRAM_OSPI_IF);
__QSPI_WRITE_WEL_DISABLE(PSRAM_OSPI_IF);
__QSPI_POLL_DISABLE(PSRAM_OSPI_IF);
__QSPI_READ_CAPTURE_LP_CLK_EN(PSRAM_OSPI_IF);
__QSPI_DELAY_CS_START_SET(PSRAM_OSPI_IF, 2);
__QSPI_DELAY_CS_END_SET(PSRAM_OSPI_IF, 2);
__QSPI_DELAY_CS_DESSERT_SET(PSRAM_OSPI_IF, 2);
__QSPI_DEVICE_PAGE_SIZE_SET(PSRAM_OSPI_IF, page_boundary);
// __QSPI_DEVICE_CS0_SIZE_SET(PSRAM_OSPI_IF, 3); // 4Gb space
__QSPI_CS_CTRL_RD_BRK_ENABLE(PSRAM_OSPI_IF);
__QSPI_CS_CTRL_DIS_CS_AFT_FIRST_BYTE_SET(PSRAM_OSPI_IF);
__QSPI_CS_PAGE_BOUNDARY_SET(PSRAM_OSPI_IF, page_boundary);
__QSPI_CS_PAGE_BOUNDARY_PROTECT_ENABLE(PSRAM_OSPI_IF);
__QSPI_REMAP_ADDRESS_SET(PSRAM_OSPI_IF, PSRAM_DAC_BASE);
__QSPI_CFG_OCTAL_OPI_DISABLE(PSRAM_OSPI_IF);
__QSPI_CFG_OCTAL_XCCELA_DISABLE(PSRAM_OSPI_IF);
__QSPI_ENABLE(PSRAM_OSPI_IF);
}
void psram_init(bool reset)
{
if (reset) {
qspi_stig_cmd(PSRAM_OSPI_IF, reset_enable_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
// co_delay_10us(1000);
qspi_stig_cmd(PSRAM_OSPI_IF, reset_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
// co_delay_10us(1000);
#if PSRAM_ENABLE_Q_MODE == 1
psram_enter_quad();
// co_delay_10us(1000);
#endif // PSRAM_ENABLE_Q_MODE == 1
}
#if PSRAM_HIGH_SPEED
psram_controller_init(0x0040);
#else
psram_controller_init(0x0010);
#endif
}
uint32_t psram_read_id(void)
{
uint32_t psram_id;
qspi_stig_cmd(PSRAM_OSPI_IF, psram_read_id_cmd, QSPI_STIG_CMD_READ, 3, (uint8_t *)&psram_id);
return (psram_id&0xffffff);
}
#endif

View File

@ -0,0 +1,40 @@
/*
******************************************************************************
* @file driver_psram.h
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2022
* @brief Header file of PSRAM module.
******************************************************************************
* @attention
*
* Copyright (c) 2022 FreqChip.
* All rights reserved.
******************************************************************************
*/
#ifndef __DRIVER_PSRAM_H__
#define __DRIVER_PSRAM_H__
#include "fr30xx.h"
/*
* @brief PSRAM Init structure definition
*/
typedef struct
{
uint32_t Reserve; /*!< reserve */
} PSRAM_InitTypeDef;
/* ################################ Initialization、Config Section END ################################## */
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
void psram_init(bool reset);
uint32_t psram_read_id(void);
#endif // __DRIVER_PSRAM_H__

View File

@ -0,0 +1,463 @@
/*
******************************************************************************
* @file rgb565.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2023
* @brief rgb565 IC driver.
* This file provides firmware functions to manage the following
* functionalities of the 8080 SPI Timer and DMA norflash driver for rgb565.
* @ Initialization and de-initialization functions
* @ IO operation functions
* @ Peripheral Control functions
******************************************************************************
* @attention
*
* Copyright (c) 2023 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "rgb565.h"
#include "app_config.h"
#if BOARD_SEL == BOARD_EVB_FR3092E_RGB
#ifdef RGB56_LCD_INIT_CONFIG
static void rgb_reg_writer(uint16_t *fp_data, uint32_t size)
{
__RGB_SPI_CS_SET();
/* fp_Data[0] stores command, while others store data
Bit8 set to 1 as data, otherwise it is a command
*/
for(int i = 1; i < size; i++)
{
fp_data[i] = fp_data[i] + 0x100;
}
__SPI_WRITE_DATA(fp_data,size);
__RGB_SPI_CS_RELEASE();
}
#endif
static void rgb_idle_clock(uint32_t count)
{
/* 8080 hits idle Clocks */
__8080_DATA_WR_LEN(count);
for(int i = 0; i < count/2; i++)
__8080_WRITE_BLANK();
}
static void Line_porch_set(uint32_t count)
{
for(int i = 0; i < count; i++)
{
__RGB_LCD_HSYNC__RELEASE();
//__RGB_LCD_DENABLE_RELEASE();
__RGB_LCD_DENABLE_SET();
rgb_idle_clock(4);
__RGB_LCD_HSYNC_SET();
rgb_idle_clock(RGB_ROW);
}
}
static void Vertical_back_porch_set(void)
{
__RGB_LCD_HSYNC__RELEASE();
__RGB_LCD_DENABLE_SET();
rgb_idle_clock(4);
__RGB_LCD_HSYNC_SET();
rgb_idle_clock(4);
while(!(__8080_TXFIFO_EMPTY()));
}
static void Vertical_front_porch_set(void)
{
__RGB_LCD_HSYNC_SET();
__RGB_LCD_DENABLE_SET();
rgb_idle_clock(4);
while(!(__8080_TXFIFO_EMPTY()));
}
void rgb_init(void)
{
uint16_t WBuffer[20];
__RGB_LCD_RESET_RELEASE();
system_delay_us(50 * 1000);
__RGB_LCD_RESET_SET();
system_delay_us(1000 * 120);
#ifdef RGB56_LCD_INIT_CONFIG
WBuffer[0] = 0xFF;
WBuffer[1] = 0x77;
WBuffer[2] = 0x01;
WBuffer[3] = 0x00;
WBuffer[4] = 0x00;
WBuffer[5] = 0x10;
rgb_reg_writer(WBuffer, 6);
WBuffer[0] = 0xC0;
WBuffer[1] = 0x3B;
WBuffer[2] = 0x00;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xC1;
WBuffer[1] = 0x10;
WBuffer[2] = 0x0C;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xC2;
WBuffer[1] = 0x21;
WBuffer[2] = 0x0A;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xB0;
WBuffer[1] = 0x40;
WBuffer[2] = 0x09;
WBuffer[3] = 0x4F;
WBuffer[4] = 0x0B;
WBuffer[5] = 0x10;
WBuffer[6] = 0x07;
WBuffer[7] = 0x00;
WBuffer[8] = 0x08;
WBuffer[9] = 0x06;
WBuffer[10] = 0x20;
WBuffer[11] = 0x02;
WBuffer[12] = 0x12;
WBuffer[13] = 0x0F;
WBuffer[14] = 0x67;
WBuffer[15] = 0x2E;
WBuffer[16] = 0xDF;
rgb_reg_writer(WBuffer, 17);
WBuffer[0] = 0xB1;
WBuffer[1] = 0x4F;
WBuffer[2] = 0x18;
WBuffer[3] = 0x60;
WBuffer[4] = 0x0E;
WBuffer[5] = 0x10;
WBuffer[6] = 0x04;
WBuffer[7] = 0x0C;
WBuffer[8] = 0x08;
WBuffer[9] = 0x09;
WBuffer[10] = 0x26;
WBuffer[11] = 0x07;
WBuffer[12] = 0x13;
WBuffer[13] = 0x11;
WBuffer[14] = 0x71;
WBuffer[15] = 0x39;
WBuffer[16] = 0xDF;
rgb_reg_writer(WBuffer, 17);
WBuffer[0] = 0xFF;
WBuffer[1] = 0x77;
WBuffer[2] = 0x01;
WBuffer[3] = 0x00;
WBuffer[4] = 0x00;
WBuffer[5] = 0x11;
rgb_reg_writer(WBuffer, 6);
WBuffer[0] = 0xB0;
WBuffer[1] = 0x4D;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB1;
WBuffer[1] = 0x41;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB2;
WBuffer[1] = 0x87;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB3;
WBuffer[1] = 0x80;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB5;
WBuffer[1] = 0x49;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB7;
WBuffer[1] = 0x87;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xB8;
WBuffer[1] = 0x23;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xC0;
WBuffer[1] = 0x07;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xC1;
WBuffer[1] = 0x78;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xC2;
WBuffer[1] = 0x78;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0xD0;
WBuffer[1] = 0x88;
rgb_reg_writer(WBuffer, 2);
system_delay_us(100 * 1000);
WBuffer[0] = 0xE0;
WBuffer[1] = 0x00;
WBuffer[2] = 0x00;
WBuffer[3] = 0x00;
WBuffer[4] = 0x00;
rgb_reg_writer(WBuffer, 5);
WBuffer[0] = 0xE1;
WBuffer[1] = 0x04;
WBuffer[2] = 0xA0;
WBuffer[3] = 0x06;
WBuffer[4] = 0xA0;
WBuffer[5] = 0x05;
WBuffer[6] = 0xA0;
WBuffer[7] = 0x07;
WBuffer[8] = 0xA0;
WBuffer[9] = 0x00;
WBuffer[10] = 0x44;
WBuffer[11] = 0x44;
rgb_reg_writer(WBuffer, 12);
WBuffer[0] = 0xE2;
WBuffer[1] = 0x11;
WBuffer[2] = 0x11;
WBuffer[3] = 0x44;
WBuffer[4] = 0x44;
WBuffer[5] = 0xE9;
WBuffer[6] = 0xA0;
WBuffer[7] = 0xEB;
WBuffer[8] = 0xA0;
WBuffer[9] = 0xEA;
WBuffer[10] = 0xA0;
WBuffer[11] = 0xEC;
WBuffer[12] = 0xA0;
WBuffer[13] = 0x00;
rgb_reg_writer(WBuffer, 14);
WBuffer[0] = 0xE3;
WBuffer[1] = 0x00;
WBuffer[2] = 0x00;
WBuffer[3] = 0x11;
WBuffer[4] = 0x11;
rgb_reg_writer(WBuffer, 5);
WBuffer[0] = 0xE4;
WBuffer[1] = 0x44;
WBuffer[2] = 0x44;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xE5;
WBuffer[1] = 0x06;
WBuffer[2] = 0xEA;
WBuffer[3] = 0xA0;
WBuffer[4] = 0xA0;
WBuffer[5] = 0x08;
WBuffer[6] = 0xEC;
WBuffer[7] = 0xA0;
WBuffer[8] = 0xA0;
WBuffer[9] = 0x0A;
WBuffer[10] = 0xEE;
WBuffer[11] = 0xA0;
WBuffer[12] = 0xA0;
WBuffer[13] = 0x0C;
WBuffer[14] = 0xF0;
WBuffer[15] = 0xA0;
WBuffer[16] = 0xA0;
rgb_reg_writer(WBuffer, 17);
WBuffer[0] = 0xE6;
WBuffer[1] = 0x00;
WBuffer[2] = 0x00;
WBuffer[3] = 0x11;
WBuffer[4] = 0x11;
rgb_reg_writer(WBuffer, 5);
WBuffer[0] = 0xE7;
WBuffer[1] = 0x44;
WBuffer[2] = 0x44;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xE8;
WBuffer[1] = 0x07;
WBuffer[2] = 0xEB;
WBuffer[3] = 0xA0;
WBuffer[4] = 0xA0;
WBuffer[5] = 0x09;
WBuffer[6] = 0xED;
WBuffer[7] = 0xA0;
WBuffer[8] = 0xA0;
WBuffer[9] = 0x0B;
WBuffer[10] = 0xEF;
WBuffer[11] = 0xA0;
WBuffer[12] = 0xA0;
WBuffer[13] = 0x0D;
WBuffer[14] = 0xF1;
WBuffer[15] = 0xA0;
WBuffer[16] = 0xA0;
rgb_reg_writer(WBuffer, 17);
WBuffer[0] = 0xE9;
WBuffer[1] = 0x36;
WBuffer[2] = 0x00;
rgb_reg_writer(WBuffer, 3);
WBuffer[0] = 0xEB;
WBuffer[1] = 0x00;
WBuffer[2] = 0x00;
WBuffer[3] = 0x4E;
WBuffer[4] = 0x4E;
WBuffer[5] = 0xEE;
WBuffer[6] = 0x44;
WBuffer[7] = 0x40;
rgb_reg_writer(WBuffer, 8);
WBuffer[0] = 0xED;
WBuffer[1] = 0xFF;
WBuffer[2] = 0xFF;
WBuffer[3] = 0x76;
WBuffer[4] = 0x54;
WBuffer[5] = 0xC1;
WBuffer[6] = 0x0F;
WBuffer[7] = 0xB2;
WBuffer[8] = 0x3F;
WBuffer[9] = 0x32;
WBuffer[10] = 0xBF;
WBuffer[11] = 0x01;
WBuffer[12] = 0xC4;
WBuffer[13] = 0x56;
WBuffer[14] = 0x7F;
WBuffer[15] = 0xFF;
WBuffer[16] = 0xFF;
rgb_reg_writer(WBuffer, 17);
WBuffer[0] = 0xFF;
WBuffer[1] = 0x77;
WBuffer[2] = 0x01;
WBuffer[3] = 0x00;
WBuffer[4] = 0x00;
WBuffer[5] = 0x00;
rgb_reg_writer(WBuffer, 6);
WBuffer[0] = 0x35;
WBuffer[1] = 0x00;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0x36;
WBuffer[1] = 0x00;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0x3A;
WBuffer[1] = 0x66;
rgb_reg_writer(WBuffer, 2);
WBuffer[0] = 0x11;
rgb_reg_writer(WBuffer,1);
system_delay_us(200 * 1000);
WBuffer[0] = 0x29;
rgb_reg_writer(WBuffer,1);
#endif
system_delay_us(50 * 1000);
}
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata)
{
__TIMER_INIT(TIMERx, fps);
__TIMER_INT_ENABLE(TIMERx);
hrgb->rgb_TxData = Imagedata;
hrgb->VerticalSignalCount = 0;
__TIMER_START(TIMERx);
}
volatile uint32_t time_cnt1=0;
volatile uint32_t time_cnt2=0;
extern uint32_t get_system_dwt_value();
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb)
{
__TIMER_CLEAR_IQR(TIMERx);
/* If the previous frame is not completed ,return */
if(hrgb->VerticalSignalCount != 0)
{
return;
}
//printf("t:%d\r\n",(get_system_dwt_value()-time_cnt1)/192);
/* Vertical signal Start*/
__RGB_LCD_VSYNC__RELEASE();
Line_porch_set(4);
__RGB_LCD_VSYNC_SET();
Line_porch_set(8);
/* set Vertical back porch signal */
Vertical_back_porch_set();
/* send First Row */
__RGB_LCD_DENABLE_RELEASE();
__8080_DATA_WR_LEN(RGB_ROW);
__DMA_TO_8080_START_IT(&hrgb->rgb_TxData[0], RGB_ROW / 2);
time_cnt1 = get_system_dwt_value();
}
volatile uint8_t te_sign;
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb)
{
if (__DMA_GET_TFR_STATUS())
{
__DMA_CLEAR_TFR_STATUS();
hrgb->VerticalSignalCount++;
}
while(!(__8080_TXFIFO_EMPTY()));
/* Row *Column End of one frame transmission */
if(hrgb->VerticalSignalCount == RGB_COLUMN) //12ms
{
te_sign = 0;
hrgb->VerticalSignalCount = 0;
__RGB_LCD_VSYNC_SET();
Line_porch_set(8);
return;
}
// else if(hrgb->VerticalSignalCount == 360)
else if(hrgb->VerticalSignalCount == 180)
{
te_sign = 1;
}
/* set Vertical back porch signal and back porch signal */
Vertical_front_porch_set();
Vertical_back_porch_set();
/* send next Row */
__RGB_LCD_DENABLE_RELEASE();
__8080_DATA_WR_LEN(RGB_ROW);
__DMA_TO_8080_START_IT(&hrgb->rgb_TxData[RGB_ROW * hrgb->VerticalSignalCount * 2], RGB_ROW / 2);
}
#endif

View File

@ -0,0 +1,76 @@
/*
******************************************************************************
* @file rgb565.h
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2023
* @brief rgb565 Config header file.
******************************************************************************
* @attention
*
* Copyright (c) 2023 FreqChip.
* All rights reserved.
******************************************************************************
*/
#ifndef __RGB565_H__
#define __RGB565_H__
#include "fr30xx.h"
#include "driver_nv3047_rgb.h"
extern SPI_HandleTypeDef spi_handle;
extern DMA_HandleTypeDef dma_handle;
extern PARALLEL_HandTypeDef hparallel;
typedef struct
{
uint32_t VerticalSignalCount;
unsigned char *rgb_TxData;
}struct_RGB_TypeDef_t;
#define __RGB_LCD_DENABLE_SET rgb_lcd_enable_release
#define __RGB_LCD_DENABLE_RELEASE rgb_lcd_enable_set
#define __RGB_LCD_VSYNC_SET rgb_lcd_vsync_set
#define __RGB_LCD_VSYNC__RELEASE rgb_lcd_vsync_release
#define __RGB_LCD_HSYNC_SET rgb_lcd_hsync_set
#define __RGB_LCD_HSYNC__RELEASE rgb_lcd_hsync_release
#define __RGB_LCD_RESET_SET rgb_lcd_reset_set
#define __RGB_LCD_RESET_RELEASE rgb_lcd_reset_release
#define __RGB_SPI_CS_RELEASE rgb_spi_cs_release
#define __RGB_SPI_CS_SET rgb_spi_cs_set
#define __8080_DATA_WR_LEN(__LEVEL__) __PARALLEL_SET_WR_LEN(hparallel.PARALLELx,__LEVEL__)
#define __8080_TXFIFO_EMPTY() __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY
#define __8080_WRITE_BLANK() hparallel.PARALLELx->TX_FIFO = 0
#define __TIMER_CLEAR_IQR(__TIMERx__) timer_int_clear(__TIMERx__)
#define __TIMER_INIT(__TIMERx__, __LoadCount__) timer_init(__TIMERx__, (24000 * __LoadCount__))
#define __TIMER_INT_ENABLE(__TIMERx__) timer_int_enable(__TIMERx__)
#define __TIMER_START(__TIMERx__) timer_start(__TIMERx__)
#define __DMA_GET_TFR_STATUS() dma_get_tfr_Status(&dma_handle)
#define __DMA_CLEAR_TFR_STATUS() dma_clear_tfr_Status(&dma_handle)
#define __DMA_TO_8080_START_IT(__BUFFER__,__SIZE__) dma_start_IT(&dma_handle, (uint32_t)__BUFFER__, (uint32_t)&hparallel.PARALLELx->TX_FIFO, __SIZE__)
#define __SPI_WRITE_DATA(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_handle, (void *)__BUFFER__, __SIZE__)
/* Exported functions --------------------------------------------------------*/
/* rgb_display_start */
/* rgb_timer_IRQHandler */
/* rgb_dma_IRQHandler */
void rgb_init(void);
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata);
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb);
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb);
#endif

View File

@ -0,0 +1,746 @@
/*
******************************************************************************
* @file IC_W25Qxx.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2020
* @brief W25Qxx IC driver.
* This file provides firmware functions to manage the following
* functionalities of the spi norflash driver for W25Qxx.
* @ Initialization and de-initialization functions
* @ IO operation functions
* @ Peripheral Control functions
******************************************************************************
* @attention
*
* Copyright (c) 2020 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "IC_W25Qxx.h"
static void (*read_callback)(void) = NULL;
/*********************************************************************************
* function : Read_IT_callback
* Description : callback function used in read data with interrupt mode
* Input :
* Output :
* Author : Owen Data : 2022
**********************************************************************************/
static void Read_IT_callback(SPI_HandleTypeDef *hspi)
{
__SPI_CS_Release();
if (read_callback)
{
read_callback();
}
}
/*********************************************************************************
* function : IC_W25Qxx_WriteEnable
* Description : Write Enable
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_WriteEnable(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = WRITE_ENABLE;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_WriteDisable
* Description : Write Disable
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_WriteDisable(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = WRITE_DISABLE;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_WriteRegister
* Description : Write status register
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_WriteRegister(uint8_t fu8_Register_S7_S0, uint8_t fu8_Register_S15_S08)
{
uint8_t lu8_DataBuffer[3];
lu8_DataBuffer[0] = WRITE_STATUS_REGISTER;
lu8_DataBuffer[1] = fu8_Register_S7_S0;
lu8_DataBuffer[2] = fu8_Register_S15_S08;
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 3);
/* CS Realse */
__SPI_CS_Release();
/* Wait Write register End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_WriteHRegister
* Description : Write high status register separately
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_WriteHRegister(uint8_t fu8_Register_S15_S08)
{
uint8_t lu8_DataBuffer[2];
lu8_DataBuffer[0] = WRITE_STATUS_H_REGISTER;
lu8_DataBuffer[1] = fu8_Register_S15_S08;
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 2);
/* CS Realse */
__SPI_CS_Release();
/* Wait Write register End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_ID
* Description : Read Manufacture ID and Device ID
* Input :
* Output : Manufacture ID and Device ID
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
uint32_t IC_W25Qxx_Read_ID(void)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = READ_ID;
lu8_DataBuffer[1] = 0;
lu8_DataBuffer[2] = 0;
lu8_DataBuffer[3] = 0;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* Recieve Manufacture ID and Device ID */
__SPI_Read_Data(lu8_DataBuffer, 3);
/* CS Realse */
__SPI_CS_Release();
return ((uint32_t)lu8_DataBuffer[0] << 16
| (uint32_t)lu8_DataBuffer[1] << 8
| (uint32_t)lu8_DataBuffer[2]);
}
/*********************************************************************************
* function : IC_W25Qxx_Read_RegisterS07_S00
* Description : Read Status Register S07 ~ S00
* Input :
* Output : Status Register S07 ~ S00
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
uint8_t IC_W25Qxx_Read_RegisterS07_S00(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = READ_STATUS_REGISTER_S07_S00;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* Recieve Status Register S07 ~ S00 */
__SPI_Read_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
return lu8_DataBuffer[0];
}
/*********************************************************************************
* function : IC_W25Qxx_Read_RegisterS15_S08
* Description : Read Status Register S15 ~ S08
* Input :
* Output : Status Register S15 ~ S08
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
uint8_t IC_W25Qxx_Read_RegisterS15_S08(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = READ_STATUS_REGISTER_S15_S08;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* Recieve Status Register S15 ~ S08 */
__SPI_Read_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
return lu8_DataBuffer[0];
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Data
* Description : Read Data
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Data(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = READ_DATA;
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
/* CS Select */
__SPI_CS_Select();
/* Send command and Recieve Data */
__SPI_Read_flash_X1(lu8_DataBuffer, 4, pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Data_IT
* Description : Read Data
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Data_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = READ_DATA;
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
spi_flash_handle.RxCpltCallback = Read_IT_callback;
/* CS Select */
__SPI_CS_Select();
/* Send command and Recieve Data */
__SPI_Read_flash_X1_IT(lu8_DataBuffer, 4, pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Data_DMA
* Description : Read Data
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Data_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = READ_DATA;
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
/* CS Select */
__SPI_CS_Select();
/* Send command and Recieve Data */
__SPI_Read_flash_X1_DMA(lu8_DataBuffer, 4, fu32_Length);
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Dual_Output
* Description : Dual Output Fast Read
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Dual_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8(pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Dual_Output_IT
* Description : Dual Output Fast Read with interrupt mode
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Dual_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
spi_flash_handle.RxCpltCallback = Read_IT_callback;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8_IT(pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Dual_Output_DMA
* Description : Dual Output Fast Read with DMA mode
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Dual_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8_DMA(fu32_Length);
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Quad_Output
* Description : Quad Output Fast Read
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Quad_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8(pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Quad_Output_IT
* Description : Quad Output Fast Read
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Quad_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
spi_flash_handle.RxCpltCallback = Read_IT_callback;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8_IT(pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Read_Quad_Output_DMA
* Description : Quad Output Fast Read
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Read_Quad_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Read_Data_X2X4X8_DMA(fu32_Length);
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
// /* CS Realse */
// __SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_PageProgram
* Description : Page Program
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_PageProgram(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = PAGE_PROGARM;
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 4);
/* Send Data */
__SPI_Write_Data(pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
/* Wait Erase End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_PageProgram_Quad
* Description : Quad Page Program
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_PageProgram_Quad(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = QUAD_PAGE_PROGRAM;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Write_Data_X2X4X8(pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
/* Wait Erase End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_EraseSector
* Description : Erease The specific Sector
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_EraseSector(uint32_t fu32_DataAddress)
{
uint8_t lu8_DataBuffer[4];
lu8_DataBuffer[0] = SECTOR_ERASE;
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 4);
/* CS Realse */
__SPI_CS_Release();
/* Wait Erase End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_EraseChip
* Description : Erease The Whole Chip
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_EraseChip(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = CHIP_ERASE;
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
/* Wait Erase End */
IC_W25Qxx_WaitBusy();
}
/*********************************************************************************
* function : IC_W25Qxx_QuadConfig
* Description : Quad Function Config
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_QuadConfig(bool fb_Config)
{
uint8_t lu8_CurrentState;
lu8_CurrentState = IC_W25Qxx_Read_RegisterS15_S08();
if (fb_Config == true)
{
/* Set W25Qxx Quad Enable */
if ((lu8_CurrentState & REGISTER_S15_S08_QE) == 0)
{
// IC_W25Qxx_WriteRegister(REGISTER_NULL, REGISTER_S15_S08_QE);
IC_W25Qxx_WriteHRegister(REGISTER_S15_S08_QE);
}
}
else
{
/* Set W25Qxx Quad Disable */
if (lu8_CurrentState & REGISTER_S15_S08_QE)
{
IC_W25Qxx_WriteRegister(REGISTER_NULL, REGISTER_NULL);
}
}
}
/*********************************************************************************
* function : IC_W25Qxx_WaitBusy
* Description : Wait IC Not Busy
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_WaitBusy(void)
{
/* Wait IC Not Busy */
while(IC_W25Qxx_Read_RegisterS07_S00() & REGISTER_S07_S00_WIP);
}
/*********************************************************************************
* function : IC_W25Qxx_PowerDown
* Description :
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_PowerDown(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = DEEP_POWER_DOWN;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Wakeup
* Description :
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Wakeup(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = RELEASE_FORM_DEEP_POWER_DOWN;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Reset
* Description : W25Qxx Reset
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Reset(void)
{
uint8_t lu8_DataBuffer[1];
lu8_DataBuffer[0] = ENABLE_RESET;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
lu8_DataBuffer[0] = RESET;
/* CS Select */
__SPI_CS_Select();
/* Send command */
__SPI_Write_Data(lu8_DataBuffer, 1);
/* CS Realse */
__SPI_CS_Release();
}
/*********************************************************************************
* function : IC_W25Qxx_Set_Read_Callback
* Description : used to set read callback when unblock mode (IT, DMA) is used
* Input :
* Output :
* Author : owen Data : 2022
**********************************************************************************/
void IC_W25Qxx_Set_Read_Callback(void (*cb)(void))
{
read_callback = cb;
}
/*********************************************************************************
* function : IC_W25Qxx_Spi_Interrupt
* Description : SPI interrupt handler
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_Spi_Interrupt(void)
{
spi_master_IRQHandler(&spi_flash_handle);
}
/*********************************************************************************
* function : IC_W25Qxx_DMA_Interrupt
* Description : DMA interrupt handler
* Input :
* Output :
* Author : Chris_Kyle Data : 2020
**********************************************************************************/
void IC_W25Qxx_DMA_Interrupt(void)
{
if (dma_get_tfr_Status(&dma_flash_handle)) {
dma_clear_tfr_Status(&dma_flash_handle);
Read_IT_callback(NULL);
}
if (dma_get_error_Status(&dma_flash_handle)) {
dma_clear_error_Status(&dma_flash_handle);
}
}
void IC_W25Qxx_PageProgram_Dual(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
{
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
spi_flash_handle.MultWireParam.Instruct = 0xA2;
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
/* Write Enable */
IC_W25Qxx_WriteEnable();
/* CS Select */
__SPI_CS_Select();
/* Send Data */
__SPI_Write_Data_X2X4X8(pu8_Buffer, fu32_Length);
/* CS Realse */
__SPI_CS_Release();
/* Wait Erase End */
IC_W25Qxx_WaitBusy();
}

View File

@ -0,0 +1,224 @@
/*
******************************************************************************
* @file IC_W25Qxx.h
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2020
* @brief IC_W25Qxx Config header file.
******************************************************************************
* @attention
*
* Copyright (c) 2020 FreqChip.
* All rights reserved.
******************************************************************************
*/
#ifndef __IC_W25QXX_H__
#define __IC_W25QXX_H__
#include <stdint.h>
#include <stdbool.h>
#include "driver_spi.h"
#include "driver_dma.h"
extern SPI_HandleTypeDef spi_flash_handle;
extern DMA_HandleTypeDef dma_flash_handle;
extern void spi_flash_cs_set(void);
extern void spi_flash_cs_clear(void);
#define __SPI_CS_Release() spi_flash_cs_set()
#define __SPI_CS_Select() spi_flash_cs_clear()
#define __SPI_Read_Data(__BUFFER__, __SIZE__) spi_master_receive_X1(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
#define __SPI_Write_Data(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_flash_X1(__CMD__, __CSIZE__, __BUFFER__, __SIZE__) spi_master_readflash_X1(&spi_flash_handle, (uint16_t *)__CMD__, __CSIZE__, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_flash_X1_IT(__CMD__, __CSIZE__, __BUFFER__, __SIZE__) spi_master_readflash_X1_IT(&spi_flash_handle, (uint8_t *)__CMD__, __CSIZE__, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_flash_X1_DMA(__CMD__, __CSIZE__, __SIZE__) spi_master_readflash_X1_DMA(&spi_flash_handle, (uint8_t *)__CMD__, __CSIZE__, __SIZE__)
#define __SPI_Write_Data_X2X4X8(__BUFFER__, __SIZE__) spi_master_transmit_X2X4X8(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_Data_X2X4X8(__BUFFER__, __SIZE__) spi_master_receive_X2X4X8(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_Data_X2X4X8_IT(__BUFFER__, __SIZE__) spi_master_receive_X2X4X8_IT(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
#define __SPI_Read_Data_X2X4X8_DMA(__SIZE__) spi_master_receive_X2X4X8_DMA(&spi_flash_handle, __SIZE__)
/*********************************************************************************
One Block have 32K
Block Setor Address Range
17 0x011000 ~ 0x011FFF
16 0x010000 ~ 0x010FFF
15 0x00F000 ~ 0x00FFFF
14 0x00E000 ~ 0x00EFFF
1 13 0x00D000 ~ 0x00DFFF
12 0x00C000 ~ 0x00CFFF
11 0x00B000 ~ 0x00BFFF
10 0x00A000 ~ 0x00AFFF
9 0x009000 ~ 0x009FFF
8 0x008000 ~ 0x008FFF
7 0x007000 ~ 0x007FFF
6 0x006000 ~ 0x006FFF
5 0x005000 ~ 0x005FFF
0 4 0x004000 ~ 0x004FFF
3 0x003000 ~ 0x003FFF
2 0x002000 ~ 0x002FFF
1 0x001000 ~ 0x001FFF
0 0x000000 ~ 0x000FFF
**********************************************************************************/
/**
* @brief W25Qxx Size
*/
#define W25QXX_PAGE_SIZE (256U) // Each Page has 256 Bytes
#define W25QXX_SECTOR_SIZE (4096U) // Each Sector has 4k
/**
* @brief W25Qxx Command Descriptions
*/
#define WRITE_ENABLE (0x06)
#define WRITE_DISABLE (0x04)
#define READ_STATUS_REGISTER_S07_S00 (0x05)
#define READ_STATUS_REGISTER_S15_S08 (0x35)
#define WRITE_STATUS_REGISTER (0x01)
#define WRITE_STATUS_H_REGISTER (0x31)
#define WRITE_ENABLE_VOLATILE_STATUS_REGISTER (0x50)
#define READ_DATA (0x03)
#define READ_DATA_FAST (0x0B)
#define DUAL_OUTPUT_FAST_READ (0x3B)
#define QUAD_OUTPUT_FAST_READ (0x6B)
#define DUAL_IO_FAST_READ (0xBB)
#define QUAD_IO_FAST_READ (0xEB)
#define SET_BURST_WITH_WRAP (0x77)
#define PAGE_PROGARM (0x02)
#define QUAD_PAGE_PROGRAM (0x32)
#define SECTOR_ERASE (0x20)
#define BLOCK_ERASE_32K (0x52)
#define BLOCK_ERASE_64K (0x52)
#define CHIP_ERASE (0xC7)
#define READ_DEVICE_ID (0x90)
#define READ_ID (0x9F)
#define READ_UNIQUE_ID (0x4B)
#define ERASE_SECURITY_REGISTER (0x44)
#define PROGRAM_SECURITY_REGISTER (0x42)
#define READ_SECURITY_REGISTER (0x48)
#define ENABLE_RESET (0x66)
#define RESET (0x99)
#define PROGRAM_ERASE_SUSPEND (0x75)
#define PROGRAM_ERASE_RESUME (0x7A)
#define DEEP_POWER_DOWN (0xB9)
#define RELEASE_FORM_DEEP_POWER_DOWN (0xAB)
#define READ_DATA_COMPATIBILITY (0x5A)
/**
* @brief W25Qxx Stauts Register
*/
#define REGISTER_NULL (0)
#define REGISTER_S07_S00_SRP0 (1 << 7)
#define REGISTER_S07_S00_BP4 (1 << 6)
#define REGISTER_S07_S00_BP3 (1 << 5)
#define REGISTER_S07_S00_BP2 (1 << 4)
#define REGISTER_S07_S00_BP1 (1 << 3)
#define REGISTER_S07_S00_BP0 (1 << 2)
#define REGISTER_S07_S00_WEL (1 << 1)
#define REGISTER_S07_S00_WIP (1 << 0)
#define REGISTER_S15_S08_SUS (1 << 7)
#define REGISTER_S15_S08_CMP (1 << 6)
#define REGISTER_S15_S08_NULL (1 << 5)
#define REGISTER_S15_S08_DC (1 << 4)
#define REGISTER_S15_S08_LB1 (1 << 3)
#define REGISTER_S15_S08_LB0 (1 << 2)
#define REGISTER_S15_S08_QE (1 << 1) // Quad Enable
#define REGISTER_S15_S08_SRP1 (1 << 0)
/* Function : IC_W25Qxx_WriteEnable */
void IC_W25Qxx_WriteEnable(void);
/* Function : IC_W25Qxx_WriteDisable */
void IC_W25Qxx_WriteDisable(void);
/* Function : IC_W25Qxx_WriteRegister */
void IC_W25Qxx_WriteRegister(uint8_t fu8_Register_S7_S0, uint8_t fu8_Register_S15_S08);
/* Function : IC_W25Qxx_Read_ID */
uint32_t IC_W25Qxx_Read_ID(void);
/* Function : IC_W25Qxx_Read_RegisterS07_S00 */
uint8_t IC_W25Qxx_Read_RegisterS07_S00(void);
/* Function : IC_W25Qxx_Read_RegisterS15_S08 */
uint8_t IC_W25Qxx_Read_RegisterS15_S08(void);
/* Function : IC_W25Qxx_Read */
void IC_W25Qxx_Read_Data(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read with interrupt mode */
void IC_W25Qxx_Read_Data_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read with DMA mode */
void IC_W25Qxx_Read_Data_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Dual_Output */
void IC_W25Qxx_Read_Dual_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Dual_Output_IT with interrupt mode */
void IC_W25Qxx_Read_Dual_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Dual_Output_DMA with DMA mode */
void IC_W25Qxx_Read_Dual_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Quad_Output */
void IC_W25Qxx_Read_Quad_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Quad_Output with interrupt mode */
void IC_W25Qxx_Read_Quad_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_Read_Quad_Output with DMA mode */
void IC_W25Qxx_Read_Quad_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_PageProgram */
void IC_W25Qxx_PageProgram(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_PageProgram_Quad */
void IC_W25Qxx_PageProgram_Quad(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
/* Function : IC_W25Qxx_EraseSector */
void IC_W25Qxx_EraseSector(uint32_t fu32_DataAddress);
/* Function : IC_W25Qxx_EraseChip */
void IC_W25Qxx_EraseChip(void);
/* Function : IC_W25Qxx_QuadConfig */
void IC_W25Qxx_QuadConfig(bool fb_Config);
/* Function : IC_W25Qxx_WaitBusy */
void IC_W25Qxx_WaitBusy(void);
/* Function : IC_W25Qxx_Reset */
void IC_W25Qxx_Reset(void);
/* Function : IC_W25Qxx_PowerDown */
void IC_W25Qxx_PowerDown(void);
/* Function : IC_W25Qxx_Wakeup */
void IC_W25Qxx_Wakeup(void);
/* Function : IC_W25Qxx_Read_Set_Callback */
void IC_W25Qxx_Set_Read_Callback(void (*cb)(void));
/* Function : IC_W25Qxx_Spi_Interrupt */
void IC_W25Qxx_Spi_Interrupt(void);
/* Function : IC_W25Qxx_DMA_Interrupt */
void IC_W25Qxx_DMA_Interrupt(void);
void IC_W25Qxx_PageProgram_Dual(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
#endif

View File

@ -0,0 +1,132 @@
#include "ext_flash.h"
#include "driver_gpio.h"
#include "driver_spi.h"
#include "driver_dma.h"
#include "IC_W25Qxx.h"
#include <stdint.h>
extern SPI_HandleTypeDef spi_flash_handle;
extern DMA_HandleTypeDef dma_flash_handle;
void ext_flash_gpio_init(void)
{
/* ========================================================== */
/* ========= External Flash interface configuration ======== */
/* ========================================================== */
GPIO_InitTypeDef gpio_config;
/* config GPIO for external flash */
gpio_config.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_7;
gpio_init(GPIOC, &gpio_config);
/* CS of external flash is controllerd by software */
__SYSTEM_GPIOC_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_9;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
}
void ext_flash_dma_init(void)
{
/* config DMA0 for external flash */
__SYSTEM_DMA0_CLK_ENABLE();
dma_flash_handle.DMAx = DMA0;
dma_flash_handle.Channel = DMA_Channel0;
dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC;
dma_flash_handle.Init.Request_ID = 2;
system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2);
dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1;
dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4;
dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC;
dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4;
dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4;
dma_init(&dma_flash_handle);
}
void ext_flash_controler_init(void)
{
/* Initial SPIx8_1 for extern flash */
__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
spi_flash_handle.SPIx = SPIMX8_1;
spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3;
spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
spi_flash_handle.Init.BaudRate_Prescaler = 2;
spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20;
spi_flash_handle.Init.RxFIFOFull_Threshold = 0;
spi_master_init(&spi_flash_handle);
// __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
spi_flash_cs_set();
IC_W25Qxx_QuadConfig(true);
NVIC_EnableIRQ(DMA0_IRQn);
NVIC_EnableIRQ(SPIMX8_1_IRQn);
}
void ext_flash_device_init(void)
{
ext_flash_gpio_init();
ext_flash_dma_init();
ext_flash_controler_init();
}
uint32_t ext_flash_get_id(void)
{
return IC_W25Qxx_Read_ID();
}
// void spi_flash_cs_set(void)
// {
// gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
// }
// void spi_flash_cs_clear(void)
// {
// gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_CLEAR);
// }
void ext_flash_erase(uint32_t addr, uint32_t len)
{
for (int i = 0; i < len; i += 4096)
{
IC_W25Qxx_EraseSector(addr + i);
}
}
void ext_flash_chip_erase(void)
{
}
void ext_flash_protect_enable(void)
{
}
void ext_flash_protect_disable(void)
{
}
uint8_t ext_flash_read(uint32_t addr, int len,uint8_t* buffer)
{
IC_W25Qxx_Read_Data(buffer, addr, len);
return 0;
}
uint8_t ext_flash_write(uint32_t addr, int len,uint8_t* buffer)
{
IC_W25Qxx_PageProgram(buffer, addr, len);
return 0;
}

View File

@ -0,0 +1,27 @@
#ifndef __EXT_FLASH__
#define __EXT_FLASH__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void ext_flash_device_init(void);
uint32_t ext_flash_get_id(void);
void spi_flash_cs_set(void);
void spi_flash_cs_clear(void);
void ext_flash_erase(uint32_t addr, uint32_t len);
void ext_flash_chip_erase(void);
void ext_flash_protect_enable(void);
void ext_flash_protect_disable(void);
uint8_t ext_flash_read(uint32_t addr, int len,uint8_t* buffer);
uint8_t ext_flash_write(uint32_t addr, int len,uint8_t* buffer);
#ifdef __cplusplus
}
#endif
#endif /* __EXT_FLASH__ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
#ifndef __CHSC6X_COMP_H__
#define __CHSC6X_COMP_H__
struct ts_fw_infos {
unsigned short chsc6x_cfg_version; //customer read
unsigned short chsc6x_boot_version; //customer read
unsigned short chsc6x_vendor_id; //customer read
unsigned short chsc6x_project_id; //customer read
unsigned short chsc6x_chip_id; //customer read
unsigned short chsc6x_chip_type; //customer read
unsigned short chsc6x_rpt_lcd_x; //customer read must after chsc6x_get_chip_info
unsigned short chsc6x_rpt_lcd_y; //customer read must after chsc6x_get_chip_info
unsigned short chsc6x_max_pt_num; //customer read must after chsc6x_get_chip_info
};
/* FUNC In your systerm init process,Must call this interface function to detec if the TP IC is Chipsemi corp'.
* PARM pfw_infos: to get top 5 fw info in struct ts_fw_infos.
* PARM update_ret_flag: point value=1 update succeed; point value=0 update failed, If opend CHSC6X_AUTO_UPGRADE macro.
* RETURN 1:is chsc chip, 0:is not chsc chip
*/
extern int chsc6x_tp_dect(struct ts_fw_infos *pfw_infos, unsigned char *update_ret_flag);
/* FUNC You can call this interfacce function to realize upgrade TP Firmware by OTA.
* PARM pfw_infos: to get top 6 fw infos in struct ts_fw_infos, after ota upgrade.
* PARM p_fw_upd: array address of the upgrade firmware array
* PARM fw_len: total size of the upgrade firmware array
* RETURN NULL
*/
extern void chsc6x_ota_upgrade_tp_fw(struct ts_fw_infos *pfw_infos, unsigned char* p_fw_upd, unsigned int fw_len);
/* FUNC: get fw info in struct ts_fw_infos you can call this func anytime.
* PARM pfw_infos: can get all fw infos in struct ts_fw_infos, after call this interface.
* RETURN NULL
*/
extern void chsc6x_get_chip_info(struct ts_fw_infos *infos);
#endif

View File

@ -0,0 +1,895 @@
#ifndef __CHSC6X_FLASH_BOOT_H__
#define __CHSC6X_FLASH_BOOT_H__
const unsigned char chsc_boot[] = {
0x43,0x48,0x53,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0xCC,0x00,0x00,0x00,0x8C,0x36,0x00,0x00,0x01,0xC6,0x0E,0x00,0x01,0xC6,0x0E,0x08,
0x01,0x3C,0x02,0x93,0x1B,0x02,0x02,0x00,0x00,0x01,0x0F,0x01,0x13,0x0F,0x43,0x0A,
0x0A,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x10,0x0C,0x00,0x00,0x00,
0x00,0x0B,0x08,0x03,0x01,0x04,0x05,0x09,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x0A,0x0F,0x0E,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x45,0x91,0x02,0x38,0x00,0x72,0x01,0x72,0x01,0x50,0x00,0xF0,0x00,
0x90,0x01,0x00,0x02,0x84,0x03,0x20,0x10,0x78,0x78,0x78,0x78,0x64,0x40,0x08,0x84,
0x08,0x1E,0x26,0x23,0x28,0x26,0x5C,0x0B,0x90,0x08,0x46,0x46,0x23,0x23,0x65,0xBD,
0x1B,0x06,0x11,0x20,0x03,0x19,0x84,0xAF,0x9E,0x40,0x91,0x01,0xC8,0x60,0x2C,0x2D,
0x25,0x11,0x32,0x6A,0x80,0x32,0x21,0x46,0xC8,0x28,0xDA,0x6B,0x59,0x05,0x84,0xA2,
0x26,0x06,0x33,0x08,0x22,0x06,0x2B,0x08,0xF7,0x05,0x07,0x08,0x3E,0x06,0x95,0x08,
0x00,0x00,0x34,0x2D,0x34,0x2D,0x00,0x00,0x00,0x00,0xD6,0x02,0x0E,0x00,0x08,0x08,
0x28,0x10,0x32,0x03,0x51,0x32,0x01,0x21,0x19,0x19,0x11,0x12,0x13,0x13,0x11,0x19,
0x1A,0x1A,0x1D,0x1B,0x1A,0x19,0x19,0x82,0x08,0x80,0x36,0x35,0x2D,0x02,0x88,0x36,
0xBD,0x4E,0x4C,0x54,0x40,0x00,0x88,0x00,0x4A,0x80,0xC0,0x46,0x00,0xA0,0x20,0x09,
0x20,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x13,0x08,0xC0,0x6B,0x14,0x08,
0x85,0x06,0x12,0x08,0xC0,0x6B,0x13,0x08,0x85,0x06,0x1B,0x08,0x1B,0x09,0x10,0x0A,
0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x10,0x09,0x11,0x0A,0x00,0xA0,0x08,0x50,
0x04,0xB1,0x91,0x02,0xFB,0xCD,0x0C,0x09,0x04,0xA0,0x08,0x40,0x05,0xA0,0x48,0x40,
0x0C,0x09,0x0D,0x0A,0x0D,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,
0xF9,0xCB,0x01,0x90,0x19,0x9C,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,
0xFC,0x9D,0x80,0x00,0xFC,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0x00,0x84,0x80,0x00,
0x00,0x85,0x80,0x00,0x10,0x36,0x00,0x00,0x04,0x8D,0x80,0x00,0x7C,0x8D,0x80,0x00,
0x00,0x84,0x80,0x00,0x00,0xA0,0x80,0x00,0xCE,0xFA,0xAD,0xDE,0xE0,0x93,0x80,0x00,
0x00,0x65,0x0F,0x64,0xD8,0x6B,0x01,0x64,0xF0,0x64,0x4F,0x06,0x56,0x06,0x5D,0x06,
0x64,0x06,0xF0,0x64,0x44,0x06,0x10,0x64,0x00,0x90,0x10,0x99,0x10,0x6C,0xA0,0x06,
0xF0,0x6C,0xB9,0x06,0xB2,0x06,0xAB,0x06,0xA4,0x06,0xF0,0x6C,0x01,0x6C,0xD0,0x6B,
0x0F,0x6C,0x00,0x69,0x00,0x00,0x00,0x00,0x03,0xA2,0x05,0x80,0x01,0xA2,0x03,0x80,
0x02,0xA2,0x01,0x80,0x00,0xA2,0xFF,0x87,0xCB,0x6B,0x18,0x64,0x80,0xA4,0x23,0x03,
0xC3,0x6B,0x09,0x0B,0x18,0x50,0x04,0xB3,0x19,0x50,0x08,0xBB,0x1A,0x40,0x18,0x48,
0x00,0xA8,0xFC,0xC1,0x01,0xAA,0x02,0xC9,0x08,0xB3,0x18,0x58,0x01,0x80,0x04,0xB3,
0x18,0x58,0x18,0x6C,0xC3,0x6B,0x70,0x07,0x64,0x06,0x80,0x00,0x60,0x06,0x80,0x00,
0x68,0x06,0x80,0x00,0xC0,0x46,0xC0,0x46,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x70,0x65,0x00,0x90,0x67,0x99,0x24,0x0B,
0x00,0xA2,0x1A,0x40,0x23,0x0A,0xB9,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,
0x1F,0x0B,0x01,0xA2,0x1A,0x40,0x20,0x0C,0x20,0x0E,0x81,0xA5,0x06,0xA1,0x06,0xA0,
0x00,0x90,0x5A,0x98,0x0B,0xA0,0x01,0xA1,0x00,0x90,0x56,0x98,0x25,0x40,0x20,0xA3,
0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x66,0xA2,0x32,0x40,0x18,0x09,0x4A,0x4E,
0x01,0xAA,0x09,0xC1,0x17,0x09,0x0B,0x40,0x03,0xB1,0x0B,0x40,0x16,0x0B,0x02,0xA1,
0x19,0x40,0x09,0xBB,0x1A,0x40,0x07,0x80,0x4B,0x4E,0x00,0xAB,0x04,0xC0,0x06,0xA0,
0x00,0x90,0x24,0x98,0x04,0xA8,0xD9,0xC0,0x09,0x0B,0x00,0xA2,0x1A,0x40,0x09,0x0A,
0xAB,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,0x05,0x0B,0x01,0xA2,0x1A,0x40,
0x20,0xA3,0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x00,0x90,0x5F,0x99,0x70,0x6D,
0x0D,0x00,0x80,0x00,0x0C,0x00,0x80,0x00,0x67,0x00,0x80,0x00,0x0F,0x04,0x80,0x00,
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0xF6,0x80,0xA3,
0xDB,0xF3,0x00,0xFE,0xC0,0xE8,0x05,0x0B,0x05,0x0A,0x18,0x50,0x01,0xA3,0x11,0x48,
0x0B,0x02,0xFC,0xC1,0x03,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,0xB8,0x00,0x80,0x00,
0xBA,0x00,0x80,0x00,0xB9,0x00,0x80,0x00,0x00,0xF6,0xC0,0xA3,0xDB,0xF3,0x00,0xFE,
0x09,0xF6,0xC0,0xE8,0x09,0xFC,0x04,0x0B,0x40,0xE8,0x04,0x0A,0x18,0x50,0x01,0xA3,
0x11,0x48,0x0B,0x02,0xFC,0xC1,0x70,0x07,0xB8,0x00,0x80,0x00,0xBA,0x00,0x80,0x00,
0x70,0x65,0x0B,0x0A,0x0B,0x0B,0x28,0xB2,0x15,0x48,0x40,0xB3,0x80,0xA2,0x0A,0x09,
0xED,0xE8,0x0A,0x0C,0x12,0xF1,0x07,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x96,0xEB,
0x46,0x03,0x01,0xB3,0x0E,0x20,0x02,0xB1,0xAB,0x02,0xF5,0xC1,0x70,0x6D,0xC0,0x46,
0x6C,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0xFC,0x90,0x80,0x00,0x80,0x8D,0x80,0x00,
0x07,0x0A,0x00,0xA3,0x53,0x45,0x93,0x45,0x06,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
0x05,0x0B,0x02,0xA2,0x1A,0x40,0x01,0xA2,0x09,0xBB,0x1A,0x40,0x70,0x07,0xC0,0x46,
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x05,0x0B,
0x1A,0x58,0x08,0xBB,0x1B,0x58,0x13,0x00,0x5A,0xF4,0x01,0xC5,0x00,0x90,0x6C,0x98,
0x00,0x6D,0xC0,0x46,0x48,0x06,0x80,0x00,0xF0,0x65,0x02,0xEC,0x00,0xA4,0x00,0xA3,
0x40,0xA0,0x07,0x0E,0x09,0x80,0x15,0x28,0xA5,0x02,0x04,0xC9,0xF7,0x1C,0x00,0xAF,
0x01,0xC1,0x2C,0xEC,0x18,0xEC,0x01,0xB3,0x02,0xB2,0x8B,0x02,0xF3,0xCB,0xF0,0x6D,
0x80,0x92,0x80,0x00,0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,
0x08,0xE8,0x70,0x07,0x30,0x65,0x05,0xEC,0x1C,0xEC,0xAA,0x02,0x0A,0xC0,0x03,0x38,
0x59,0xEA,0x80,0xEA,0x48,0x03,0x51,0xEB,0xFF,0x97,0xC8,0x9E,0x01,0xE9,0x00,0xA9,
0x00,0xCC,0x01,0xA1,0x09,0xF4,0x08,0xE4,0x30,0x6D,0x10,0x65,0x00,0xA4,0x03,0x1F,
0x01,0xA0,0x93,0x02,0x04,0xCB,0x89,0xEA,0xD8,0xE7,0xCA,0xFF,0x8B,0x02,0x50,0x01,
0x10,0x6D,0x10,0x65,0x04,0x58,0x03,0xEC,0x94,0x02,0x01,0xCA,0x02,0x50,0x04,0x80,
0x89,0xEA,0x00,0xA0,0x8C,0x02,0x01,0xCB,0x19,0x50,0x01,0xA0,0x10,0x6D,0x92,0xF8,
0x00,0xA3,0x01,0x80,0x02,0xD0,0x01,0xB3,0x93,0x02,0xFB,0xC3,0x70,0x07,0x10,0x65,
0x00,0xA3,0x02,0x80,0x10,0xD9,0x10,0xD0,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,
0x04,0x0B,0x1B,0x58,0x18,0xEA,0x4B,0xF0,0x59,0xE8,0xC9,0xF0,0x81,0x02,0x80,0x01,
0x40,0x02,0x70,0x07,0x34,0x06,0x80,0x00,0x10,0x65,0x12,0x0B,0x03,0xA2,0x1A,0x40,
0x11,0x0C,0x63,0x4E,0x00,0xAB,0x0E,0xC1,0x02,0xA0,0x00,0x90,0x81,0x9B,0xA3,0x4D,
0x0E,0xAB,0x0B,0xC8,0x0D,0x0B,0x01,0xA2,0x1A,0x40,0xA3,0x4D,0x01,0xB3,0x1B,0xF6,
0x1B,0xFE,0xA3,0x45,0x04,0x80,0x04,0xA0,0xFF,0x97,0x3A,0x9F,0x01,0xA3,0x63,0x45,
0x05,0x0B,0x5B,0x4D,0x01,0xAB,0x03,0xC1,0x05,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
0x10,0x6D,0xC0,0x46,0x09,0x02,0x80,0x00,0x2C,0x8F,0x80,0x00,0x00,0x02,0x80,0x00,
0x06,0x04,0x80,0x00,0x04,0x0A,0x80,0xA3,0x10,0x58,0x11,0x58,0x5B,0xF4,0x19,0x03,
0x18,0x00,0x11,0x50,0x70,0x07,0xC0,0x46,0x40,0x06,0x80,0x00,0x10,0x65,0x04,0xEC,
0x00,0x90,0x88,0x9B,0x03,0xA1,0x02,0xA0,0xFF,0x97,0xFE,0x9E,0x17,0x0A,0x18,0x0B,
0x00,0xA1,0x1A,0x20,0x14,0xA0,0xFF,0x97,0xF7,0x9E,0x06,0xA1,0x11,0xA0,0xFF,0x97,
0xF3,0x9E,0x01,0xA1,0x05,0xA0,0xFF,0x97,0xEF,0x9E,0x21,0xF6,0x09,0xFE,0x08,0xA0,
0xFF,0x97,0xEA,0x9E,0x21,0xF4,0x09,0xFE,0x24,0xF2,0x09,0xA0,0xFF,0x97,0xE4,0x9E,
0x21,0xFE,0x0A,0xA0,0xFF,0x97,0xE0,0x9E,0x0A,0x0A,0x01,0xA3,0x13,0x40,0x03,0xB2,
0x13,0x40,0x09,0x0B,0x66,0xA2,0x1A,0x40,0x01,0xA1,0x01,0xA0,0xFF,0x97,0xD4,0x9E,
0x6C,0xA1,0x00,0xA0,0xFF,0x97,0xD0,0x9E,0x10,0x6D,0xC0,0x46,0x01,0x01,0x00,0x00,
0x6C,0x00,0x80,0x00,0x06,0x04,0x80,0x00,0x0F,0x04,0x80,0x00,0x10,0x65,0x64,0xA1,
0x00,0xA0,0xFF,0x97,0xC1,0x9E,0x00,0xA1,0x14,0xA0,0xFF,0x97,0xBD,0x9E,0x04,0xA1,
0x06,0xA0,0xFF,0x97,0xB9,0x9E,0x03,0xA1,0x01,0xA0,0xFF,0x97,0xB5,0x9E,0x16,0x0B,
0x00,0xA4,0x1C,0x40,0x03,0xB3,0x1C,0x40,0xFF,0x97,0x9C,0x9F,0x06,0xA0,0xFF,0x97,
0x95,0x9E,0x83,0xF7,0x0B,0xC5,0x11,0x0B,0xDC,0x45,0x11,0x0B,0x1B,0x58,0x7A,0xB3,
0x1B,0x48,0x0F,0xA2,0x1A,0x00,0x0F,0x0B,0x01,0xBA,0x2C,0xB3,0x1A,0x40,0x0B,0x0B,
0x5A,0x4E,0x02,0xAA,0x04,0xC1,0x01,0xA2,0x5A,0x45,0x32,0xA2,0x1A,0x46,0x06,0x80,
0x5A,0x4E,0x00,0xAA,0x01,0xC1,0x01,0xA2,0x00,0x80,0x00,0xA2,0x5A,0x45,0x03,0x0B,
0x00,0xA2,0x9A,0x45,0x10,0x6D,0xC0,0x46,0x06,0x04,0x80,0x00,0x2C,0x8F,0x80,0x00,
0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x00,0x65,0x19,0x0B,0x19,0x28,0x19,0x0B,
0x28,0xB3,0x1B,0x48,0x9A,0xF0,0xD3,0xE8,0xDA,0xE0,0x17,0x0B,0x91,0x02,0x0A,0xCD,
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x08,0xAA,0x05,0xC9,0x13,0x09,
0x00,0xA2,0x0A,0x40,0x00,0x80,0x00,0xA2,0x1A,0x40,0x10,0x0B,0x1A,0x48,0x03,0xAA,
0x15,0xC8,0x0F,0x0A,0x11,0x28,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x11,0x20,0x1A,0x48,
0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x00,0xA2,0xDA,0x45,0x5A,0x46,0x05,0x0B,
0x28,0xB3,0x1A,0x48,0x07,0x08,0x52,0xF0,0x07,0x09,0x02,0x90,0xCA,0x9D,0x00,0x6D,
0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,0x7C,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,
0xB8,0x93,0x80,0x00,0x9C,0x90,0x80,0x00,0xFC,0x90,0x80,0x00,0x10,0x65,0x17,0x0B,
0x1A,0xEC,0x80,0xB2,0x14,0x48,0x16,0x0A,0x81,0xB3,0x19,0x48,0x53,0xEC,0xD8,0x4F,
0x93,0xEC,0xDB,0x4F,0x09,0xF2,0x1B,0xF2,0x21,0x03,0x03,0x03,0x99,0x02,0x1C,0xC2,
0x13,0xEC,0x2B,0xB3,0x19,0x48,0x0F,0x0B,0x1B,0x28,0x01,0xB1,0x99,0x02,0x14,0xCB,
0x28,0xB2,0x10,0x48,0x0C,0x0B,0x40,0xF0,0x0C,0x09,0xC0,0xE8,0x0B,0x80,0x1A,0x28,
0x12,0xF4,0x12,0xE4,0x00,0xAA,0x04,0xCA,0x0C,0x28,0x52,0x02,0xD2,0xE0,0xA2,0xEA,
0x0A,0x20,0x02,0xB3,0x02,0xB1,0x83,0x02,0xF1,0xC1,0x10,0x6D,0xA4,0x8F,0x80,0x00,
0x6C,0x90,0x80,0x00,0x7C,0x92,0x80,0x00,0x1C,0x92,0x80,0x00,0x9C,0x90,0x80,0x00,
0xF0,0x65,0x3E,0x0C,0x23,0x48,0x05,0xF4,0x2D,0xFC,0x03,0xAB,0x75,0xC9,0xFF,0x97,
0xBD,0x9F,0x63,0x4B,0x18,0xEE,0x02,0xC0,0x00,0xA2,0x39,0x0B,0x6C,0x80,0x39,0x0A,
0x13,0xEC,0x80,0xB3,0x81,0xB2,0x19,0x48,0x13,0x48,0x1B,0xF2,0x0B,0x03,0x36,0x09,
0x4A,0xEC,0xD6,0x4F,0x8A,0xEC,0xD2,0x4F,0x12,0xF2,0x32,0x03,0x93,0x02,0x02,0xC9,
0x2F,0x0A,0x50,0x40,0x59,0x80,0x28,0xAB,0x22,0xC9,0x62,0x49,0x10,0xEE,0x1F,0xC1,
0x2B,0x0B,0x5A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x5A,0x40,0x0F,0xAA,0x4C,0xC9,
0x58,0x40,0x28,0xB1,0x0C,0x48,0x29,0x0B,0x64,0xF0,0x29,0x0A,0xE4,0xE8,0x0C,0x80,
0x19,0x28,0x09,0xF4,0x08,0xE4,0x00,0xA8,0x05,0xCD,0xA8,0x02,0x03,0xCA,0x10,0x28,
0x89,0xE4,0x09,0xE8,0x11,0x20,0x02,0xB3,0x02,0xB2,0xA3,0x02,0xF0,0xC1,0x34,0x80,
0x1A,0x0A,0x51,0x49,0x00,0xA9,0x04,0xC0,0x52,0x49,0x01,0xAA,0x29,0xC1,0x13,0xAB,
0x27,0xC8,0x17,0x0B,0x9A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x9A,0x40,0x0F,0xAA,
0x23,0xC9,0x00,0xA2,0x9A,0x40,0x14,0x0B,0x1A,0xEC,0x28,0xB2,0x29,0xB3,0x17,0x48,
0x1E,0x48,0x12,0x09,0x12,0x0A,0x00,0xA3,0x10,0x80,0x08,0x28,0x04,0xF4,0x24,0xE4,
0x00,0xAC,0x08,0xCD,0xB3,0x02,0x01,0xC3,0xAC,0x02,0x04,0xCA,0x14,0x28,0x00,0xF4,
0x80,0xE4,0x00,0xE9,0x10,0x20,0x01,0xB3,0x02,0xB1,0x02,0xB2,0xBB,0x02,0xEC,0xC3,
0x03,0x80,0x03,0x0B,0x00,0xA2,0x9A,0x40,0x5A,0x40,0xF0,0x6D,0x2C,0x8F,0x80,0x00,
0x7C,0x8D,0x80,0x00,0xA4,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
0x9C,0x90,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x01,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x09,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x0A,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x0B,0x00,0x80,0x00,0xF0,0x65,0x3C,0x0B,0x1B,0x48,0x09,0xF6,0x81,0x60,0x04,0xEC,
0x09,0xFE,0x05,0xAB,0x52,0xC1,0x39,0x0B,0x1B,0x4E,0x00,0xAB,0x4E,0xC1,0xB4,0xA0,
0x00,0xA9,0x40,0xC0,0x01,0xA9,0x3A,0xC1,0x35,0x0B,0x08,0xA2,0x1A,0x40,0x35,0x09,
0x0B,0x58,0x00,0x33,0x34,0x0B,0x14,0xA2,0x1A,0x40,0xA2,0xF0,0x12,0xE9,0x10,0xF1,
0x82,0xEA,0x32,0x0E,0x92,0xF0,0x40,0xA5,0x9C,0x06,0x0F,0x58,0x00,0x3B,0xFB,0xEA,
0x93,0x02,0x09,0xC2,0x37,0x58,0x3D,0x02,0xF7,0xC0,0x60,0x06,0x07,0x48,0xF8,0xF6,
0xF3,0xC5,0x2B,0x09,0x08,0xA0,0x08,0x40,0x2A,0x09,0xD3,0xEA,0x8B,0x02,0x0B,0xCD,
0xD8,0xF0,0xC0,0xE8,0x28,0x0B,0x22,0x0A,0x40,0xF0,0x00,0xA1,0xC0,0xE8,0x11,0x40,
0xC0,0xE2,0xFF,0x97,0xA9,0x9C,0x2C,0x80,0x96,0xA1,0x49,0xF0,0x8B,0x02,0x25,0xCD,
0x1C,0x0B,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x1E,0x80,0x02,0xA9,
0x28,0xC1,0xDF,0xA0,0x40,0xF0,0xFF,0x97,0x97,0x9C,0xA1,0xF0,0x0C,0xE9,0x1B,0x0B,
0x21,0xF1,0x1A,0x58,0x0C,0xEB,0x64,0xF1,0x14,0xEB,0x1A,0x80,0x10,0x0B,0x08,0xA2,
0x1A,0x40,0x10,0x0B,0x1A,0x58,0x00,0x32,0xA2,0xF0,0x12,0xE9,0x11,0xF1,0x8A,0xEA,
0x92,0xF0,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x08,0x0B,0x00,0xA2,
0x1A,0x40,0xA2,0xF0,0x14,0xE9,0x22,0xF1,0x00,0x3B,0x14,0xEB,0x64,0xF1,0xE4,0xE8,
0x04,0x0B,0x1C,0x50,0x01,0x60,0xF0,0x6D,0x03,0x00,0x80,0x00,0x2C,0x8F,0x80,0x00,
0x68,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x22,0x00,0x80,0x00,0x48,0x06,0x80,0x00,
0x83,0x00,0x80,0x00,0x0E,0x10,0x00,0x00,0x08,0xE7,0xFE,0xFF,0x68,0x90,0x80,0x00,
0x10,0x65,0x24,0x0B,0x66,0xA2,0x1A,0x40,0x02,0xA1,0x02,0xA0,0xFF,0x97,0xC4,0x9C,
0x21,0x0B,0xAA,0xA2,0x21,0x0C,0x1A,0x40,0xFF,0xA3,0x23,0x40,0x00,0x90,0x42,0x99,
0x1F,0x0A,0x00,0xA3,0x13,0x50,0x11,0x58,0x08,0xB2,0x11,0x50,0x28,0xBA,0x23,0x40,
0x13,0x40,0x10,0xB2,0x13,0x50,0x1B,0x0A,0x08,0xA1,0x11,0x40,0x1A,0x09,0x04,0xBA,
0x11,0x20,0x1A,0x09,0x5C,0xA2,0x0A,0x40,0x08,0xB1,0x0A,0x40,0x01,0xB1,0x0A,0x40,
0x01,0xB1,0x0A,0x40,0x16,0x0A,0x05,0xA1,0x11,0x40,0x16,0x09,0x25,0xB2,0x11,0x20,
0x40,0xB2,0x13,0x40,0x14,0x0B,0x7F,0xA2,0x1A,0x40,0xE0,0xA3,0x1B,0xF2,0x1C,0x48,
0x12,0x0B,0x1B,0x48,0x63,0x00,0xFF,0xAB,0x09,0xC1,0x23,0xEC,0x50,0xBB,0x1B,0xF6,
0x1B,0xFE,0xA8,0xAB,0x03,0xC8,0x03,0xA0,0x21,0xEC,0xFF,0x97,0x85,0x9C,0x0C,0x0B,
0x1C,0x21,0x10,0x6D,0x0F,0x04,0x80,0x00,0x10,0x04,0x80,0x00,0x61,0x00,0x80,0x00,
0x40,0x06,0x80,0x00,0x86,0x00,0x80,0x00,0x07,0x08,0x00,0x00,0x01,0x00,0x80,0x00,
0x03,0x00,0x80,0x00,0x00,0x9F,0xFF,0xFF,0x64,0x00,0x80,0x00,0x01,0xE0,0x00,0x00,
0xB8,0x93,0x80,0x00,0x00,0x65,0x22,0x0A,0x22,0x0B,0x10,0xA0,0x1A,0x50,0x03,0xA1,
0xFF,0x97,0x62,0x9C,0x64,0xA1,0x00,0xA0,0xFF,0x97,0x5E,0x9C,0x06,0xA0,0xFF,0x97,
0x45,0x9C,0x01,0xEC,0x06,0xA0,0xFF,0x97,0x57,0x9C,0x1B,0x0B,0xF0,0xA2,0x1A,0x40,
0x1A,0x09,0x00,0xA2,0x06,0xB3,0x1A,0x40,0x03,0xB3,0x1A,0x40,0x0A,0x20,0x18,0x0A,
0x00,0xA3,0x13,0x40,0x17,0x0A,0x13,0xA1,0x11,0x40,0x17,0x08,0x01,0xBA,0x13,0x40,
0x02,0xA2,0x02,0x40,0x01,0xB0,0x01,0x40,0x14,0x09,0x0B,0x40,0x07,0xB1,0x0A,0x40,
0x13,0x0A,0x13,0x40,0x13,0x0A,0x13,0x40,0x01,0xA3,0x01,0xB2,0x13,0x40,0x12,0x0A,
0x13,0x40,0x12,0x0A,0x12,0x0B,0x12,0xF4,0x12,0xFC,0x1A,0x20,0x11,0x08,0xF0,0xA2,
0x00,0xA1,0xFF,0x97,0xCC,0x9C,0x10,0x0B,0x82,0xA2,0x1A,0x40,0x00,0x6D,0xC0,0x46,
0x00,0x9E,0x80,0x00,0x7C,0x93,0x80,0x00,0x00,0x04,0x80,0x00,0x0A,0x04,0x80,0x00,
0x0E,0x04,0x80,0x00,0x0C,0x02,0x80,0x00,0x0D,0x02,0x80,0x00,0x01,0x02,0x80,0x00,
0x12,0x02,0x80,0x00,0x15,0x04,0x80,0x00,0x17,0x02,0x80,0x00,0x80,0x8D,0x80,0x00,
0x14,0x02,0x80,0x00,0x00,0xE0,0x80,0x00,0x6B,0x00,0x80,0x00,0x18,0x0B,0x1B,0x58,
0x9A,0x49,0x07,0xA1,0x11,0x00,0x17,0x0A,0x20,0xB1,0x11,0x40,0x19,0x29,0x16,0x0A,
0x89,0xF5,0x89,0xFF,0x11,0x40,0x19,0x4A,0x0A,0xB2,0x11,0x20,0x99,0x28,0x0E,0xBA,
0x11,0x20,0x59,0x29,0x02,0xB2,0x11,0x20,0x19,0x4B,0x0F,0xB2,0x11,0x40,0x9A,0x29,
0x18,0xEC,0x0E,0x0B,0x12,0xFA,0x1A,0x40,0xF6,0xB3,0xFF,0xB3,0xFF,0xA2,0x0C,0x09,
0x1A,0x40,0x16,0xB0,0x00,0xA3,0xC2,0x1C,0x00,0xAA,0x02,0xC0,0x8A,0xE8,0x3F,0xB2,
0x13,0x40,0x01,0xB3,0x30,0xAB,0xF6,0xC1,0x06,0x0B,0x02,0xA2,0x1A,0x40,0x70,0x07,
0x7C,0x93,0x80,0x00,0x0D,0x04,0x80,0x00,0x06,0x02,0x80,0x00,0x17,0x02,0x80,0x00,
0x00,0x8E,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x06,0x0A,0x06,0x0B,0x1A,0x50,
0xFF,0x97,0xB0,0x9C,0x05,0x0A,0x80,0xA3,0x11,0x58,0xDB,0xF1,0x0B,0x03,0x13,0x50,
0x00,0x6D,0xC0,0x46,0x09,0xF0,0x00,0x00,0x20,0x06,0x80,0x00,0x40,0x06,0x80,0x00,
0xF0,0x65,0x17,0x0B,0x9C,0x4D,0x17,0x0A,0x17,0x0B,0x18,0x09,0x00,0xAC,0x07,0xC0,
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x15,0x0C,0x09,0xF1,0x1C,0x80,
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x11,0x0C,0x09,0xF1,0x07,0x80,
0x1E,0x48,0xB6,0xF0,0x36,0x19,0x8E,0xEB,0xC6,0x00,0x16,0x20,0x01,0xB3,0x02,0xB2,
0xAB,0x02,0xF5,0xC1,0x0B,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x17,0x28,0x8E,0xEB,
0xC6,0x00,0xF6,0xE9,0x16,0x20,0x01,0xB3,0x02,0xB2,0xAB,0x02,0xF3,0xC1,0xF0,0x6D,
0x2C,0x8F,0x80,0x00,0xFC,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0x6C,0x90,0x80,0x00,
0x80,0x8D,0x80,0x00,0x04,0x0A,0x05,0x0B,0x10,0x58,0x11,0x58,0x0B,0x00,0x13,0x50,
0x80,0xA3,0x5B,0xF4,0x18,0x00,0x70,0x07,0x40,0x06,0x80,0x00,0xFF,0xFF,0xFF,0xFE,
0x70,0x65,0x2B,0x0B,0x00,0xA6,0x1E,0x40,0x2A,0x0D,0x2B,0x58,0x9B,0x49,0x35,0xAB,
0x4D,0xC1,0xFA,0xA0,0x80,0xF0,0x02,0x90,0xA5,0x9A,0x27,0x0C,0x29,0x58,0x20,0xEC,
0x0C,0xA2,0x02,0x90,0xE2,0x9A,0x20,0xEC,0x08,0xA1,0x02,0x90,0xF9,0x9A,0x23,0x48,
0x00,0xA8,0x35,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x31,0xC1,0x42,0xAB,0x0B,0xC1,
0x1E,0x0B,0x1A,0x58,0x05,0xA1,0x51,0x40,0x22,0x49,0xC1,0xAA,0x28,0xC1,0x1C,0x0A,
0x01,0xA1,0x11,0x40,0x1B,0x58,0x11,0x80,0x98,0xAB,0x21,0xC1,0x17,0x0B,0x1A,0x58,
0x05,0xA3,0x53,0x40,0xE1,0x48,0xA3,0x48,0x09,0xF2,0x19,0x03,0x15,0x0B,0x99,0x02,
0x16,0xC1,0x23,0x49,0x55,0xAB,0x03,0xC1,0x56,0x40,0x13,0x0B,0x5E,0x40,0x0F,0x80,
0xAA,0xAB,0x0D,0xC1,0x11,0x08,0xCC,0xA1,0x02,0x90,0xB8,0x9A,0x00,0xA8,0x03,0xC1,
0x00,0x90,0x44,0x9D,0xFF,0x97,0x1A,0x9F,0x08,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,
0x03,0x0B,0x08,0xA2,0x1A,0x40,0x03,0x0B,0x1B,0x58,0x30,0xA2,0x9A,0x41,0x70,0x6D,
0x83,0x00,0x80,0x00,0x24,0x8F,0x80,0x00,0x0C,0x8F,0x80,0x00,0x28,0x8F,0x80,0x00,
0x03,0x00,0x80,0x00,0x36,0x35,0x00,0x00,0x2C,0x8F,0x80,0x00,0x00,0x9E,0x80,0x00,
0x30,0x65,0x04,0x3C,0x80,0xF0,0x24,0xE8,0x20,0x58,0x03,0x3D,0x00,0xA8,0x05,0xC0,
0x00,0xA9,0x03,0xC0,0x00,0xA3,0x23,0x50,0x01,0xA0,0x10,0x80,0x0B,0xAD,0x08,0xC8,
0x19,0xF1,0xCB,0xEA,0x93,0x02,0x09,0xC2,0x28,0xAA,0x07,0xC9,0x01,0xA3,0x23,0x50,
0x04,0x80,0x00,0xA0,0x64,0xAD,0x02,0xC9,0x20,0x50,0x00,0x80,0x00,0xA0,0x30,0x6D,
0xF0,0x65,0x92,0x60,0x11,0x33,0x7D,0x0B,0x1B,0x58,0x7C,0xB3,0x1B,0x28,0x0C,0x33,
0x03,0x28,0x14,0xEC,0x1A,0xF4,0x05,0xEC,0x0E,0xEC,0x79,0x0F,0x00,0xAA,0x00,0xCC,
0x89,0x83,0x39,0x1D,0x77,0x0A,0x00,0xA9,0x00,0xC1,0xF9,0x82,0x76,0x08,0x67,0xF1,
0x38,0xE8,0x03,0x30,0x12,0x1D,0x0A,0x32,0x00,0xA2,0x08,0xA9,0x00,0xC1,0x0A,0x3A,
0xE7,0xF0,0xBA,0xE8,0x71,0x08,0x52,0xF0,0x10,0x1A,0x0F,0x30,0x70,0x08,0x10,0x1A,
0x0A,0x3A,0x10,0x30,0x07,0xB2,0x07,0xA0,0x10,0x00,0x1B,0xF4,0x84,0x06,0x1B,0xE4,
0x07,0x33,0x67,0x04,0x69,0x0A,0x7F,0xF0,0xBA,0x1A,0x9B,0xEA,0x0D,0x32,0x00,0xA2,
0xB0,0x1E,0x05,0x33,0x09,0x30,0x66,0x0B,0xFF,0x1A,0x0E,0x37,0xC7,0xEB,0x05,0x38,
0xC2,0xE7,0x83,0xE8,0x53,0x00,0x1B,0xF4,0xF8,0xE7,0x1B,0xFC,0x04,0x33,0x3B,0xE8,
0x43,0x00,0x60,0x0A,0x1B,0xF4,0x1B,0xFC,0x0B,0x37,0x03,0x38,0x06,0x33,0x03,0x32,
0x00,0xA7,0x00,0xA2,0x8C,0x06,0x08,0x34,0x16,0x80,0x10,0xD8,0x01,0xA1,0x3B,0xEC,
0x21,0x02,0x0F,0xC0,0xE3,0xF3,0x57,0x09,0x03,0x3C,0x1B,0xFC,0x8C,0x02,0x02,0xC0,
0x9C,0x02,0x03,0xC3,0x03,0x80,0x1F,0xEC,0x03,0x33,0x00,0x80,0x03,0x33,0x9F,0x02,
0x00,0xC8,0x3B,0xEC,0x01,0xB2,0x1F,0xEC,0x62,0x05,0xE6,0xC3,0x03,0x3A,0xD0,0xEB,
0x00,0xF4,0x08,0x3C,0x00,0xFC,0x64,0xAF,0x07,0xC9,0x4A,0x0B,0x11,0xEC,0x79,0x03,
0x58,0x03,0xFF,0x97,0xB3,0x99,0x00,0xF4,0x00,0xFC,0x04,0x39,0x00,0xA3,0x08,0x33,
0x02,0xA9,0x1E,0xC9,0x2B,0xA3,0x63,0x03,0x43,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,
0x05,0xAB,0x16,0xC0,0x0D,0x3A,0x0F,0x39,0x53,0xEA,0x05,0x3A,0x53,0x03,0x06,0x39,
0xDB,0xFF,0x08,0x33,0x0B,0xEC,0x04,0x39,0x5B,0xE8,0x1E,0xAB,0x09,0xCD,0x13,0xA8,
0x07,0xC8,0x8F,0xA2,0x00,0xA3,0xBA,0x02,0x5B,0x01,0x08,0x3A,0x5B,0x02,0x1A,0x00,
0x08,0x32,0x06,0x3F,0x00,0xA3,0x05,0x33,0x02,0xAF,0x1D,0xC9,0x2B,0xA3,0x63,0x03,
0x31,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,0x05,0xAB,0x15,0xC0,0x0E,0x39,0x10,0x3A,
0x0B,0x3F,0x8B,0xEA,0x7B,0x03,0xDB,0xFF,0x05,0x33,0x13,0xA8,0x0C,0xC8,0x06,0x38,
0x03,0xEC,0x04,0x38,0x1B,0xE8,0x1E,0xAB,0x06,0xCD,0x03,0x39,0x05,0x3A,0x45,0xA3,
0x8B,0x02,0x9B,0x01,0x1A,0x00,0x05,0x32,0x0C,0x3B,0x1B,0xFA,0x0B,0x33,0x07,0x3A,
0x09,0x3B,0x0D,0x38,0x0E,0x39,0xFF,0x97,0x85,0x9A,0x0B,0x3F,0x1F,0x0A,0xA3,0xF0,
0xB8,0x02,0x05,0xC2,0xD1,0x18,0x1D,0xA9,0x4F,0xC8,0x01,0xB1,0xD1,0x10,0x4C,0x80,
0x00,0xA1,0xD1,0x10,0x0B,0x39,0x4A,0xF0,0x90,0x02,0x46,0xC2,0x18,0x0A,0xD2,0x18,
0x04,0xAA,0x42,0xCC,0x17,0x09,0x2A,0x28,0xCB,0x18,0x11,0xF4,0x09,0xE4,0xC9,0xEA,
0x01,0xA9,0x01,0xCD,0x9A,0xEC,0x02,0x80,0x01,0xB1,0x02,0xCA,0x9A,0xEE,0x12,0xF4,
0x12,0xFC,0x2A,0x20,0x10,0x0A,0x33,0x28,0xA1,0xF0,0x8A,0x18,0x19,0xF4,0x09,0xE4,
0x89,0xEA,0x01,0xA9,0x1A,0xCD,0x93,0xEC,0x1B,0x80,0xC0,0x46,0x7C,0x93,0x80,0x00,
0xCC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xAC,0x8E,0x80,0x00,0x98,0x8E,0x80,0x00,
0xD8,0x8E,0x80,0x00,0x10,0x27,0x00,0x00,0x4C,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,
0xF4,0x8E,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0x01,0xB1,0x02,0xCA,
0x93,0xEE,0x1B,0xF4,0x1B,0xFC,0x33,0x20,0xCC,0x09,0x00,0xA7,0xE8,0x1F,0xA2,0xF0,
0x50,0x10,0x1B,0xF4,0xCA,0x09,0x1B,0xE4,0x53,0x10,0xCA,0x0B,0xA7,0xF0,0xFB,0x18,
0x03,0x33,0x1A,0xF4,0xC8,0x0B,0xFB,0x18,0x04,0x33,0x19,0xF4,0xC7,0x0B,0xDB,0x1B,
0x06,0x33,0xC7,0x0B,0xDB,0x1B,0x07,0x33,0x2B,0xA3,0x18,0xEC,0x60,0x03,0xC5,0x0B,
0x18,0xE8,0x09,0x30,0x03,0xEC,0x02,0xB3,0xDB,0x4F,0x12,0xFC,0x09,0xFC,0x05,0xAB,
0x00,0xC0,0x8E,0x80,0xC0,0x08,0x03,0x1D,0x02,0xAB,0x00,0xC8,0x4D,0x81,0x08,0x3B,
0x05,0x38,0x03,0x02,0x00,0xC0,0x48,0x81,0x12,0xF4,0x09,0xF4,0x12,0xE4,0x09,0xE4,
0x03,0x32,0x04,0x31,0x07,0x3A,0x06,0x39,0x08,0xF4,0x11,0xF4,0x00,0xE4,0x09,0xE4,
0x03,0x3A,0x04,0x3B,0xFF,0x97,0xF6,0x99,0x64,0xA8,0x20,0xC9,0xB3,0x0B,0xFB,0x18,
0x03,0xAB,0x1C,0xC8,0xB0,0x0B,0x1A,0x1D,0x03,0xAA,0x18,0xC9,0x09,0x3B,0x03,0xB3,
0xDB,0x4F,0x02,0xAB,0x13,0xC1,0xAE,0x0B,0x1B,0x1D,0x00,0xAB,0x0F,0xC0,0x00,0xA3,
0x04,0xAA,0x03,0xC0,0x0A,0x3B,0x07,0xA2,0x04,0xB3,0x13,0x00,0xE2,0xF0,0xD3,0xE8,
0xA8,0x0A,0x5B,0xF0,0x9A,0x1A,0x06,0x32,0xA7,0x0A,0x9A,0x1A,0x07,0x32,0x06,0x38,
0x03,0x3A,0x07,0xF4,0x03,0x39,0x3F,0xE4,0x79,0xEA,0x07,0x38,0xD7,0xEB,0xFB,0xF0,
0xDF,0xE9,0x04,0x3A,0x09,0x31,0x03,0xF4,0x04,0x39,0x1B,0xE4,0x59,0xEA,0xD3,0xEA,
0xDA,0xF0,0xD3,0xE8,0x5B,0xF0,0x06,0x33,0x12,0xA3,0x0C,0x31,0x07,0x33,0x7F,0xF0,
0xFB,0xE7,0x1B,0xFF,0x06,0x39,0xDB,0xE9,0x03,0x38,0x1B,0xE1,0xC0,0xE8,0xCB,0xE7,
0x1B,0xFF,0x5B,0xE8,0x04,0x3A,0x1B,0xE1,0xD2,0xE8,0x08,0x30,0xB8,0xA3,0x05,0x32,
0x00,0x33,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x08,0x3A,0x05,0x3B,0x02,0x90,0x86,0x98,
0x00,0xA8,0x0B,0xC0,0x06,0x3A,0x07,0x38,0x13,0xEC,0x0C,0x3A,0x09,0x39,0x01,0xB8,
0x9B,0xE8,0x07,0x30,0x7F,0xE8,0x06,0x33,0x00,0xA8,0xD9,0xC1,0x08,0x3F,0x00,0xAF,
0x01,0xCC,0x01,0xA0,0x08,0x30,0x05,0x39,0x00,0xA9,0x01,0xCC,0x01,0xA2,0x05,0x32,
0x20,0xA7,0x6B,0x06,0xFB,0x1A,0x14,0xA0,0x6F,0x06,0xC7,0x1B,0x2B,0x20,0x37,0x20,
0xC3,0x80,0x07,0xAB,0x00,0xC0,0xC0,0x80,0x12,0xF4,0x12,0xE4,0x94,0x06,0x07,0x3A,
0x09,0xF4,0x10,0xF4,0x09,0xE4,0x00,0xE4,0x40,0xEA,0x06,0x3F,0xC3,0xE7,0xC0,0xE8,
0x3A,0xF4,0x58,0x00,0x12,0xE4,0x63,0x06,0xD2,0xEA,0xD7,0xE7,0xD2,0xE9,0x7A,0x00,
0x82,0xE8,0x00,0xA0,0x33,0x1E,0x59,0xEA,0x00,0xA0,0x2F,0x1E,0x05,0x33,0xCB,0xE7,
0xC8,0xE8,0x61,0x06,0x58,0x00,0x7B,0xEA,0xD9,0xE7,0x5B,0xE8,0x4B,0x00,0xC1,0xE8,
0x65,0x0B,0x1B,0x1D,0x9C,0x06,0x01,0xA3,0x23,0xA9,0x00,0xCC,0x00,0xA3,0x1B,0xF6,
0x00,0xAB,0x03,0xC0,0x01,0xA0,0x23,0xA3,0x84,0x05,0x1E,0xC0,0x01,0xA3,0x05,0xAA,
0x00,0xCC,0x00,0xA3,0x1B,0xF6,0x00,0xAB,0x12,0xC0,0x07,0xA3,0x9C,0x05,0x0F,0xC8,
0x53,0xF0,0x99,0x02,0x0C,0xCD,0x48,0xE0,0x84,0x06,0x94,0x05,0x03,0xCC,0xD0,0xEC,
0x84,0x06,0x8C,0x05,0x08,0xCB,0x96,0xAB,0x07,0xCD,0x1B,0xE1,0x96,0xB3,0x04,0x80,
0x96,0xA3,0x96,0xA9,0x01,0xCC,0x70,0x80,0x03,0xEC,0x03,0x38,0x03,0x39,0xC9,0xEB,
0x3F,0xEA,0x08,0x37,0x0C,0x31,0x08,0x39,0x3F,0xF1,0x7F,0xEA,0x04,0x38,0x05,0x39,
0x40,0xEA,0x0F,0x30,0x04,0x38,0x08,0xEA,0x05,0x30,0x05,0x39,0x00,0xF1,0x02,0x32,
0x40,0xEA,0x9C,0x06,0x0F,0xA1,0xFB,0xE7,0x1B,0xFF,0xDB,0xE9,0x1B,0xE1,0x09,0x33,
0xC3,0xE7,0x1B,0xFF,0x1B,0xE8,0x1B,0xE1,0x06,0x33,0x04,0x3B,0x1A,0xEC,0x06,0x3B,
0xD2,0xE8,0x06,0x3B,0x07,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,0x10,0x33,0x09,0x3B,
0x1A,0xEC,0x03,0x3B,0xD2,0xE8,0x09,0x3B,0x06,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,
0x09,0x33,0x10,0x3B,0x1A,0xEC,0x09,0x3B,0xD2,0xE8,0x09,0x32,0x0F,0x3A,0x0C,0x3B,
0x80,0xE8,0x09,0x3A,0xFF,0xE8,0x01,0xB9,0x01,0xA3,0x62,0x05,0x00,0xCC,0x00,0xA3,
0x1B,0xF6,0x00,0xAB,0x01,0xC0,0x00,0xA9,0xCD,0xCC,0x02,0x3A,0x09,0x3B,0x93,0x02,
0x14,0xCC,0x08,0x3F,0x02,0xB1,0x3B,0xEC,0x4B,0x03,0xDA,0xE7,0x12,0xFF,0xD3,0xE8,
0x05,0x3A,0x51,0x03,0x03,0x38,0x1B,0xE1,0x1B,0xE8,0x2B,0x20,0xCB,0xE7,0x1B,0xFF,
0x59,0xE8,0x04,0x3B,0x09,0xE1,0xC9,0xE8,0x31,0x20,0x07,0x80,0x18,0xA0,0x6F,0x06,
0xC7,0x1B,0x1C,0xA1,0x68,0x06,0x08,0x1A,0x2F,0x20,0x30,0x20,0x13,0x0A,0x06,0x39,
0xA3,0xF0,0x99,0x10,0x07,0x3F,0x12,0x0A,0x9F,0x10,0x12,0x0A,0xA3,0xF0,0x99,0x18,
0x12,0x0A,0x99,0x10,0x10,0x0A,0x99,0x18,0x11,0x0A,0x99,0x10,0x00,0xA0,0x2A,0x1E,
0x00,0xA1,0x73,0x1E,0x0D,0x38,0x0E,0x39,0xFF,0x97,0xAC,0x98,0x0B,0x3A,0x90,0x02,
0x00,0xC2,0x77,0x80,0x0C,0x0B,0x1F,0x1D,0x00,0xAF,0x4B,0xC0,0x0C,0x0B,0x1B,0x1D,
0x00,0xAB,0x1B,0xC0,0x00,0xA3,0x03,0xAF,0x1C,0xC9,0x43,0x80,0x04,0x8F,0x80,0x00,
0x08,0x8F,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xD4,0x8E,0x80,0x00,
0xEC,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,0xCC,0x8E,0x80,0x00,0x00,0x8F,0x80,0x00,
0x78,0x93,0x80,0x00,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,0x00,0xA3,0x08,0xAF,
0x00,0xC1,0x0A,0x3B,0xE1,0xF0,0xCB,0xE8,0x73,0x09,0x5B,0xF0,0x00,0xA0,0x2A,0x1E,
0x59,0x1E,0x51,0xEA,0xCA,0xE7,0x89,0xE8,0x70,0x08,0x51,0x00,0x1B,0x1A,0x32,0x28,
0x00,0xA9,0x0E,0xC0,0x18,0xF4,0x12,0xF4,0x12,0xE4,0x00,0xE4,0x10,0xEA,0xC3,0xE7,
0xC0,0xE8,0x58,0x00,0x64,0xA3,0x58,0x03,0xFE,0x97,0x40,0x9F,0x00,0xF4,0x00,0xFC,
0x00,0x80,0x67,0x08,0x0A,0x39,0xE2,0xF0,0x52,0xE8,0x40,0xF0,0x65,0x0B,0x92,0xF0,
0x01,0xB0,0xD0,0x10,0x0A,0x3A,0xE3,0xF0,0x29,0x28,0x9B,0xE8,0x5E,0x0A,0x5B,0xF0,
0x99,0x12,0x5E,0x0A,0x31,0x28,0x99,0x12,0x0A,0x3B,0x07,0xA2,0x01,0xB3,0x1A,0x00,
0x5D,0x0B,0x1A,0x15,0x07,0xAF,0x15,0xC8,0x5C,0x0B,0x01,0xB7,0x1F,0x15,0x11,0x80,
0x55,0x08,0x21,0xF1,0x0B,0x12,0x55,0x0B,0x30,0x28,0xC8,0x12,0x01,0xA3,0x13,0x15,
0x3B,0x15,0x57,0x0A,0x00,0xA7,0xE9,0x1F,0xA3,0xF0,0x99,0x10,0x00,0xA0,0x31,0x1E,
0x54,0x0A,0x99,0x10,0xE3,0xF0,0x54,0x0A,0x1B,0xE9,0x5B,0xF0,0x99,0x1C,0xD3,0xE8,
0x5A,0x48,0x12,0xF2,0x0A,0x03,0x03,0x32,0xD9,0x48,0x9A,0x48,0x09,0xF2,0x11,0x03,
0x0A,0x31,0x5A,0x49,0x19,0x49,0x12,0xF2,0x0A,0x03,0x63,0xF0,0x04,0x32,0x1B,0xE9,
0x4A,0x0A,0x5B,0xF0,0xD3,0xE8,0x5B,0x49,0x00,0xAB,0x50,0xC0,0x48,0x09,0xA7,0xF0,
0x79,0x18,0x48,0x0A,0x8C,0x06,0xB9,0x18,0x00,0xA3,0xEA,0x1E,0x00,0xA0,0x33,0x1E,
0x60,0x06,0xFF,0x97,0x07,0x98,0x11,0x39,0x8A,0xF0,0x52,0xE8,0x91,0xF0,0x42,0x0B,
0x52,0xE8,0x42,0x09,0xF8,0x10,0x8A,0xE8,0x10,0x4A,0x04,0x39,0x84,0x06,0x50,0x4A,
0x0A,0xF4,0x52,0xE4,0x00,0xF2,0x61,0x06,0x12,0xF4,0x01,0x03,0x12,0xFC,0x91,0x02,
0x2D,0xC2,0x0A,0x38,0x02,0xF4,0x12,0xE4,0x04,0x32,0x04,0x38,0x00,0xA2,0xB1,0x1E,
0x41,0xEA,0x18,0xB1,0x30,0xA9,0x22,0xC8,0x03,0x3A,0x11,0xF4,0x00,0xA2,0xA8,0x1E,
0x09,0xE4,0x08,0xEA,0x1D,0xB0,0x3A,0xA8,0x19,0xC8,0x2D,0x08,0x38,0x18,0x84,0x06,
0x8C,0x05,0x14,0xC1,0x2B,0x0A,0x04,0x38,0xB9,0x18,0x81,0x02,0x0F,0xC1,0x28,0xA2,
0x69,0x06,0x51,0x1A,0x0C,0xA0,0x6A,0x06,0x82,0x1A,0x31,0x20,0x2A,0x20,0x1F,0x0A,
0x12,0x1D,0x01,0xAA,0x01,0xC8,0x00,0xA2,0x00,0x80,0x01,0xA2,0xFA,0x10,0x24,0x0B,
0x1B,0x58,0x76,0xB3,0x1B,0x28,0x0F,0xA2,0x13,0x00,0x28,0xEC,0x31,0xEC,0xB9,0xA2,
0x00,0x90,0x26,0x99,0x15,0x80,0x13,0x0B,0x60,0xF1,0xC0,0xE8,0x00,0xA1,0x08,0xA2,
0xFE,0x97,0xE5,0x9F,0x10,0x0A,0x00,0xA3,0x13,0x15,0x1A,0x0A,0x03,0xA1,0x11,0x15,
0x19,0x09,0xA2,0xF0,0x53,0x10,0x19,0x09,0x3B,0x15,0x53,0x10,0x12,0x0B,0xFF,0xA1,
0xD1,0x10,0x00,0xA3,0xEA,0x1E,0x0E,0x0B,0xA4,0xF0,0xE2,0x10,0x00,0xA7,0xF2,0x1F,
0x0C,0x0B,0x12,0x60,0xE2,0x10,0xF0,0x6D,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,
0x90,0xE2,0x00,0x00,0xAC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xCC,0x8E,0x80,0x00,
0xD4,0x8E,0x80,0x00,0xEC,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xE8,0x93,0x80,0x00,
0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xF4,0x8E,0x80,0x00,0x48,0x93,0x80,0x00,
0x7C,0x93,0x80,0x00,0xE8,0x8E,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,
0xF0,0x65,0x51,0x0B,0x88,0x60,0x06,0x31,0x1B,0x58,0x05,0x30,0x06,0x28,0x06,0x38,
0x76,0xB3,0x19,0x28,0x00,0x28,0x14,0xEC,0x49,0xF9,0x02,0x30,0x00,0xAE,0x01,0xC0,
0x00,0xA9,0x03,0xC1,0x49,0x0B,0xA2,0xF0,0x00,0xA0,0xD0,0x10,0x47,0x0A,0xA3,0xF0,
0x94,0x06,0x98,0x18,0x02,0x3A,0x12,0xF4,0x37,0xF4,0x45,0x0D,0x04,0x32,0x00,0xA8,
0x05,0xC1,0x3F,0xE4,0x60,0x06,0x12,0xE4,0x1F,0x10,0xEA,0x10,0x7A,0x80,0x00,0xF4,
0x02,0xFC,0xED,0x1A,0x3F,0xE4,0x03,0xE4,0x07,0x32,0x04,0x3A,0xFB,0xEA,0xD8,0xE7,
0x12,0xE4,0x1B,0xE8,0x04,0x32,0x43,0x00,0x2A,0xF4,0x04,0x38,0x12,0xE4,0x82,0xEA,
0xD0,0xE7,0x12,0xE8,0x03,0x35,0x42,0x00,0x8B,0x02,0x02,0xC9,0x14,0xA5,0x8A,0x02,
0x39,0xC8,0xD3,0xE8,0x1A,0xF1,0xD3,0xEA,0x58,0xF0,0xFE,0x97,0x0B,0x9E,0x85,0xEE,
0x05,0xA8,0x03,0xC8,0x00,0xA5,0x02,0xA8,0x00,0xC9,0x45,0xEE,0xB4,0xA3,0x00,0x33,
0xA7,0xA3,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x3A,0xEC,0x04,0x3B,0x01,0x90,0xFE,0x9D,
0x00,0xF6,0x00,0xFE,0x01,0xA8,0x04,0xC1,0x26,0x0B,0xA2,0xF0,0xD3,0x18,0x9B,0xF8,
0x15,0x80,0x02,0xA8,0x04,0xC1,0x23,0x0B,0xA2,0xF0,0xD3,0x18,0xDB,0xF8,0x0E,0x80,
0x2B,0xA3,0x63,0x03,0x20,0x0A,0xD3,0xE8,0x05,0xB3,0xDB,0x4F,0x01,0xAB,0x07,0xC9,
0x1C,0x0B,0xA2,0xF0,0xD3,0x18,0x07,0xA2,0x9A,0x02,0x9B,0x01,0x5B,0x02,0xED,0xE8,
0x14,0xAD,0x00,0xC9,0x14,0xA5,0x1F,0xA2,0x02,0x38,0x6B,0xEC,0x55,0xEB,0x07,0x3A,
0x36,0xF4,0x11,0xF4,0x02,0xF4,0x03,0x38,0x12,0xE4,0x36,0xE4,0x09,0xE4,0x5E,0x03,
0x69,0x03,0x53,0x03,0x02,0xF4,0x12,0xE4,0x55,0x03,0x71,0xE8,0x10,0xB1,0x05,0x3A,
0xC9,0xF2,0x5B,0xE9,0x09,0xFC,0x10,0xB3,0x11,0x20,0xDB,0xF2,0x07,0x0A,0x06,0x38,
0x09,0xF4,0x1B,0xFC,0xA4,0xF0,0x09,0xE4,0x03,0x20,0xA1,0x10,0x1B,0xF4,0x04,0x0A,
0x1B,0xE4,0xA3,0x10,0x08,0x60,0xF0,0x6D,0x7C,0x93,0x80,0x00,0x04,0x8F,0x80,0x00,
0x08,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x30,0x65,0x02,0xEC,
0x00,0xA3,0x01,0x80,0x52,0xE0,0x01,0xB3,0x1F,0xAA,0xFB,0xCC,0x11,0xEC,0x99,0x00,
0x41,0xEA,0x09,0xAB,0x03,0xCD,0x18,0xEC,0x0A,0xB8,0x01,0x01,0x02,0x80,0x0A,0xA0,
0xC0,0xEA,0x81,0x00,0x08,0xEC,0x0C,0x0C,0x51,0xF0,0x01,0xB2,0x52,0xF0,0x09,0x1F,
0x12,0x1F,0x52,0xEA,0x42,0x03,0x92,0xE2,0x52,0xE8,0xD9,0xF7,0x05,0xC5,0x07,0x09,
0x4A,0x03,0x80,0xA5,0xED,0xF1,0x52,0xE9,0xD2,0xE3,0x58,0xE0,0x80,0xA1,0x82,0x00,
0x09,0xF1,0x50,0xE8,0x00,0xE3,0x30,0x6D,0x04,0x8D,0x80,0x00,0x05,0xB5,0x00,0x00,
0xF0,0x65,0x82,0x60,0x01,0x30,0x15,0xF4,0x18,0xF4,0x01,0x3B,0x2C,0xE4,0x00,0xE4,
0x2D,0xFC,0x1F,0x28,0x28,0xEA,0x00,0xF4,0x00,0xE4,0x0E,0xEC,0x3F,0xF4,0x00,0xA3,
0xC9,0x1E,0x02,0xEC,0x3F,0xE4,0x09,0xEB,0x50,0x03,0x3A,0xEB,0x00,0x32,0x0A,0xEC,
0x51,0x03,0x00,0x3A,0x13,0xEC,0x53,0x03,0xC9,0xE8,0x81,0x02,0x23,0xCB,0x80,0xF3,
0xFE,0x97,0x4C,0x9D,0xFF,0x97,0xAA,0x9F,0xA7,0x02,0x06,0xCA,0xE7,0xEB,0x47,0x03,
0x01,0x3B,0xFF,0xF9,0xEF,0xEB,0x1F,0x20,0x06,0x80,0x00,0x3A,0x13,0xEC,0x43,0x03,
0x01,0x3A,0xDB,0xF9,0xEB,0xE8,0x13,0x20,0x33,0x28,0x1B,0xF4,0x1B,0xE4,0xA3,0x02,
0x04,0xCA,0xE4,0xEA,0x60,0x03,0xC0,0xF9,0x2D,0xEA,0x03,0x80,0x1C,0xEB,0x60,0x03,
0xC0,0xF9,0x2D,0xE8,0x35,0x20,0x02,0x60,0xF0,0x6D,0xC0,0x46,0xF0,0x65,0x58,0x0B,
0x08,0xA2,0x1A,0x40,0x57,0x0B,0x1D,0x58,0x2B,0xEC,0x08,0xB3,0xDA,0x2F,0x56,0x0B,
0x10,0xF7,0x99,0xED,0xC0,0xFF,0xC8,0x47,0x96,0xFA,0x22,0xB1,0x0E,0x40,0x91,0xF5,
0x89,0xFE,0x09,0xF6,0x0C,0xFE,0x29,0xA7,0xFC,0x14,0x07,0xA7,0x17,0x00,0xDA,0xED,
0xD7,0x47,0x4E,0x0A,0x34,0xEB,0xD4,0x47,0x2A,0xEC,0x4C,0xB2,0x17,0x28,0x3A,0xFA,
0x5A,0x42,0x1F,0x42,0x2A,0xEC,0x4E,0xB2,0x14,0x28,0x83,0x60,0x01,0x34,0x12,0x48,
0x9A,0x42,0x22,0xFA,0xDA,0x42,0x2A,0xEC,0x48,0xB2,0x14,0x48,0x9C,0x44,0x52,0x48,
0xDA,0x44,0x2A,0xEC,0x4A,0xB2,0x14,0x48,0x1C,0x44,0x52,0x48,0x1C,0xEC,0x5A,0x44,
0x2A,0xB4,0x4A,0xFE,0x22,0x40,0x2B,0xB3,0x00,0xA8,0x02,0xC0,0x89,0xFE,0x19,0x40,
0x00,0x80,0x1A,0x40,0x38,0x0C,0x72,0xA3,0x01,0xA0,0x23,0x43,0xA3,0x43,0x60,0x43,
0xE0,0x43,0x2B,0xEC,0x64,0xB3,0x1B,0x48,0x3F,0xA2,0x1A,0x00,0x63,0xED,0xDA,0x47,
0x00,0xA6,0x1E,0xA3,0xE6,0x45,0xA3,0x45,0x2B,0xEC,0x8E,0xB3,0x18,0x28,0x82,0xF9,
0xFF,0xA3,0x11,0xEC,0x19,0x00,0x18,0x00,0x12,0xFA,0x00,0x31,0x21,0x47,0x62,0x47,
0x02,0x30,0xA0,0x46,0x00,0xA0,0xE0,0x46,0x28,0xEC,0x8A,0xB0,0x00,0x28,0x80,0xF9,
0x01,0xEC,0x19,0x00,0x00,0xFA,0xA1,0x47,0xE0,0x47,0x28,0xEC,0x8C,0xB0,0x00,0x28,
0x03,0x00,0x60,0xEC,0xC3,0x47,0xA3,0xEC,0x00,0xA0,0xD8,0x47,0x6B,0x06,0x1B,0x48,
0x62,0x45,0x23,0x45,0x68,0x06,0x08,0xA1,0x08,0x1C,0x00,0xA1,0x20,0x46,0x61,0x46,
0x01,0x3A,0xB9,0xA1,0x50,0xF3,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x9F,0x9C,0x03,0xFA,
0x20,0x41,0x63,0x41,0x7F,0xF3,0x03,0xFC,0x00,0xFE,0xE0,0x41,0xB9,0xA1,0x38,0xEC,
0xA3,0x41,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x91,0x9C,0x03,0xFA,0x63,0x40,0x03,0xFC,
0x20,0x40,0xA3,0x40,0x00,0xFE,0xE3,0xEC,0x20,0xA2,0xE0,0x40,0xDA,0x47,0x23,0xED,
0x03,0xA2,0xDA,0x47,0x7A,0xB5,0x2B,0x48,0x0F,0xA2,0x13,0x00,0x2C,0xB4,0x23,0x40,
0x07,0x0B,0x01,0xA4,0x03,0x60,0x5C,0x40,0x1E,0x40,0xDE,0x45,0x5E,0x46,0xF0,0x6D,
0x83,0x00,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x74,0x90,0x80,0x00,
0x2C,0x8F,0x80,0x00,0x10,0x65,0x0E,0x0C,0x0E,0x09,0x20,0x58,0xFE,0x97,0xD0,0x9D,
0x00,0xA8,0x14,0xC0,0x0C,0x0B,0x5A,0x48,0x00,0xAA,0x06,0xC0,0x1A,0x48,0x00,0xAA,
0x03,0xC0,0x9B,0x2B,0xA2,0x28,0x9A,0x02,0x09,0xC0,0x08,0x0B,0x66,0xA2,0x1A,0x40,
0x05,0x0B,0x9A,0x2B,0x02,0x0B,0x9A,0x20,0x05,0x0A,0x12,0x58,0x1A,0x50,0x10,0x6D,
0x70,0x8E,0x80,0x00,0x40,0x42,0x0F,0x00,0x2C,0x8F,0x80,0x00,0x0F,0x04,0x80,0x00,
0x34,0x06,0x80,0x00,0x10,0x65,0xFF,0x97,0x2B,0x98,0xFF,0x97,0x8B,0x98,0x01,0x90,
0xAB,0x9C,0x0C,0x0C,0x80,0xA1,0x20,0xEC,0x09,0xF2,0xCC,0xA2,0x01,0x90,0x69,0x9C,
0x20,0xEC,0xCC,0xA1,0x01,0x90,0x7A,0x9C,0x00,0xA8,0x04,0xC1,0xFF,0x97,0x06,0x9F,
0xFF,0x97,0xDC,0x98,0x02,0x80,0x00,0xA3,0x23,0x20,0x63,0x20,0xFF,0x97,0x14,0x99,
0x10,0x6D,0xC0,0x46,0x00,0x9E,0x80,0x00,0x10,0x65,0xFF,0x97,0xDB,0x9F,0x06,0x0C,
0x03,0x80,0xFF,0x97,0xAF,0x9F,0xFF,0x97,0x63,0x99,0x63,0x48,0x00,0xAB,0xF8,0xC0,
0x00,0x90,0x24,0x98,0x10,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,0x10,0x65,0x0A,0x0B,
0x1B,0x48,0x05,0xAB,0x02,0xC1,0x09,0x0B,0xFF,0xA2,0x1A,0x40,0x08,0x0B,0x1A,0x58,
0x08,0x0B,0x09,0x0C,0x1A,0x50,0x00,0xA3,0x23,0x40,0x64,0xA0,0x01,0xA1,0xFE,0x97,
0x59,0x9F,0x08,0xA3,0x23,0x40,0x10,0x6D,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,
0x34,0x06,0x80,0x00,0x68,0x90,0x80,0x00,0x83,0x00,0x80,0x00,0xF0,0x65,0xFE,0x97,
0xD7,0x9C,0x87,0x0B,0x00,0xA2,0x1A,0x41,0xDA,0x46,0x64,0xA2,0x1A,0x46,0x84,0x0B,
0x5B,0x4D,0x00,0xAB,0xFB,0xC0,0x83,0x0B,0x1B,0x58,0xDB,0x28,0x1B,0xFB,0x9C,0x06,
0x81,0x0B,0x00,0xA2,0x1A,0x20,0x81,0x0B,0x28,0xB3,0x1A,0x48,0x00,0xA1,0x57,0xF0,
0x00,0xA3,0x7F,0x08,0x1E,0x80,0x7F,0x0C,0x7F,0x0E,0xE5,0x1A,0xF4,0x1A,0x2D,0xEB,
0x2D,0xF4,0x2D,0xFC,0x7D,0x0E,0x2C,0xF4,0x24,0xE4,0xF5,0x12,0x00,0xAC,0x0D,0xCD,
0x26,0xEC,0x64,0x06,0x74,0x03,0xE4,0xE0,0x2C,0xE9,0x24,0xF4,0x24,0xFC,0xC4,0x12,
0xB4,0xAC,0x06,0xC9,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x02,0x80,0xC4,0xE8,0x00,0xA5,
0x25,0x20,0x02,0xB3,0xBB,0x02,0xDE,0xC1,0x6B,0x0B,0x19,0x20,0x68,0x0B,0x09,0xF6,
0x09,0xFE,0x19,0x45,0x6E,0x0B,0x1B,0x48,0x01,0xAB,0x04,0xC1,0x52,0xF0,0x6D,0x08,
0x67,0x09,0x01,0x90,0xD6,0x9B,0x62,0x0B,0x1A,0x4D,0x00,0xAA,0x0B,0xC1,0xD9,0x4D,
0xA8,0xA9,0x02,0xC9,0x01,0xA2,0x5A,0x46,0x1F,0x80,0xD9,0x4D,0x01,0xB1,0x09,0xF6,
0x09,0xFE,0xD9,0x45,0x01,0x80,0x00,0xA2,0xDA,0x45,0x5A,0x46,0xFE,0x97,0x78,0x9C,
0x01,0x90,0xC4,0x9C,0x00,0x90,0xEC,0x99,0x00,0x90,0x7E,0x9C,0x00,0x90,0x84,0x9F,
0x54,0x0B,0x1B,0x58,0x72,0xB3,0x1B,0x28,0xD8,0xF6,0x02,0xC5,0x5A,0x08,0x00,0x90,
0xC7,0x98,0x00,0x90,0xD4,0x98,0x01,0x90,0x01,0x9C,0x4D,0x0B,0x5A,0x4D,0x00,0xAA,
0xFC,0xC0,0xDB,0x4E,0x00,0xAB,0x08,0xC0,0x54,0x0B,0x55,0x09,0x18,0x58,0xFE,0x97,
0xD7,0x9C,0x00,0xA8,0x01,0xC0,0xFF,0x97,0x59,0x9F,0x45,0x0B,0x5A,0x4E,0x01,0xAA,
0x1C,0xC1,0x4B,0x0B,0x1B,0x48,0x05,0xAB,0x08,0xC1,0x4E,0x08,0xFE,0x97,0xA4,0x9B,
0x4A,0x0B,0x4D,0x09,0x1A,0x58,0x52,0xE8,0x1A,0x50,0x43,0x80,0x4B,0x08,0x00,0xA1,
0xFE,0x97,0xB0,0x9E,0xFE,0x97,0x3C,0x9C,0x3A,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,
0x0F,0xA2,0x1A,0x00,0x39,0x0B,0x01,0xBA,0x2C,0xB3,0x2B,0x80,0x5A,0x4E,0x00,0xAA,
0x2A,0xC1,0xD9,0x48,0x00,0xA9,0x0C,0xC0,0xD9,0x48,0x01,0xB9,0x09,0xF6,0x09,0xFE,
0xD9,0x40,0x01,0xA1,0x19,0x41,0x3E,0x0B,0x1A,0x40,0x3E,0x0B,0x1A,0x58,0x37,0x0B,
0x1A,0x50,0x2B,0x0B,0x1A,0x49,0x01,0xAA,0x02,0xC1,0x52,0xA0,0x01,0xA1,0x07,0x80,
0x1B,0x4D,0x00,0xAB,0x02,0xC0,0x52,0xA0,0x00,0xA1,0x01,0x80,0xB6,0xA0,0x02,0xA1,
0xFE,0x97,0x80,0x9E,0x22,0x0B,0x1A,0x49,0x01,0xAA,0x0B,0xC1,0x00,0xA2,0x1A,0x41,
0x2F,0x0B,0x08,0xA2,0x1A,0x40,0x05,0x80,0x5B,0x4E,0x02,0xAB,0x02,0xC1,0x2E,0x08,
0xFE,0x97,0x5A,0x9B,0x1A,0x0B,0x19,0x4F,0x5A,0x4F,0x12,0xF2,0x0A,0x03,0x01,0xB2,
0xFF,0xA0,0x11,0xF4,0x02,0x00,0x18,0x4F,0x1A,0x47,0x0A,0xFE,0x59,0x4F,0x5A,0x47,
0x1A,0x4E,0x00,0xAA,0x04,0xC0,0x1A,0x4E,0x01,0xBA,0x12,0xF6,0x12,0xFE,0x1A,0x46,
0x0F,0x0B,0xDA,0x4B,0x5A,0x43,0xFE,0x97,0x2F,0x9D,0x20,0x0B,0x66,0xA2,0x1A,0x40,
0x13,0x0B,0x1A,0x48,0x01,0xAA,0x06,0xC1,0x01,0x90,0xE2,0x9C,0x01,0x90,0x1C,0x9D,
0x01,0x90,0x50,0x9C,0x07,0x80,0x1B,0x48,0xFF,0xAB,0x04,0xC1,0x01,0x90,0xD8,0x9C,
0x01,0x90,0x12,0x9D,0xF0,0x6D,0x64,0xA0,0xFE,0x97,0x92,0x9D,0xF7,0x86,0xC0,0x46,
0x2C,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,
0x5C,0x91,0x80,0x00,0xFC,0x90,0x80,0x00,0x9C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
0x03,0x00,0x80,0x00,0xBC,0x91,0x80,0x00,0xE0,0x93,0x80,0x00,0x68,0x90,0x80,0x00,
0xC0,0xFB,0x39,0x00,0x14,0x05,0x00,0x00,0x80,0xB0,0xED,0xFF,0xF3,0x01,0x00,0x00,
0x83,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x89,0xA9,0x03,0x00,0x0F,0x04,0x80,0x00,
0x70,0x65,0x06,0x49,0x84,0xEC,0x05,0xEC,0x32,0xEC,0x21,0xEC,0xFF,0x97,0x60,0x9C,
0x28,0xEC,0x32,0xEC,0x21,0xEC,0x00,0xA3,0xFF,0x97,0x7A,0x98,0x70,0x6D,0xF0,0x65,
0x2E,0x0B,0x1B,0x58,0x76,0xB3,0x1B,0x48,0x1B,0xF6,0x1A,0xFF,0x1B,0xF1,0x84,0x60,
0x1B,0xFF,0x00,0x32,0x00,0xA6,0x01,0x33,0x49,0x80,0x77,0xF0,0x28,0x0B,0xBF,0xE9,
0x7F,0xF0,0xDD,0xE9,0x27,0x0C,0x6A,0x48,0xF9,0x1C,0x12,0xF2,0x63,0x48,0x0A,0x03,
0x21,0x48,0x1B,0xF2,0x0B,0x03,0xA1,0x48,0x09,0xF4,0x0B,0x03,0xE1,0x48,0x12,0xF4,
0x09,0xF6,0x12,0xE4,0x0B,0x03,0x53,0x03,0x1F,0x0A,0x9B,0xE8,0x5B,0xFB,0x03,0x33,
0xEA,0x48,0xA9,0x48,0x63,0x49,0x12,0xF2,0x0A,0x03,0x21,0x49,0x1B,0xF2,0x0B,0x03,
0xA1,0x49,0x09,0xF4,0x0B,0x03,0xE1,0x49,0x12,0xF4,0x09,0xF6,0x12,0xE4,0x0B,0x03,
0x53,0x03,0x15,0x0A,0x9B,0xE8,0x5B,0xFB,0x02,0x33,0xE1,0x4A,0xA3,0x4A,0x09,0xF2,
0x19,0x03,0x00,0x3A,0x02,0x78,0xFE,0x97,0xAC,0x9B,0x61,0x4A,0x23,0x4A,0x09,0xF2,
0x19,0x03,0x01,0x3A,0x03,0x78,0xFE,0x97,0xA4,0x9B,0x03,0x3B,0x08,0x0A,0xD3,0x15,
0x1B,0xFA,0x6B,0x40,0x02,0x3B,0xAB,0x40,0x1B,0xFA,0xEB,0x40,0x01,0xB6,0x07,0x0A,
0xD3,0x4B,0x9E,0x02,0xB1,0xCB,0x04,0x60,0xF0,0x6D,0xC0,0x46,0x7C,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0xFF,0x0F,0x00,0x00,0x2C,0x8F,0x80,0x00,
0xF0,0x65,0x4E,0x0A,0x55,0x28,0x16,0x28,0x2B,0xF1,0x5B,0xEB,0x9B,0xE9,0x9E,0x60,
0x9B,0xE0,0x09,0x33,0x33,0xF1,0x9B,0xEB,0x5B,0xE9,0x9B,0xE0,0x0A,0x33,0x90,0x2A,
0x94,0x28,0x03,0xF1,0x1B,0xEA,0x1B,0xE9,0x9B,0xE0,0x0B,0x33,0x23,0xF1,0x1B,0xEB,
0x1B,0xE8,0x9B,0xE0,0x0C,0x33,0x93,0x2B,0x91,0x29,0x03,0x33,0x03,0x3F,0x1B,0xF1,
0xDB,0xEB,0x5B,0xE8,0x9B,0xE0,0x0D,0x33,0x0B,0xF1,0x5B,0xEA,0xDB,0xE9,0x9B,0xE0,
0x0E,0x33,0xD3,0x2B,0x04,0x33,0x17,0x2C,0x3B,0xF1,0x05,0x37,0xDB,0xEB,0x04,0x3F,
0xDB,0xE9,0x9B,0xE0,0x0F,0x33,0x3B,0xF1,0xDB,0xEB,0x05,0x3F,0xDB,0xE9,0x9B,0xE0,
0x10,0x33,0x00,0xA3,0x07,0x33,0x4A,0x80,0x00,0xAB,0x01,0xC0,0x04,0xAB,0x03,0xC1,
0x04,0xAA,0x37,0xC0,0x00,0xAA,0x35,0xC0,0x91,0xEE,0x08,0xEC,0x41,0x02,0x41,0x01,
0x00,0xA9,0x06,0xC0,0x00,0xAB,0x04,0xC1,0x09,0x3F,0xAE,0x02,0x2B,0xC8,0x0A,0x3F,
0x29,0x80,0x00,0xAA,0x08,0xC1,0x08,0x3F,0x00,0xAF,0x05,0xC0,0x02,0x38,0x0B,0x3F,
0x84,0x02,0x20,0xC8,0x0C,0x3F,0x1E,0x80,0x04,0xAA,0x09,0xC1,0x08,0x3F,0x00,0xAF,
0x06,0xC0,0x01,0x38,0x03,0x39,0x0D,0x3F,0x88,0x02,0x14,0xC8,0x0E,0x3F,0x12,0x80,
0x00,0xA9,0x08,0xC0,0x04,0xAB,0x06,0xC1,0x04,0x38,0x05,0x39,0x0F,0x3F,0x88,0x02,
0x09,0xC8,0x10,0x3F,0x07,0x80,0x07,0x38,0x14,0x09,0x47,0xF0,0x01,0xB0,0x7F,0x1A,
0x07,0x30,0x00,0x80,0x00,0xA7,0x06,0x38,0x01,0xB2,0x07,0x20,0x02,0xB0,0x06,0x30,
0x05,0xAA,0xB9,0xC1,0x01,0xB3,0x02,0x38,0x01,0x39,0x05,0xAB,0x0F,0xC0,0x9A,0xF0,
0xD2,0xE8,0x52,0xF0,0x11,0x7F,0xBF,0xE8,0x06,0x37,0x00,0xA2,0x9F,0xEE,0x00,0x32,
0x7A,0x02,0x7A,0x01,0x08,0x32,0x02,0x30,0x01,0x31,0x00,0xA2,0xA4,0x87,0x11,0x79,
0x02,0x08,0x32,0xA2,0x01,0x90,0xD5,0x99,0x1E,0x60,0xF0,0x6D,0x5C,0x91,0x80,0x00,
0xF0,0x65,0xB4,0x0E,0xB4,0x0C,0x00,0xA3,0x8A,0x60,0x33,0x40,0x20,0xEC,0x19,0xA1,
0xFE,0x97,0xA2,0x9A,0x18,0xA8,0x00,0xCD,0x59,0x81,0x40,0xF0,0x03,0x1B,0xBD,0xAB,
0x00,0xC8,0x54,0x81,0xFF,0x97,0x4C,0x9F,0x20,0xEC,0x19,0xA1,0xFE,0x97,0x94,0x9A,
0x05,0xEC,0x18,0xA8,0x00,0xCD,0x4A,0x81,0x43,0xF0,0x1B,0x1B,0xBD,0xAB,0x00,0xC8,
0x45,0x81,0xA6,0x0A,0x11,0xEC,0x80,0xB1,0x0B,0x40,0x81,0xB2,0x1B,0xFA,0x13,0x40,
0x01,0xA3,0x33,0x40,0xA2,0x0B,0x05,0xA1,0x18,0x50,0xFE,0x97,0x6F,0x99,0x00,0xF6,
0x00,0xFE,0x83,0xF1,0x9F,0x0E,0x1B,0xEA,0x9B,0xF0,0x9F,0x0C,0x30,0x40,0x18,0xEA,
0x9E,0x0B,0x40,0xE9,0x18,0x40,0x19,0xA2,0x20,0xEC,0x00,0xA1,0xFE,0x97,0xB7,0x9A,
0x63,0xE9,0x1A,0x48,0x01,0xA7,0x38,0xEC,0x02,0x03,0x1A,0x40,0x33,0x48,0x00,0xAB,
0x06,0xC0,0x6A,0xEF,0xA2,0xE8,0x11,0x48,0x0F,0x03,0x17,0x40,0x03,0xAB,0x05,0xC8,
0x6B,0xED,0xE3,0xE8,0x19,0x48,0x01,0xA2,0x0A,0x03,0x1A,0x40,0x8F,0x0B,0x1B,0x48,
0x00,0xAB,0x07,0xC0,0x6A,0xEE,0xA2,0xE8,0x10,0x48,0x01,0xA1,0x01,0x03,0x11,0x40,
0x03,0xAB,0x05,0xC8,0x01,0xB5,0x65,0xE9,0x2A,0x48,0x01,0xA3,0x13,0x03,0x2B,0x40,
0x84,0x0B,0x1A,0x48,0x85,0x0B,0x19,0x48,0x93,0xF0,0x9B,0xE8,0x5B,0xE8,0x1D,0xEF,
0x9E,0xEF,0x58,0xEF,0x01,0x35,0x40,0xF0,0x02,0x36,0x5E,0xEE,0x03,0x36,0x08,0x30,
0x1E,0xED,0x01,0x38,0x5D,0xEC,0x04,0x36,0x5E,0xED,0x05,0x36,0x6D,0xF0,0x76,0x0E,
0x40,0xF0,0x06,0xB3,0x07,0x35,0x09,0x30,0x06,0x33,0xB4,0x06,0x00,0xA3,0x00,0xAB,
0x11,0xC1,0x04,0xA9,0x01,0xC1,0x01,0xA3,0x11,0x80,0x00,0xAA,0x01,0xC1,0x01,0xA3,
0x0B,0x80,0x07,0x3D,0x66,0x06,0xAD,0x1B,0x08,0x38,0x00,0x35,0x87,0x1B,0x09,0x38,
0x85,0x1B,0x01,0x38,0x33,0x80,0x01,0xAB,0x0E,0xC1,0x00,0xA9,0x10,0xC0,0x00,0xAA,
0x01,0xC1,0x02,0xA3,0x0A,0x80,0x03,0x3E,0x63,0x08,0x75,0xF0,0x2D,0x1A,0x00,0x35,
0x08,0x3D,0x02,0x3E,0x2F,0x1A,0x1F,0x80,0x02,0xAB,0x11,0xC1,0x00,0xA9,0x01,0xC1,
0x03,0xA3,0x0F,0x80,0x04,0xAA,0x01,0xC1,0x03,0xA3,0x09,0x80,0x03,0x3E,0x5A,0x08,
0x75,0xF0,0x2D,0x1A,0x05,0x3E,0x00,0x35,0x75,0xF0,0x2F,0x1A,0x04,0x3E,0x0B,0x80,
0x04,0xA9,0x19,0xC0,0x04,0xAA,0x17,0xC0,0x53,0x08,0x07,0x3D,0x2D,0x1A,0x05,0x3E,
0x00,0x35,0x75,0xF0,0x2F,0x1A,0x06,0x3E,0x75,0xF0,0x2D,0x1A,0x30,0xEC,0x00,0x3E,
0xBF,0xE9,0xBD,0x02,0x08,0xCC,0x00,0xA8,0x06,0xCB,0x4F,0x0D,0x40,0xE9,0x05,0x48,
0x00,0xAD,0x01,0xC1,0x01,0xA5,0x05,0x40,0x01,0xB3,0x04,0xAB,0xA7,0xC1,0x02,0xBA,
0x1B,0xC4,0x90,0xF0,0x4B,0xEE,0x82,0xE8,0xD2,0xE8,0x43,0x0D,0xA0,0xE8,0x52,0xF0,
0x52,0xE9,0x01,0xB1,0x01,0xA5,0x00,0xAB,0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x06,0x48,
0x00,0xAE,0x04,0xC1,0x17,0x28,0x56,0x29,0xB7,0x02,0x00,0xC2,0x05,0x40,0x01,0xB0,
0x02,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xED,0x87,0x3C,0x0B,0x18,0x48,0x39,0x0B,
0x1A,0x48,0x02,0xB2,0x04,0xAA,0x1C,0xCC,0x91,0xF0,0x43,0xEE,0x8A,0xE8,0xD2,0xE8,
0x31,0x0D,0xA1,0xE8,0x05,0xBA,0x52,0xF0,0x52,0xE9,0x01,0xB0,0x01,0xA5,0x00,0xAB,
0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,0x57,0x29,0x16,0x28,
0xB7,0x02,0x00,0xC2,0x0D,0x40,0x01,0xB1,0x02,0xB2,0x83,0x02,0x01,0xC0,0x01,0xB3,
0xED,0x87,0x2A,0x0B,0x1A,0x48,0x02,0xBA,0x1D,0xC4,0x26,0x0B,0x18,0x48,0x43,0xEE,
0x99,0xF0,0xC9,0xE8,0x8A,0xE8,0x20,0x0D,0xA1,0xE8,0x52,0xF0,0x52,0xE9,0x01,0xB0,
0x01,0xA5,0x5E,0xEC,0x09,0xC0,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,
0x17,0x28,0x56,0x28,0xB7,0x02,0x00,0xC2,0x0D,0x40,0x05,0xB1,0x0A,0xB2,0x83,0x02,
0x01,0xC0,0x01,0xB3,0xED,0x87,0x19,0x0B,0x18,0x48,0x02,0xB0,0x04,0xA8,0x1E,0xCC,
0x14,0x0B,0x19,0x48,0x4B,0xEE,0x9A,0xF0,0xD2,0xE8,0x12,0xE8,0x0E,0x08,0xA4,0xE8,
0x52,0xF0,0x12,0xE8,0x01,0xB1,0x01,0xA0,0x5D,0xEC,0x0A,0xC0,0x04,0xAB,0x0E,0xCC,
0x25,0x48,0x00,0xAD,0x05,0xC1,0x95,0xEE,0x16,0x28,0x2D,0x28,0xAE,0x02,0x00,0xC2,
0x20,0x40,0x05,0xB4,0x0A,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xEC,0x87,0x0A,0x60,
0xF0,0x6D,0xC0,0x46,0x41,0x93,0x80,0x00,0x5C,0x91,0x80,0x00,0xA4,0x8F,0x80,0x00,
0x44,0x93,0x80,0x00,0x40,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x42,0x93,0x80,0x00,
0x10,0x65,0x09,0xF6,0x14,0xF4,0x09,0xFE,0x24,0xFC,0x04,0xA9,0x11,0xC0,0x03,0xA9,
0x0A,0xC8,0x02,0xA9,0x04,0xC0,0x01,0xA9,0x0B,0xC1,0x40,0xF2,0xFF,0x97,0x76,0x9A,
0x40,0xF2,0xFF,0x97,0x73,0x9A,0x04,0x80,0x08,0xA9,0x02,0xC1,0x03,0xEC,0x58,0x03,
0x40,0xFA,0x60,0x03,0x64,0xA1,0xFE,0x97,0x0D,0x98,0x80,0xA3,0x9B,0xF0,0xC0,0xE8,
0x10,0x6D,0xF0,0x65,0x8D,0x60,0x06,0x31,0x06,0x3A,0x07,0x28,0x13,0x28,0x75,0x09,
0x7F,0xE8,0x5B,0xE8,0x3F,0xF4,0x1B,0xF4,0x1B,0xFC,0x3F,0xFC,0x1D,0xF4,0x3C,0xF4,
0x24,0xE4,0x2D,0xE4,0x05,0x30,0x00,0x33,0x01,0x33,0x28,0xEC,0x68,0x03,0x23,0xEC,
0x63,0x03,0xC0,0xE8,0xFF,0x97,0x4A,0x9A,0x6B,0x0B,0x3E,0xEC,0x02,0x30,0x98,0x02,
0x00,0xC8,0xCD,0x80,0x00,0xAD,0x13,0xCA,0x00,0xAC,0x06,0xCA,0x7E,0x02,0xFF,0xA3,
0x36,0xF4,0x03,0x33,0x36,0xFC,0x02,0xA3,0x02,0x80,0x01,0xA1,0x03,0x31,0x01,0xA3,
0x00,0x39,0x4A,0x02,0x12,0xF4,0x12,0xFC,0x01,0x32,0xFF,0xA2,0x04,0x32,0xB0,0x80,
0x00,0xAC,0x00,0xCD,0xA9,0x80,0x7E,0x02,0x01,0xA3,0x36,0xF4,0xFF,0xA1,0x04,0x33,
0x36,0xFC,0x03,0x31,0x03,0xA3,0xA4,0x80,0x1C,0x48,0x0C,0x78,0x84,0x14,0x1C,0x49,
0x0B,0x78,0x84,0x14,0x1C,0x4A,0x09,0x78,0x44,0x12,0x1C,0x4B,0x07,0x78,0x01,0xB2,
0x44,0x12,0x01,0xB3,0x02,0xB1,0x04,0xAA,0xEE,0xC1,0x01,0x3A,0x37,0xF4,0x13,0xF4,
0x1B,0xE4,0x3F,0xE4,0x00,0x33,0x9F,0x02,0x19,0xCA,0x78,0xF2,0x19,0xEC,0xFD,0x97,
0xA9,0x9F,0x01,0xA5,0x04,0xEC,0xFF,0xA8,0x2D,0xC8,0x00,0xAE,0x0B,0xC0,0x00,0x3B,
0x39,0xEC,0x58,0xF2,0xFD,0x97,0x9E,0x9F,0xA0,0xA3,0x5B,0xF1,0x04,0xEC,0x00,0xA5,
0x98,0x02,0x1F,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,0x00,0xA5,0x1B,0x80,0x00,0x39,
0x48,0xF2,0x39,0xEC,0xFD,0x97,0x8E,0x9F,0x02,0xA5,0x04,0xEC,0xFF,0xA8,0x12,0xC8,
0x01,0x3A,0x00,0xAA,0x0A,0xC0,0x78,0xF2,0x00,0x39,0xFD,0x97,0x83,0x9F,0xA0,0xA3,
0x5B,0xF1,0x04,0xEC,0x03,0xA5,0x98,0x02,0x04,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,
0x03,0xA5,0x00,0x80,0x1C,0xEC,0x0C,0x7B,0x59,0x1D,0x6F,0xF0,0x09,0x7B,0xFA,0x1A,
0x20,0xEC,0xFF,0x97,0x45,0x9F,0x00,0x30,0x0B,0x7B,0x59,0x1D,0x07,0x7B,0xFA,0x1A,
0x20,0xEC,0xFF,0x97,0x3D,0x9F,0x02,0x3B,0x1D,0xEC,0x28,0x0B,0x00,0x39,0xED,0xE8,
0x0B,0xEC,0x6B,0x03,0x26,0x0A,0x36,0xF4,0x9B,0xE8,0x36,0xE4,0x07,0xEC,0x02,0x39,
0x30,0xEC,0x58,0x03,0xFD,0x97,0x56,0x9F,0x7D,0x03,0x01,0x39,0x20,0x0B,0xC4,0xF1,
0x08,0xF4,0xED,0xE8,0x00,0xE4,0x68,0x03,0x02,0x39,0xFD,0x97,0x4B,0x9F,0xB9,0xA3,
0x24,0xFC,0xC0,0xF1,0xDB,0xF0,0x00,0xFC,0x22,0xEC,0x9C,0x02,0x00,0xC9,0x1A,0xEC,
0x03,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,0xDB,0xF0,
0xD2,0xE8,0x05,0x39,0xB9,0xA3,0xDB,0xF0,0x0A,0x20,0x02,0xEC,0x98,0x02,0x00,0xC9,
0x1A,0xEC,0x04,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,
0xDB,0xF0,0x06,0x39,0xD2,0xE8,0x0A,0x20,0x0A,0x80,0x01,0xA2,0x04,0x32,0x03,0x32,
0x04,0xA3,0x08,0x0A,0x01,0xBB,0x1B,0xF1,0xD3,0xE8,0x00,0xA1,0x00,0xA2,0x53,0x87,
0x0D,0x60,0xF0,0x6D,0x38,0xFA,0xFF,0xFF,0x56,0x04,0x00,0x00,0xAA,0xFB,0xFF,0xFF,
0x00,0xAC,0x08,0x00,0x30,0x01,0x00,0x00,0xF0,0x65,0xCD,0x0B,0x18,0x29,0x94,0x60,
0x00,0x30,0x9E,0x2A,0xCB,0x0B,0x00,0xA2,0xDA,0x43,0xCB,0x08,0x00,0xA1,0x19,0xA2,
0xFE,0x97,0x55,0x98,0xC9,0x0B,0x1B,0x48,0x00,0xAB,0x00,0xC1,0x85,0x81,0xC8,0x0D,
0x2C,0xEC,0x28,0xEC,0x00,0xA1,0x0C,0xA2,0x0C,0xB4,0xFE,0x97,0x48,0x98,0x20,0xEC,
0x00,0xA1,0x0C,0xA2,0xFE,0x97,0x43,0x98,0x00,0xA3,0x15,0x80,0x03,0x48,0x01,0xA7,
0x1F,0x02,0x06,0xC0,0x0F,0x28,0x13,0x28,0xFB,0xE8,0x13,0x20,0x23,0x28,0xFF,0xE8,
0x27,0x20,0xBC,0x0B,0x02,0xB2,0x01,0xB0,0x02,0xB1,0x9A,0x02,0xEE,0xC1,0x63,0x06,
0x05,0xB3,0x02,0xB4,0x19,0xAB,0x07,0xC0,0xB7,0x0F,0xD8,0xE9,0xB7,0x0F,0x59,0xF0,
0x2A,0xEC,0xC9,0xE9,0x9C,0x06,0xE1,0x87,0xB3,0x08,0x00,0xA1,0x19,0xA2,0xFE,0x97,
0x1E,0x98,0x00,0x38,0x00,0x3A,0x40,0xE0,0x71,0xE0,0xB1,0x0B,0xB1,0x0C,0x76,0xEA,
0x12,0xEA,0x00,0xA7,0x08,0x30,0x09,0x31,0x0C,0x36,0x0B,0x32,0x0A,0x33,0x0D,0x34,
0x06,0x37,0x00,0xA5,0x38,0x81,0x00,0xA0,0x10,0x7B,0x0D,0x3A,0x58,0x50,0x06,0x3B,
0x02,0xDA,0x10,0x30,0x18,0xEC,0xA2,0x0B,0x0E,0x31,0xC0,0xE8,0x05,0xA1,0x0D,0x32,
0xFD,0x97,0xB2,0x9F,0x9A,0x0F,0x01,0x30,0x02,0xB8,0x43,0xF0,0xFF,0xE8,0x01,0x3C,
0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0x03,0xB4,0xC2,0xE8,0x02,0x30,0x98,0x09,0x07,0x34,
0x04,0xEC,0x01,0x38,0x52,0xF0,0x00,0xA6,0x8A,0xE8,0x05,0x33,0x1B,0xE8,0x04,0x32,
0x00,0x36,0x03,0x33,0x33,0x80,0x04,0xAC,0x2C,0xC8,0x02,0x39,0x8C,0x02,0x04,0xC0,
0x04,0x38,0x03,0x28,0x94,0x02,0x1F,0xC1,0x0C,0x80,0x05,0x38,0x03,0x3A,0x8C,0x0B,
0x01,0xE9,0x01,0xBA,0x49,0xF0,0x52,0xF0,0xD2,0x1A,0xC8,0x1A,0x03,0x39,0x50,0x03,
0x4A,0xF0,0x07,0x80,0x03,0x39,0x86,0x0A,0x01,0xB1,0x49,0xF0,0x88,0x1A,0x03,0x39,
0x58,0x03,0x4B,0xF0,0x99,0x1A,0xFD,0x97,0x69,0x9E,0x3B,0x28,0x43,0x03,0x00,0x3A,
0x12,0xE8,0xF6,0xE8,0x00,0x32,0x05,0x80,0x3A,0x28,0x5A,0x03,0x00,0x38,0xC0,0xE8,
0x00,0x30,0xB6,0xE8,0x04,0x39,0x02,0xB1,0x04,0x31,0x01,0xB4,0x02,0xB7,0x01,0x3A,
0x07,0x3B,0x02,0xB2,0x9C,0x02,0xC6,0xC1,0x06,0x3C,0x20,0xEC,0x7A,0x0C,0x05,0xA1,
0x00,0xE9,0x10,0x36,0xFD,0x97,0x58,0x9F,0x10,0x7B,0x01,0x30,0x6C,0x0A,0x02,0xB8,
0x5F,0x58,0x43,0xF0,0xD3,0xE8,0x03,0x33,0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0xC2,0xE8,
0x02,0x30,0x01,0x39,0x01,0x38,0x52,0xF0,0xA4,0xE8,0x03,0xB0,0x07,0x33,0x5B,0xE8,
0x05,0x34,0x0F,0x30,0x02,0x3C,0x00,0xA6,0x04,0x33,0x39,0x80,0x04,0xAC,0x30,0xC8,
0x02,0x3B,0x9C,0x02,0x04,0xC0,0x05,0x38,0x03,0x28,0x94,0x02,0x24,0xC1,0x10,0x80,
0x07,0x38,0x04,0x3A,0x5E,0x0B,0x01,0xE9,0x01,0xBA,0x52,0xF0,0x49,0xF0,0x59,0xE8,
0x9A,0xE8,0x92,0x29,0x88,0x29,0x04,0x39,0x50,0x03,0x4A,0xF0,0x9B,0xE8,0x99,0x29,
0x0A,0x80,0x04,0x39,0x56,0x0A,0x01,0xB1,0x49,0xF0,0x51,0xE8,0x88,0x29,0x04,0x39,
0x58,0x03,0x4B,0xF0,0xD2,0xE8,0x91,0x29,0xFD,0x97,0x08,0x9E,0x03,0x3A,0x13,0x28,
0x43,0x03,0x36,0xE8,0xFF,0xE8,0x04,0x80,0x03,0x38,0x02,0x28,0x5A,0x03,0xF6,0xE8,
0xBF,0xE8,0x03,0x39,0x05,0x3A,0x02,0xB1,0x02,0xB2,0x03,0x31,0x05,0x32,0x01,0xB4,
0x01,0x3A,0x0F,0x3B,0x02,0xB2,0x9C,0x02,0xC0,0xC1,0x10,0x38,0x00,0x39,0xFD,0x97,
0xED,0x9D,0x04,0xEC,0x29,0xBC,0x38,0xEC,0xFF,0xBC,0x31,0xEC,0x10,0x34,0xFD,0x97,
0xE5,0x9D,0x08,0x3F,0x29,0xB8,0xFF,0xB8,0x11,0x30,0xBC,0x02,0x06,0xCA,0x3B,0xEB,
0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0xE4,0xEA,0x08,0x80,0x0B,0x39,0x8C,0x02,
0x06,0xCD,0x63,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0x1C,0xE9,0x10,0x34,
0x09,0x3A,0x90,0x02,0x06,0xCA,0x13,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,
0xC0,0xEA,0x08,0x80,0x0C,0x3B,0x98,0x02,0x06,0xCD,0xC3,0xEA,0x9A,0xF0,0xD3,0xE8,
0x9B,0xF0,0xDB,0xE1,0x18,0xE8,0x11,0x30,0x10,0x3B,0x10,0x7C,0xA3,0x50,0x63,0x58,
0x12,0x78,0xE3,0x50,0x13,0x79,0xFF,0x97,0xAC,0x9D,0xA3,0x58,0x07,0xAB,0x01,0xCC,
0x08,0xA3,0xA3,0x50,0x10,0x7B,0xDA,0x58,0x07,0xAA,0x01,0xCC,0x08,0xA2,0xDA,0x50,
0x10,0x7B,0x99,0x58,0xDA,0x58,0xC9,0xE0,0xD2,0xE0,0x99,0x50,0xDA,0x50,0xAB,0xF0,
0x5B,0xE9,0x0E,0x3F,0x98,0xF0,0x1B,0xE8,0x17,0x08,0x7C,0xF0,0x1B,0x0F,0xC3,0xE8,
0xE7,0x1D,0x18,0xEC,0x08,0xB0,0x87,0x40,0x18,0x0F,0xE4,0xE9,0x64,0x48,0xC4,0x40,
0x00,0x3C,0x36,0xE9,0x1E,0x42,0x36,0xFA,0x46,0x40,0x18,0xED,0x19,0x41,0x82,0x40,
0x09,0xFA,0x12,0xFA,0x41,0x40,0xC2,0x40,0x0A,0x3F,0x3D,0x40,0x06,0x38,0x19,0xB7,
0x0C,0xB0,0x0A,0x37,0x06,0x30,0x01,0xB5,0x08,0x09,0x0B,0x48,0x9D,0x02,0x00,0xCA,
0xC1,0x86,0x2D,0xF6,0x03,0x0B,0x2D,0xFE,0xDD,0x43,0x14,0x60,0xF0,0x6D,0xC0,0x46,
0x48,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,0x48,0x93,0x80,0x00,0x41,0x93,0x80,0x00,
0xF0,0x93,0x80,0x00,0xFA,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x5C,0x91,0x80,0x00,
0x5C,0x93,0x80,0x00,0x44,0x93,0x80,0x00,0xFC,0x93,0x80,0x00,0x70,0x07,0x70,0x65,
0x00,0xA2,0x02,0xA8,0x30,0xCD,0x2B,0xA4,0x61,0x03,0xC2,0xEE,0x17,0x0B,0x52,0xF0,
0x52,0xE8,0xD6,0x1C,0x9A,0xE8,0x55,0x48,0x82,0xEE,0x52,0xF0,0x01,0xB8,0x52,0xE8,
0x2D,0xF2,0x40,0xF0,0x41,0xE8,0x35,0x03,0xD6,0x1C,0x9A,0xE8,0x54,0x48,0xCA,0x1C,
0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x24,0xF2,0x1A,0xEC,0x34,0x03,0x19,0xBA,
0x12,0xEB,0x10,0xF4,0x05,0xC4,0x21,0xEC,0x14,0xB9,0x49,0xEB,0x01,0xA2,0x08,0xF4,
0x0A,0xC5,0x22,0xEC,0x19,0xBA,0xD3,0xEA,0x19,0xF4,0x04,0xC4,0x14,0xBD,0x2C,0xEB,
0x02,0xA2,0x23,0xF4,0x00,0xC5,0x00,0xA2,0x10,0xEC,0x70,0x6D,0x4C,0x8F,0x80,0x00,
0xF0,0x65,0x16,0xF6,0x36,0xFE,0x2B,0xA3,0x32,0xEC,0x5A,0x03,0x84,0x60,0x49,0x0C,
0x00,0x32,0xA5,0xE8,0xEA,0x48,0xAB,0x48,0x12,0xF2,0xAF,0x4C,0x1A,0x03,0xEB,0x4C,
0x01,0xB5,0xED,0x4F,0x01,0xBD,0x2D,0xF6,0x2D,0xFE,0x1B,0xF2,0x03,0x35,0x3B,0x03,
0x6F,0xF0,0x00,0x3D,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,0x7F,0x48,0x2E,0xEC,0x3F,0xF2,
0x3E,0x03,0x03,0x3F,0x00,0x3D,0x08,0xB7,0x7F,0xF0,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,
0x7F,0x48,0x3F,0xF2,0x2F,0x03,0x35,0xF4,0x2D,0xE4,0xAE,0xEA,0xF5,0xE7,0x76,0xE9,
0x3F,0xF4,0x6E,0x00,0x3F,0xE4,0x75,0xEC,0xFE,0xEA,0xF7,0xE7,0xF6,0xE9,0x7E,0x00,
0x01,0xB6,0x02,0x50,0x02,0x36,0x0B,0x50,0x31,0xAA,0x03,0xCC,0x01,0xA2,0xB5,0x02,
0x12,0xCC,0x54,0x80,0x2C,0x0F,0x2C,0x0E,0x7F,0x4B,0x36,0x4B,0x3F,0xF2,0x37,0x03,
0x31,0xA6,0xBC,0x06,0x76,0x02,0xB4,0x04,0x01,0x37,0x94,0x05,0x06,0xCC,0x02,0x3F,
0xBD,0x02,0x44,0xCD,0x01,0x3A,0x01,0xBA,0x02,0x50,0x3F,0x80,0x22,0x0E,0xB6,0x4B,
0xB4,0x06,0x21,0x0E,0xF7,0x4B,0x66,0x06,0x3F,0xF2,0x3E,0x03,0xB4,0x06,0x40,0xA6,
0x76,0x02,0x37,0xEC,0x67,0x04,0x9F,0x02,0x07,0xCD,0x00,0xA7,0x00,0x3C,0xBC,0x06,
0x01,0x34,0x02,0xA7,0x64,0x06,0x94,0x06,0x1C,0x80,0x02,0x3E,0xB5,0x02,0x26,0xCA,
0x01,0xA7,0x7F,0x02,0x3B,0xEC,0x02,0x50,0x63,0x04,0x1F,0x80,0x26,0xEC,0x01,0x3A,
0x09,0xB6,0x76,0xF0,0xB6,0xE8,0x0F,0x0A,0xB2,0x1C,0x00,0x32,0x0D,0x0A,0xB6,0xE8,
0x76,0x48,0x00,0x3A,0x36,0xF2,0x32,0x03,0x93,0x02,0x00,0xCD,0x13,0xEC,0x01,0xB7,
0x3F,0xF6,0x3F,0xFE,0x03,0x3E,0x01,0xB4,0xB7,0x02,0xE7,0xC3,0x62,0x06,0x4A,0xAB,
0x05,0xCC,0x02,0x3F,0xBD,0x02,0x02,0xCA,0x02,0x50,0x01,0xA3,0x0B,0x50,0x04,0x60,
0xF0,0x6D,0xC0,0x46,0x4C,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0xF0,0x65,0x12,0xF6,
0x2B,0xA3,0x12,0xFE,0x5A,0x03,0x3A,0x0F,0x87,0x60,0x04,0x30,0x05,0x31,0xBB,0xE8,
0x01,0xB3,0xDB,0x4F,0x37,0x0C,0x00,0xA0,0x01,0x33,0x00,0xA3,0x02,0x33,0x25,0xEC,
0x03,0x30,0x00,0xA6,0x06,0x32,0x84,0x06,0x37,0x80,0x06,0x38,0x30,0x09,0x5A,0xF0,
0x12,0xE8,0x50,0x1C,0x52,0xE8,0x51,0x48,0x09,0xF2,0x01,0x03,0x18,0xEC,0x06,0x3A,
0x08,0xB0,0x2B,0x0F,0x40,0xF0,0x80,0xE8,0xC2,0x1D,0xC0,0xE9,0x40,0x48,0x00,0xF2,
0x02,0x03,0x08,0xEC,0xB1,0x02,0x00,0xC2,0x30,0xEC,0x06,0xF4,0x36,0xFC,0x08,0xEC,
0xA9,0x02,0x00,0xC9,0x28,0xEC,0x03,0x3F,0x05,0xF4,0x68,0x06,0x2D,0xFC,0x02,0x20,
0xBA,0x02,0x02,0xC2,0x0C,0xA7,0x3F,0x1A,0x07,0x20,0x6F,0x06,0x3F,0x28,0x38,0xF4,
0x00,0xFC,0x03,0x30,0x10,0xEC,0xA2,0x02,0x00,0xC9,0x20,0xEC,0x04,0xF4,0x02,0x38,
0x80,0xE8,0x02,0x30,0x24,0xFC,0x8C,0x04,0x01,0xB3,0x1A,0xF6,0x01,0x39,0x12,0xFE,
0x8A,0x02,0xC2,0xC3,0x60,0x06,0x02,0xA9,0x14,0xC9,0x0F,0xEC,0x02,0xBF,0x3F,0xF6,
0x3F,0xFE,0x80,0xEB,0x39,0xEC,0x40,0xEB,0xFD,0x97,0x20,0x9C,0x04,0x3A,0x02,0x3B,
0x03,0x39,0x10,0x50,0x58,0xEA,0x00,0xEB,0x39,0xEC,0xFD,0x97,0x17,0x9C,0x05,0x3A,
0x10,0x50,0x0A,0x80,0x01,0x39,0xFD,0x97,0x11,0x9C,0x04,0x3B,0x01,0x39,0x18,0x50,
0x02,0x38,0xFD,0x97,0x0B,0x9C,0x05,0x3F,0x38,0x50,0x07,0x60,0xF0,0x6D,0xC0,0x46,
0x4C,0x8F,0x80,0x00,0xFF,0xFF,0x00,0x00,0xF0,0x65,0xC7,0x0B,0xDB,0x4B,0x8E,0x60,
0x06,0xA2,0xC6,0x08,0x00,0xA1,0x05,0x33,0xFD,0x97,0x51,0x9D,0xC4,0x0B,0x1A,0xEC,
0x81,0xB3,0x80,0xB2,0x1B,0x48,0x12,0x48,0x1B,0xF2,0x13,0x03,0x63,0xAB,0x08,0xC8,
0xC0,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,0x0F,0xA2,0x1A,0x00,0xBE,0x0B,0x2C,0xB3,
0x1A,0x40,0xBD,0x0B,0x2C,0xB3,0x1B,0x48,0x00,0xA0,0x07,0x33,0x04,0x30,0x00,0xA5,
0xCE,0x82,0x00,0xA1,0x0D,0x31,0x0C,0x31,0xA9,0xF0,0x49,0xE9,0x8B,0xF0,0xB7,0x0A,
0xC9,0xE8,0x89,0xE8,0x0C,0x4D,0x2B,0xA2,0x62,0x03,0xB5,0x0B,0xD2,0xE8,0x53,0xEC,
0xDE,0x4F,0x0B,0xEC,0x08,0xB3,0x58,0x48,0x09,0x4A,0x00,0xF2,0x08,0x03,0x02,0x30,
0x99,0x48,0xDB,0x48,0x1B,0xF2,0x0B,0x03,0x08,0x33,0x03,0xB2,0xD3,0x4F,0x00,0xAB,
0x09,0xC0,0xA5,0x0F,0xFA,0x4C,0x01,0xA3,0x22,0x01,0x13,0x02,0x03,0xC0,0xFA,0x4C,
0xA3,0x00,0x9A,0x03,0xFA,0x44,0x2B,0xA3,0x63,0x03,0xA5,0x0A,0xD3,0xE8,0xDA,0xEC,
0x00,0xA0,0xD0,0x47,0x02,0xB3,0xDB,0x4F,0x00,0xAB,0x02,0xC1,0xA1,0x0B,0x01,0xA2,
0x1A,0x15,0xA0,0x0B,0x1B,0x1D,0x00,0xAB,0x4E,0xC0,0x9C,0x09,0x07,0x3A,0x8C,0x06,
0x9B,0x0F,0xA9,0xF0,0xB2,0x02,0x25,0xC9,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xF0,
0x49,0xE9,0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,
0x8C,0x06,0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,
0x51,0x40,0x32,0xEC,0x03,0x39,0x08,0xB2,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,
0x09,0xF2,0x0A,0x03,0x01,0xB6,0xFA,0x14,0x36,0xF6,0x12,0xFA,0xFB,0xE8,0x5A,0x40,
0x36,0xFE,0x21,0x80,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xEE,0x49,0xE9,0x52,0xF0,
0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,0x8C,0x06,
0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,0x51,0x40,
0x03,0x39,0xF2,0xED,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,0x09,0xF2,0x0A,0x03,
0xFA,0x14,0x12,0xFA,0xFB,0xE8,0x5A,0x40,0x02,0xAE,0x76,0xC9,0x2B,0xA1,0x61,0x03,
0x73,0x0A,0x73,0xEE,0x88,0xE8,0x10,0xB1,0x5B,0xF0,0x89,0xE8,0xC9,0xE8,0xC0,0xE8,
0xE3,0xF0,0x71,0x0A,0x1B,0xE9,0x06,0x31,0x03,0x30,0x5B,0xF0,0xD3,0xE8,0x5A,0x29,
0x09,0x32,0x9F,0x29,0x0A,0x37,0x1B,0x2A,0x0B,0x33,0x66,0x0B,0x1B,0x58,0x8A,0xB3,
0x1B,0x28,0x00,0xA1,0x42,0x1E,0x06,0x38,0x3F,0xA7,0x1F,0x00,0x00,0xA1,0x43,0x1E,
0xA5,0xA1,0x00,0x31,0x01,0x31,0xB9,0xA0,0xB9,0xA1,0x00,0x90,0x2F,0x9B,0x00,0xA8,
0x02,0xC0,0x05,0xBF,0x3F,0xF4,0x3F,0xFC,0x60,0x0B,0x02,0x3A,0x9A,0x02,0x39,0xCC,
0x09,0x38,0x03,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,0x12,0xCB,0x06,0xBF,
0x3F,0xF4,0x0A,0x39,0x3F,0xFC,0x0B,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,
0x08,0xCB,0x0B,0x38,0x47,0x03,0x08,0x3A,0xBF,0xF2,0x13,0xF4,0x1B,0xE4,0x3F,0xFC,
0xBB,0x02,0x1F,0xCA,0xE3,0xF0,0x50,0x0A,0x1B,0xE9,0x5B,0xF0,0xD3,0xE8,0x03,0x39,
0xDA,0x28,0x0A,0x20,0xA8,0xF0,0x19,0x29,0x06,0x3B,0x40,0xE9,0x19,0x20,0x83,0xF0,
0xC0,0xE8,0x46,0x0B,0x18,0xE8,0x03,0xED,0x02,0x41,0x12,0xFA,0x99,0x40,0x09,0xFA,
0x5A,0x40,0xD9,0x40,0x3C,0x0B,0x01,0xA1,0xDA,0x4C,0xA1,0x00,0x0A,0x03,0x12,0xF6,
0x12,0xFE,0xDA,0x44,0x38,0x0B,0xDB,0x4C,0x23,0x01,0xDF,0xF7,0x05,0xC5,0x05,0x3B,
0x01,0xBB,0x1B,0xF6,0x1B,0xFE,0x05,0x33,0xC7,0x81,0x2B,0xA3,0x18,0xEC,0x60,0x03,
0x37,0x0A,0x13,0xE8,0x59,0xEC,0xCE,0x47,0x03,0x30,0x99,0xEC,0xC8,0x4F,0x01,0xA8,
0x6E,0xC8,0x24,0xB3,0x1A,0x49,0xD9,0x48,0x12,0xF2,0x0A,0x03,0x59,0x49,0x09,0xF4,
0x0A,0x03,0x99,0x49,0x09,0xF6,0x0A,0x03,0x02,0x39,0x8A,0x02,0x07,0xCA,0xD9,0x40,
0x02,0x38,0x02,0xFA,0x1A,0x41,0x00,0xA2,0x5A,0x41,0x02,0xFE,0x9A,0x41,0x30,0xEC,
0x21,0xEC,0xFF,0x97,0x5C,0x9D,0x00,0xA8,0x0C,0xC0,0x22,0xEC,0x0D,0x78,0x0C,0x79,
0xFF,0x97,0x8E,0x9D,0x2B,0xA3,0x63,0x03,0x21,0x0A,0xD3,0xE8,0x02,0xB3,0x02,0xA2,
0xDA,0x47,0x23,0x80,0x07,0x39,0x1E,0x0F,0xB1,0x02,0x19,0xC8,0x0C,0x79,0x22,0xEC,
0x0D,0x78,0xFF,0x97,0x1B,0x9E,0xAB,0xF0,0x5B,0xE9,0x9A,0xF0,0x9B,0xE8,0x17,0x0A,
0xD3,0xE8,0x2B,0xA2,0x62,0x03,0xBF,0xE8,0x3A,0xEC,0x24,0xB2,0xD1,0x48,0x12,0x49,
0x12,0xF2,0x11,0x03,0x19,0x42,0x09,0xFA,0x59,0x42,0x02,0xB7,0x07,0xA3,0x04,0x80,
0x2B,0xA3,0x63,0x03,0xFF,0xE8,0x02,0xB7,0x01,0xA3,0xFB,0x47,0xE3,0xF0,0x0E,0x0A,
0x1B,0xE9,0x0D,0x39,0x5B,0xF0,0x99,0x12,0xD3,0xE8,0x0C,0x3A,0x08,0xA6,0x5A,0x20,
0x6A,0x06,0xB2,0x1A,0x9A,0x20,0x4A,0x81,0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,
0xA4,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x48,0x93,0x80,0x00,
0x4C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xCF,0x07,0x00,0x00,
0x02,0xA8,0x45,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xD6,0x08,0xC7,0xE9,
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x03,0xA3,0x46,0x80,
0x03,0xA8,0x46,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xB2,0x08,0xC7,0xE9,
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x07,0xA3,0xCB,0x47,
0xA5,0x80,0x04,0xA8,0x02,0xC1,0x00,0xA0,0xC8,0x47,0xA0,0x80,0x07,0xA2,0xCA,0x47,
0xA9,0xF0,0x49,0xE9,0x8A,0xF0,0x89,0xE8,0x8B,0x0A,0x51,0xE8,0x0A,0xED,0x56,0x48,
0x09,0x49,0x36,0xF2,0x0E,0x03,0x36,0xF4,0x36,0xE4,0x0D,0x36,0xD7,0x48,0x91,0x48,
0x3F,0xF2,0x0F,0x03,0x85,0x0A,0x3F,0xF4,0x3F,0xE4,0x12,0x58,0x0C,0x37,0x72,0xB2,
0x12,0x28,0x91,0xF6,0x00,0xC4,0x82,0x80,0x05,0xB3,0x02,0x33,0xDB,0x4F,0x02,0xAB,
0x7D,0xC8,0xE3,0xF0,0x7E,0x0A,0x1B,0xE9,0x5B,0xF0,0x98,0x1A,0x03,0x30,0xD3,0xE8,
0x5B,0x28,0x06,0x33,0xA5,0xA3,0x32,0xEC,0x00,0x33,0x01,0x33,0xB9,0xA1,0x3B,0xEC,
0xB9,0xA0,0x00,0x90,0x9B,0x99,0x03,0xEC,0x5A,0xEE,0x93,0x01,0x5B,0x02,0x14,0xA1,
0x19,0x00,0x03,0x3B,0xF2,0xEA,0x12,0xF4,0x12,0xE4,0x09,0x31,0xD1,0xE7,0x50,0xE8,
0x06,0x3A,0xBB,0xEA,0x1B,0xF4,0x48,0x00,0x1B,0xE4,0x08,0x30,0xD8,0xE7,0x1B,0xE8,
0x08,0x3A,0x43,0x00,0x99,0xE8,0x09,0xF4,0x09,0xE4,0x50,0xA9,0x03,0xCD,0x02,0x38,
0x03,0xA3,0xC3,0x47,0x38,0x80,0x32,0xA9,0x03,0xCD,0x02,0x39,0x02,0xA3,0xCB,0x47,
0x32,0x80,0x09,0x3A,0x91,0x02,0x2F,0xCD,0x02,0x38,0xC0,0x4F,0x00,0xA2,0x84,0x06,
0x94,0x05,0x29,0xC1,0x03,0x38,0x06,0x3A,0x00,0xF4,0x00,0xE4,0x12,0xF4,0x84,0x06,
0x12,0xE4,0x66,0x04,0x94,0x06,0x02,0x3A,0x01,0xA0,0xD0,0x47,0x09,0x3A,0x67,0x04,
0x76,0xE0,0x7F,0xE0,0x00,0xAA,0x17,0xC0,0x1E,0xA9,0x00,0xCC,0x00,0xA0,0x00,0xF6,
0x00,0xA8,0x11,0xC0,0x59,0xF0,0x08,0x38,0xC9,0xE8,0x88,0x02,0x03,0xCD,0xA2,0xF0,
0x01,0xA1,0x50,0x0B,0x07,0x80,0x08,0x3A,0x51,0xF0,0x8A,0xE8,0x93,0x02,0x03,0xCD,
0x4D,0x0B,0xA2,0xF0,0x01,0xA1,0xD1,0x10,0x2B,0xA3,0x63,0x03,0x4B,0x0A,0xD3,0xE8,
0x05,0xB3,0xDB,0x4F,0x00,0xAB,0x08,0xC1,0x03,0x3E,0x06,0x3F,0x33,0xF4,0x1B,0xE4,
0x0D,0x33,0x3B,0xF4,0x1B,0xE4,0x0C,0x33,0x01,0x80,0x0D,0x36,0x0C,0x37,0x0D,0x3A,
0x00,0xAA,0x12,0xC0,0x04,0x3B,0x59,0xF0,0x41,0x08,0xC9,0xE8,0x0C,0x3E,0x49,0xF0,
0x43,0xE8,0x9E,0x40,0x36,0xFA,0xDE,0x40,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1C,0x41,
0x04,0x3B,0x01,0xB3,0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x01,0xB5,0x2D,0xF4,0x2D,0xFC,
0x38,0x0C,0xE3,0x4B,0x9D,0x02,0x00,0xC2,0x2B,0x85,0x05,0x3E,0x00,0xAE,0x00,0xC0,
0xA1,0x80,0x0C,0x36,0x0D,0x36,0x2C,0x0B,0x1D,0x4D,0x2B,0xA1,0x69,0x03,0x2F,0x0B,
0x58,0xE8,0x42,0xEC,0x14,0xA4,0x6F,0x06,0xD6,0x4F,0xE7,0x1D,0x2E,0x0A,0x57,0x15,
0x84,0xEC,0xE2,0x4F,0x01,0xAA,0x08,0xC1,0x02,0xAE,0x6D,0xC9,0x0D,0x78,0x0C,0x79,
0x2A,0xEC,0xFF,0x97,0x6B,0x9C,0x07,0xA3,0x14,0x80,0x02,0xAA,0x14,0xC1,0x76,0xF8,
0x72,0xF0,0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x08,0xB6,
0x0D,0x32,0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,
0x0C,0x33,0x03,0xA3,0xE3,0x47,0x58,0x80,0x03,0xAA,0x13,0xC1,0x72,0xEE,0x52,0xF0,
0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x07,0xB6,0x0D,0x32,
0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x0C,0x33,
0x04,0xA3,0xE7,0x87,0x07,0xAA,0x21,0xC1,0xEB,0xF0,0x09,0x0A,0x5B,0xE9,0x5B,0xF0,
0xD3,0xE8,0x06,0xA1,0x5A,0x1E,0x0D,0x32,0x08,0xA2,0x9B,0x1E,0x0C,0x33,0x05,0xA3,
0xE3,0x47,0x03,0xB0,0x24,0x80,0xC0,0x46,0x48,0x93,0x80,0x00,0x7C,0x93,0x80,0x00,
0x64,0x93,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x05,0xAA,0x18,0xC1,
0x03,0xB0,0xC3,0x4F,0x01,0xAB,0x0F,0xC8,0xEB,0xF0,0x40,0x09,0x5B,0xE9,0x5B,0xF0,
0xCB,0xE8,0x06,0xA6,0x99,0x1F,0x0D,0x31,0x08,0xA7,0xDB,0x1F,0xE2,0x47,0x0C,0x33,
0xC3,0x4F,0x01,0xB3,0xC3,0x47,0x08,0x80,0x68,0x06,0x14,0xA1,0x08,0x1C,0xE0,0x47,
0x03,0x80,0x69,0x06,0x14,0xA2,0x51,0x1C,0xE1,0x47,0x0C,0x3A,0x00,0xAA,0x12,0xC0,
0x04,0x3B,0x59,0xF0,0x32,0x08,0xC9,0xE8,0x49,0xF0,0x43,0xE8,0x9A,0x40,0x12,0xFA,
0xDA,0x40,0x0D,0x3A,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1D,0x41,0x04,0x3B,0x01,0xB3,
0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x6C,0x06,0x10,0xA6,0x2A,0x0B,0x34,0x1D,0x2A,0x0A,
0xDC,0x43,0x27,0x0B,0x19,0x49,0x93,0xEC,0xDB,0x4F,0x00,0xAB,0x17,0xC1,0x50,0xEC,
0xC3,0x47,0x10,0xED,0xC3,0x47,0x50,0xED,0xC3,0x47,0xD0,0xED,0xC3,0x47,0x90,0xED,
0xC3,0x47,0x02,0xB0,0xC3,0x47,0x20,0xB0,0x03,0x40,0x2A,0xB2,0x01,0xB0,0x03,0x40,
0x13,0x40,0x1E,0x0B,0x01,0xA0,0x5A,0x1C,0x88,0x00,0x82,0x03,0x5A,0x14,0x18,0x0B,
0x5D,0x48,0x1C,0x48,0x2D,0xF2,0x15,0x0A,0xC8,0xF0,0x2C,0x03,0x09,0xC0,0x40,0xE8,
0x40,0xF0,0x12,0xE8,0xD4,0x20,0x98,0x48,0xDB,0x48,0x1B,0xF2,0x03,0x03,0x13,0x21,
0x07,0x80,0x43,0xE8,0x5B,0xF0,0xD3,0xE8,0x11,0x0A,0x90,0x28,0xD8,0x20,0xD2,0x28,
0x1A,0x21,0xCB,0xF0,0x59,0xE8,0x09,0x0B,0x49,0xF0,0x59,0xE8,0x08,0xEC,0x08,0xB0,
0x42,0x28,0x8A,0x21,0x0A,0x0A,0x14,0x29,0x0B,0xEC,0x44,0x20,0x0C,0xB3,0x58,0x28,
0x08,0x22,0x52,0x29,0x0E,0x60,0x5A,0x20,0xF0,0x6D,0xC0,0x46,0x64,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x78,0x93,0x80,0x00,
0x48,0x93,0x80,0x00,0x04,0x0B,0x42,0xF0,0x10,0xE8,0x19,0x58,0xC0,0xF0,0x1A,0x58,
0x52,0xEA,0x82,0x02,0xFB,0xC3,0x70,0x07,0x34,0x06,0x80,0x00,0x30,0x65,0x03,0x3D,
0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,0x2A,0xEC,0x55,0x03,
0x09,0xE8,0x04,0x3C,0x01,0xA0,0xA9,0x02,0x05,0xCC,0x23,0xEC,0x5C,0x03,0x00,0xA0,
0xA1,0x02,0x00,0xCD,0x02,0xA0,0x30,0x6D,0x13,0xF4,0x02,0x28,0x12,0xF4,0x09,0xF4,
0x1B,0xE4,0x12,0xE4,0x09,0xE4,0x9A,0x02,0x02,0xCB,0xCB,0xEA,0x9A,0x02,0x00,0xCB,
0x03,0x20,0x70,0x07,0x00,0xA3,0x01,0x80,0xC1,0x14,0x01,0xB3,0x93,0x02,0xFB,0xC3,
0x70,0x07,0x30,0x65,0x52,0xE0,0x00,0xA3,0x00,0xA4,0x03,0x80,0xCD,0x1A,0x01,0xB4,
0xC5,0x12,0x02,0xB3,0x94,0x02,0xF9,0xCB,0x30,0x6D,0x10,0x65,0x00,0xA3,0x02,0x80,
0xCC,0x1C,0xC4,0x14,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,0x10,0x65,0x09,0xF4,
0x02,0xEC,0x49,0xFC,0x00,0xA3,0x00,0xA0,0x07,0x80,0x14,0x28,0x01,0xB3,0x00,0xE9,
0x00,0xF4,0x1B,0xF4,0x00,0xFC,0x1B,0xFC,0x02,0xB2,0x8B,0x02,0xF5,0xC3,0x10,0x6D,
0x10,0x65,0x09,0xF4,0x02,0xEC,0x09,0xFC,0x00,0xA0,0x00,0xA3,0x07,0x80,0x14,0x48,
0x01,0xB3,0x00,0xE9,0x00,0xF6,0x1B,0xF4,0x00,0xFE,0x1B,0xFC,0x01,0xB2,0x8B,0x02,
0xF5,0xC3,0x10,0x6D,0x70,0x07,0x00,0x00,0x00,0x65,0x07,0x0A,0x07,0x0B,0x08,0x08,
0x1A,0x50,0x08,0x0B,0x18,0x50,0x08,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0xA1,0x0A,0xA2,
0xFF,0x97,0xB0,0x9F,0x00,0x6D,0xC0,0x46,0x80,0x9F,0x80,0x00,0x28,0x8F,0x80,0x00,
0x00,0x9F,0x80,0x00,0x24,0x8F,0x80,0x00,0xF8,0x9F,0x80,0x00,0xF0,0x65,0x52,0x0B,
0x52,0x0D,0x00,0xA2,0x85,0x60,0x1A,0x44,0x6A,0x41,0x2C,0x80,0x56,0xF0,0xB6,0xE8,
0x4F,0x09,0x76,0xF0,0x88,0xE9,0x04,0x49,0xA9,0xE9,0x0C,0x41,0x61,0xF0,0x09,0xE9,
0x49,0xF0,0x8C,0x06,0x29,0xEC,0x61,0x04,0x01,0xA7,0x4F,0x41,0x1F,0x4C,0x00,0x37,
0x01,0xA7,0xA7,0x00,0x3C,0xEC,0x00,0x3F,0x3C,0x03,0x24,0xF6,0x24,0xFE,0x1C,0x44,
0x43,0x0C,0xA6,0x1D,0x44,0x48,0x24,0xF2,0x34,0x03,0x66,0x06,0xAC,0x15,0x24,0xFA,
0x4C,0x40,0x84,0x48,0xC0,0x48,0x00,0xF2,0x20,0x03,0x88,0x40,0x01,0xB2,0x00,0xFA,
0x12,0xF6,0xC8,0x40,0x12,0xFE,0xD9,0x4B,0x8A,0x02,0xCF,0xC3,0xD9,0x4C,0x1A,0x4C,
0x0A,0x00,0xDA,0x44,0xDA,0x4B,0x00,0xAA,0x01,0xC0,0x02,0xA2,0xDA,0x40,0x32,0x0D,
0xEB,0x48,0x00,0xAB,0x5B,0xC0,0x01,0x7C,0x20,0xEC,0xFF,0xA1,0x08,0xA2,0xFD,0x97,
0x86,0x98,0x2B,0x4C,0x6A,0x4C,0xEE,0x4B,0x5A,0x00,0x26,0x40,0x2B,0x0B,0x94,0x06,
0x1A,0x49,0x57,0xF0,0xBF,0xE8,0x7F,0xF0,0xF9,0x1C,0xDF,0xE9,0x78,0x48,0xBB,0x48,
0xFF,0x48,0x00,0xF2,0x3F,0xF2,0x08,0x03,0x3B,0x03,0xED,0x4B,0x00,0xF4,0x1B,0xF4,
0x67,0x06,0x01,0xE4,0x1B,0xE4,0x17,0x01,0x00,0xAD,0x0F,0xC1,0x01,0xA5,0x3D,0x02,
0x2C,0xC0,0x10,0xA7,0xBC,0x06,0x67,0x06,0x3E,0x03,0x92,0xF0,0x16,0x03,0x26,0x40,
0x61,0x40,0xA3,0x40,0x00,0xE6,0xFF,0xA9,0x1A,0xCC,0x0D,0x80,0x01,0xA5,0x3D,0x00,
0x6F,0x02,0x6F,0x01,0x92,0xF0,0x00,0x37,0x16,0x03,0x7F,0xF1,0x3E,0x03,0x26,0x40,
0x61,0x40,0xA3,0x40,0xFF,0xA9,0x09,0xCC,0xFF,0xAB,0x0F,0xCD,0x01,0xA2,0x1B,0xE2,
0x13,0x03,0x22,0x48,0xDB,0xF1,0x13,0x03,0x23,0x40,0x07,0x80,0x00,0xE6,0x01,0xA5,
0x22,0x48,0x05,0x03,0xAD,0xF1,0x15,0x03,0x25,0x40,0xED,0x87,0x09,0x0B,0x1B,0x48,
0x01,0xAB,0x04,0xC0,0x08,0x08,0x01,0x79,0x02,0xA2,0xFD,0x97,0x38,0x98,0x02,0x0B,
0x1A,0x4C,0x05,0x60,0x5A,0x44,0xF0,0x6D,0x2C,0x8F,0x80,0x00,0xE8,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,0x00,0x65,0xFE,0x97,
0x59,0x9A,0x0F,0x0B,0x1B,0x58,0x9B,0x49,0x35,0xAB,0x01,0xC1,0xFD,0x97,0x08,0x9C,
0x0C,0x0B,0x1A,0x48,0xA5,0xAA,0x12,0xC1,0x5A,0x48,0x03,0xAA,0x03,0xC1,0x0A,0x0A,
0x02,0xA1,0x51,0x46,0x08,0x80,0x5A,0xAA,0x09,0xC1,0x07,0x0A,0x01,0xA1,0xD1,0x46,
0x06,0x0A,0x11,0x58,0x06,0x0A,0x11,0x50,0x00,0xA2,0x1A,0x40,0x5A,0x40,0x00,0x6D,
0x24,0x8F,0x80,0x00,0x00,0x9F,0x80,0x00,0x2C,0x8F,0x80,0x00,0x34,0x06,0x80,0x00,
0x68,0x90,0x80,0x00,0xF0,0x65,0x39,0x0B,0x5B,0x4A,0x00,0xAB,0x03,0xC1,0x38,0x0B,
0x1B,0x48,0x00,0xAB,0x68,0xC0,0x37,0x0A,0x37,0x0B,0x12,0x28,0x7F,0xA0,0x10,0x00,
0x1B,0x28,0x36,0x0A,0x93,0x02,0x16,0xC9,0x30,0x0A,0x51,0x4A,0x00,0xA9,0x08,0xC1,
0x3D,0xA8,0x06,0xC1,0x32,0x0C,0x01,0xA1,0x51,0x42,0xA3,0x02,0x01,0xC1,0x51,0x41,
0x0F,0x80,0x30,0x0A,0x93,0x02,0x0C,0xC1,0x28,0x09,0x00,0xA2,0x4A,0x42,0x4A,0x41,
0x29,0x09,0x0A,0x20,0x05,0x80,0x80,0xA2,0x12,0xF4,0x9D,0xE8,0x2A,0x0A,0x93,0x02,
0x04,0xC9,0x03,0xA2,0x13,0x00,0x29,0x0A,0x9B,0xF0,0x9D,0x18,0x28,0x0B,0x28,0xB3,
0x1B,0x48,0x98,0x02,0x02,0xC9,0x27,0x0A,0x95,0x02,0x00,0xC1,0x03,0xEC,0x23,0x0A,
0x00,0xA1,0x14,0x59,0x00,0xA2,0x07,0x80,0x2E,0x28,0x89,0xE9,0x09,0xF4,0x26,0x20,
0x09,0xFC,0x01,0xB2,0x02,0xB5,0x02,0xB4,0x9A,0x02,0xF5,0xC3,0x1B,0x0A,0x14,0x59,
0x5A,0xF0,0xA4,0xE8,0x25,0xEC,0x1A,0xEC,0x1B,0x0E,0x0B,0x80,0x1D,0xAA,0x02,0xC8,
0x7F,0xF0,0xBF,0x1B,0x2F,0x20,0x27,0x28,0x79,0xE8,0x09,0xF4,0x09,0xFC,0x01,0xB2,
0x02,0xB4,0x02,0xB5,0xD7,0xEA,0x82,0x02,0xF0,0xC3,0x10,0x0B,0x1B,0x59,0x52,0xF0,
0x9A,0xE8,0x11,0x20,0x05,0x0B,0x5B,0x4A,0x01,0xAB,0x02,0xC1,0x0F,0x0B,0x08,0xA2,
0x1A,0x40,0x03,0x0B,0x00,0xA2,0x1A,0x20,0xF0,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,
0x24,0x9F,0x80,0x00,0x20,0x9F,0x80,0x00,0x22,0x9F,0x80,0x00,0xFF,0xFE,0x00,0x00,
0xF1,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xEF,0x00,0x00,0x64,0x8D,0x80,0x00,
0x6C,0x90,0x80,0x00,0xD8,0x9E,0x80,0x00,0xB8,0x93,0x80,0x00,0x83,0x00,0x80,0x00,
0xF0,0x65,0x19,0x0C,0x81,0x60,0x22,0xEC,0x18,0x09,0x00,0xA3,0x18,0x08,0x16,0x80,
0x5D,0xF0,0xED,0xE8,0x17,0x0E,0x6D,0xF0,0xAE,0x1D,0x16,0x0F,0x00,0x36,0xED,0xE9,
0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x97,0x20,0xAF,0x48,0xED,0x48,0x2D,0xF2,
0x3D,0x03,0xD5,0x20,0x0D,0x48,0x01,0xB3,0x55,0x42,0x06,0xB1,0x06,0xB2,0xC5,0x4B,
0xAB,0x02,0xE5,0xCB,0xC3,0x4B,0x23,0x40,0x63,0x48,0x01,0xB3,0x63,0x40,0x90,0xA7,
0x03,0x4C,0xBF,0xF1,0xDB,0xE9,0x63,0x20,0x20,0xEC,0x1C,0xA1,0xFF,0x97,0x26,0x9E,
0x01,0x60,0x40,0x02,0xA0,0x23,0xF0,0x6D,0xD8,0x9E,0x80,0x00,0xE4,0x93,0x80,0x00,
0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,0xF0,0x65,0x2C,0x0B,0x2C,0x08,0x5B,0x59,
0x00,0xA2,0x1A,0x20,0x82,0x60,0x9A,0x20,0x2A,0x09,0x04,0xEC,0x2C,0x80,0x0D,0x48,
0x01,0x35,0x55,0xF0,0xAD,0xE8,0x28,0x0E,0x6D,0xF0,0xAE,0x1D,0x26,0x0F,0x00,0x36,
0xED,0xE9,0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x00,0x37,0xAE,0x48,0xED,0x48,
0x6F,0x06,0x3F,0x28,0x2D,0xF2,0x35,0x03,0x1F,0x20,0x5D,0x20,0x01,0x3D,0x01,0xAD,
0x05,0xC1,0x1D,0x28,0x1D,0x0E,0x35,0x03,0x2D,0xF4,0x2D,0xFC,0x1D,0x20,0x25,0x4C,
0x67,0x4C,0x7D,0x00,0x03,0xAD,0x04,0xC1,0xE5,0x4B,0x01,0xAD,0x01,0xC1,0x00,0xA5,
0x1D,0x20,0x01,0xB2,0x04,0xB3,0x06,0xB1,0xC5,0x4B,0xAA,0x02,0xCF,0xCB,0x14,0x0B,
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x43,0x49,0x00,0xAB,0x0A,0xC0,
0x10,0x0B,0x9B,0x49,0xC0,0xAB,0x06,0xC1,0x08,0x0B,0x59,0x59,0x80,0xA3,0x08,0x28,
0xDB,0xF1,0x03,0x03,0x0B,0x20,0x05,0x0B,0x05,0x09,0x5B,0x59,0xC9,0x4B,0x19,0x21,
0x19,0x29,0x12,0xF2,0x0A,0x03,0x02,0x60,0x1A,0x21,0xF0,0x6D,0x64,0x8D,0x80,0x00,
0x2C,0x8F,0x80,0x00,0xE4,0x93,0x80,0x00,0xE0,0x93,0x80,0x00,0x00,0x80,0xFF,0xFF,
0x94,0x8E,0x80,0x00,0x88,0x93,0x80,0x00,0x00,0x00,0x00,0x10,0xA0,0x16,0xB6,0x1B,
0x00,0x20,0xC6,0x23,0x31,0x27,0x54,0x2A,0x41,0x2D,0x00,0x30,0x98,0x32,0x10,0x35,
0x6C,0x37,0xB0,0x39,0xDD,0x3B,0xF7,0x3D,0x00,0x40,0xF8,0x41,0xE1,0x43,0xBE,0x45,
0x8D,0x47,0x52,0x49,0x0B,0x4B,0xBB,0x4C,0x62,0x4E,0x00,0x50,0x95,0x51,0x23,0x53,
0xA9,0x54,0x29,0x56,0xA2,0x57,0x15,0x59,0x82,0x5A,0x00,0x00,0x50,0x02,0xA0,0x04,
0xF0,0x06,0x40,0x09,0x90,0x0B,0xE0,0x0D,0x50,0x02,0xA0,0x04,0xF0,0x06,0x40,0x09,
0x90,0x0B,0xE0,0x0D,0x00,0x9F,0x80,0x00,0xFC,0x90,0x80,0x00,0xBC,0x91,0x80,0x00,
0xD8,0x9E,0x80,0x00,0x9C,0x90,0x80,0x00,0x26,0x9F,0x80,0x00,0x96,0x9F,0x80,0x00,
0x02,0x9E,0xD8,0x2D,
};
#endif

View File

@ -0,0 +1,186 @@
#include <stdbool.h>
#include <stdint.h>
#include "chsc6x_comp.h"
#include "chsc6x_platform.h"
struct ts_event {
unsigned short x; /*x coordinate */
unsigned short y; /*y coordinate */
int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
int id; /*touch ID */
};
bool chsc6x_read_touch_info(uint16_t *x, uint16_t *y)
{
int ret;
int rd_len = 0;
unsigned char point_num;
unsigned char read_buf[6];
struct ts_event events[CHSC6X_MAX_POINTS_NUM];
if(1 == CHSC6X_MAX_POINTS_NUM) {
rd_len = 3;
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
if ((CHSC6X_RES_MAX_X < 255) && (CHSC6X_RES_MAX_Y < 255) ) {
rd_len = 5;
} else {
rd_len = 6;
}
} else {
chsc6x_err("CHSC641X_MAX_POINTS_NUM more than two");
return false;
}
ret = chsc6x_i2c_read(CHSC6X_I2C_ID, read_buf, rd_len);
if(rd_len == ret) {
point_num = read_buf[0] & 0x03;
if(1 == CHSC6X_MAX_POINTS_NUM) {
events[0].x = (unsigned short)(((read_buf[0] & 0x40) >> 6) << 8) | (unsigned short)read_buf[1];
events[0].y = (unsigned short)(((read_buf[0] & 0x80) >> 7) << 8) | (unsigned short)read_buf[2];
events[0].flag= (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 000 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
if ((CHSC6X_RES_MAX_X > 255) || (CHSC6X_RES_MAX_Y > 255) ) {
events[0].x = (unsigned short)((read_buf[5] & 0x01) << 8) | (unsigned short)read_buf[1];
events[0].y = (unsigned short)((read_buf[5] & 0x02) << 7) | (unsigned short)read_buf[2];
events[0].flag = (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 111 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
events[1].x = (unsigned short)((read_buf[5] & 0x04) << 6) | (unsigned short)read_buf[3];
events[1].y = (unsigned short)((read_buf[5] & 0x08) << 5) | (unsigned short)read_buf[4];
events[1].flag = (read_buf[0] >> 6) & 0x03;
events[1].id = (read_buf[0] >>3) & 0x01;
chsc6x_info("chsc6x: 222 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
} else {
events[0].x = read_buf[1];
events[0].y = read_buf[2];
events[0].flag = (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 333 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
events[1].x = read_buf[3];
events[1].y = read_buf[4];
events[1].flag = (read_buf[0] >> 6) & 0x03;
events[1].id = (read_buf[0] >>3) & 0x01;
chsc6x_info("chsc6x: 444 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
}
}
static uint16_t last_x = 0xffff, last_y = 0xffff;
static uint8_t same_counter = 0;
*x = events[0].x;
*y = events[0].y;
if ((last_x == events[0].x) && (last_y == events[0].y)) {
if (same_counter < 10) {
same_counter++;
}
}
else {
last_x = events[0].x;
last_y = events[0].y;
same_counter = 0;
}
if ((point_num != 0)
&& ((events[0].flag == 0) || (events[0].flag == 2))
&& (same_counter < 10)) {
return true;
}
else {
return false;
}
}
else{
chsc6x_err("chsc6x: chsc6x_read_touch_info iic err! rd_len=%d, ret=%d \r\n", rd_len, ret);
return false;
}
}
void chsc6x_resume(void)
{
chsc6x_info("touch_resume");
chsc6x_tp_reset();
}
void chsc6x_suspend(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xa503, buft, 0);
if(ret == 0) {
chsc6x_info("touch_suspend OK \r\n");
}else{
chsc6x_info("touch_suspend failed \r\n");
}
}
void chsc6x_dbcheck(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd001, buft, 0); //0xd001 close
if(ret == 0) {
chsc6x_info("Enable dbcheck OK \r\n");
}else{
chsc6x_info("Enable dbcheck failed \r\n");
}
}
void chsc6x_palmcheck(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd101, buft, 0); //0xd100 close
if(ret == 0) {
chsc6x_info("Enable palmcheck OK \r\n");
}else{
chsc6x_info("Enable palmcheck failed \r\n");
}
}
void chsc6x_init(void)
{
int i = 0;
int ret = 0;
unsigned char fw_update_ret_flag = 0; //1:update OK, !0 fail
struct ts_fw_infos fw_infos;
chsc6x_tp_reset_active();
for(i = 0; i < 3; i++) {
ret = chsc6x_tp_dect(&fw_infos, &fw_update_ret_flag);
if(1 == ret) {
#if CHSC6X_AUTO_UPGRADE /* If need update FW */
chsc6x_info("chsc6x_tp_dect succeed!\r\n");
if(1 == fw_update_ret_flag) {
chsc6x_err("update fw succeed! \r\n");
break;
} else {
chsc6x_err("update fw failed! \r\n");
}
#else
break;
#endif
}else {
chsc6x_err("chsc6x_tp_dect failed! i = %d \r\n", i);
}
}
}

View File

@ -0,0 +1,339 @@
#include "chsc6x_platform.h"
#include "fr30xx.h"
void touchpad_reset_set(void);
void touchpad_reset_clear(void);
void touchpad_delay_ms(uint32_t counter);
extern I2C_HandleTypeDef i2c_touchpad_handle;
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc6x_read_only(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (0 >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = 0 & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
uint8_t to_counter = 100;
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
system_delay_us(10);
to_counter--;
if (to_counter == 0) {
break;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
if (lu32_RxCount == 0) {
return true;
}
else {
return false;
}
_exit_i2c_read:
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc6x_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
return true;
_exit_i2c_read:
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_write
*
* @brief i2c memory write.
*/
bool i2c_memory_chsc6x_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_write;
}
while (fu32_Size - 1 > 0)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = *fp_Data++;
fu32_Size--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_write;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
while(__I2C_IS_BUSY(hi2c->I2Cx));
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
return true;
_exit_i2c_write:
__NOP();
return false;
}
/* return: =read lenth succeed; <0 failed
read reg addr not need
just used for reading xy cord info*/
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_read_only(&i2c_touchpad_handle, id, p_data, lenth);
// bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, 0, p_data, lenth);
if (ret) {
return lenth;
}else{
return -1;
}
// return i2cRead(id, lenth, p_data);
}
/* RETURN:0->pass else->fail */
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, adr, rxbuf, lenth);
if (ret) {
return 0;
}else{
return -1;
}
}
/* RETURN:0->pass else->fail */
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_write(&i2c_touchpad_handle, id, adr, txbuf, lenth);
if(ret) {
return 0;
}else{
return -1;
}
}
void chsc6x_msleep(int ms)
{
touchpad_delay_ms(ms);
}
void chsc6x_tp_reset(void)
{
touchpad_reset_clear();
touchpad_delay_ms(30);//30ms
touchpad_reset_set();
touchpad_delay_ms(30);//30ms
}
void chsc6x_tp_reset_active(void)
{
touchpad_reset_clear();
touchpad_delay_ms(30);//30ms
touchpad_reset_set();
touchpad_delay_ms(30);//30ms
}

View File

@ -0,0 +1,51 @@
#ifndef __CHSC6X_PLATFORM_H__
#define __CHSC6X_PLATFORM_H__
#include <stdio.h>
#if 0
#define chsc6x_info(x...) pr_notice("[chsc6x] " x)
#define chsc6x_err(x...) pr_err("[chsc6x][error] " x)
#else
#if 0
#define chsc6x_info printf
#define chsc6x_err printf
#else
#define chsc6x_info(x...)
#define chsc6x_err(x...)
#endif
#endif
#define CHSC6X_I2C_ID (0x5c) //8bit
#define CHSC6X_MAX_POINTS_NUM (1)
#define CHSC6X_RES_MAX_X (370)
#define CHSC6X_RES_MAX_Y (370)
/*MACRO SWITCH for driver update TP FW */
#define CHSC6X_AUTO_UPGRADE (0)
/*MACRO SWITCH for multi TP_VENDOR Compatible update TP FW */
#define CHSC6X_MUL_VENDOR_UPGRADE (0)
#define MAX_IIC_WR_LEN (8)
#define MAX_IIC_RD_LEN (16)
/* fail : <0 */
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth);
/* RETURN:0->pass else->fail */
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth);
/* RETURN:0->pass else->fail */
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth);
void chsc6x_msleep(int ms);
void chsc6x_tp_reset(void);
void chsc6x_tp_reset_active(void);
#endif

View File

@ -0,0 +1,119 @@
#ifndef __CHSC6X_RAMCODE_H__
#define __CHSC6X_RAMCODE_H__
const unsigned char fw_fcode_burn[1784] = {
0x08,0x80,0x6F,0x6D,0x00,0x00,0xF8,0x06,0x4B,0x4E,0x4C,0x54,0x80,0x01,0x88,0x00,
0x34,0x80,0xC0,0x46,0x00,0xA0,0x17,0x09,0x17,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,
0xFB,0xCB,0x0C,0x08,0xC0,0x6B,0x0D,0x08,0x85,0x06,0x0B,0x08,0xC0,0x6B,0x0C,0x08,
0x85,0x06,0x0C,0x09,0x40,0xA0,0x08,0x40,0x40,0xA0,0x48,0x40,0x0A,0x09,0x0B,0x0A,
0x0B,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,0xF9,0xCB,0x00,0x90,
0xF5,0x9A,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x9D,0x80,0x00,
0xF0,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0xF8,0x06,0x00,0x00,0x04,0x8D,0x80,0x00,
0x04,0x8D,0x80,0x00,0x04,0x8D,0x80,0x00,0x00,0xA0,0x80,0x00,0x30,0x00,0x00,0x00,
0x4D,0x03,0x00,0x00,0x31,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x33,0x00,0x00,0x00,
0xD9,0x04,0x00,0x00,0x32,0x00,0x00,0x00,0xD1,0x02,0x00,0x00,0x30,0x65,0x07,0x0C,
0x01,0xA3,0x23,0x40,0x05,0xF6,0x1C,0xA0,0x00,0x90,0x9E,0x98,0x00,0xA3,0x23,0x40,
0x03,0x0B,0x2D,0xFE,0x1D,0x40,0x00,0x90,0xC7,0x98,0x30,0x6D,0x0D,0x00,0x80,0x00,
0x0C,0x00,0x80,0x00,0xF0,0x65,0xFA,0xA0,0xC0,0xF0,0x00,0x90,0x8D,0x98,0x05,0xA0,
0xFF,0x97,0xE4,0x9F,0x0A,0x0C,0x0B,0x0D,0x00,0xA6,0x01,0xA7,0x05,0x80,0xC8,0xA0,
0x01,0xBC,0x00,0x90,0x81,0x98,0x00,0xAC,0x05,0xC0,0x2E,0x40,0x00,0x90,0xAC,0x98,
0x2B,0x48,0x1F,0x02,0xF3,0xC1,0x04,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0xC0,0x46,
0x80,0x96,0x98,0x00,0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x30,0x65,0x07,0x0C,
0x03,0xFC,0x05,0xEC,0x23,0x40,0x00,0x90,0x97,0x98,0x2B,0xFA,0x23,0x40,0x00,0x90,
0x93,0x98,0x25,0x40,0x00,0x90,0x90,0x98,0x30,0x6D,0xC0,0x46,0x0C,0x00,0x80,0x00,
0x10,0x65,0x04,0xEC,0x06,0xA0,0xFF,0x97,0xB1,0x9F,0x20,0xA0,0xFF,0x97,0xAE,0x9F,
0x20,0xEC,0xFF,0x97,0xE3,0x9F,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0xBA,0x9F,
0x10,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x03,0xA0,0x0D,0xEC,
0x16,0xEC,0x0E,0x0F,0xFF,0x97,0x9A,0x9F,0x20,0xEC,0xFF,0x97,0xCF,0x9F,0x00,0xA3,
0x3B,0x40,0x00,0x90,0x69,0x98,0x0A,0x0B,0x0A,0xA2,0x1A,0x40,0x00,0x90,0x64,0x98,
0x00,0xAD,0x07,0xC0,0x00,0xA4,0x3B,0x48,0x33,0x15,0x01,0xB4,0x00,0x90,0x5C,0x98,
0xAC,0x02,0xF8,0xC1,0x02,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0x0C,0x00,0x80,0x00,
0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x06,0xA0,0x0D,0xEC,0x16,0xEC,0xFF,0x97,
0x75,0x9F,0x02,0xA0,0xFF,0x97,0x72,0x9F,0x20,0xEC,0xFF,0x97,0xA7,0x9F,0x00,0xAD,
0x08,0xC0,0x07,0x0F,0x00,0xA4,0x33,0x1D,0x01,0xB4,0x3B,0x40,0x00,0x90,0x3C,0x98,
0xA5,0x02,0xF8,0xC8,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0x73,0x9F,0xF0,0x6D,
0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x06,0x09,0x0B,0x58,0x81,0x60,0x00,0x33,
0x43,0xF0,0x18,0xE8,0xC0,0xF0,0x0A,0x58,0x00,0x3B,0xD3,0xEA,0x83,0x02,0xFA,0xC9,
0x01,0x60,0x70,0x07,0x30,0x06,0x80,0x00,0x10,0x65,0x94,0xE0,0x00,0xAC,0x05,0xCD,
0x00,0xA3,0x04,0xD9,0x01,0xB3,0x04,0xD0,0xA3,0x02,0xFA,0xC1,0x10,0x6D,0xC0,0x46,
0x10,0x65,0x09,0xF4,0x49,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xA9,0x0B,0xC0,0x4C,0xEE,
0x24,0xF4,0xE4,0xFB,0x02,0xB4,0x00,0xA2,0x99,0x1A,0x40,0xE8,0x00,0xF4,0x02,0xB2,
0x00,0xFC,0xA2,0x02,0xF8,0xC1,0x10,0x6D,0x30,0x65,0x06,0x0D,0x2B,0x48,0xDA,0xF6,
0x06,0xC5,0x10,0xA4,0x1C,0xA0,0xFF,0x97,0xC7,0x9F,0x2B,0x48,0x1C,0x02,0xF9,0xC1,
0x30,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x01,0xA2,0x1A,0x40,0x70,0x07,
0x0D,0x00,0x80,0x00,0x01,0x0B,0x00,0xA2,0x1A,0x40,0x70,0x07,0x0D,0x00,0x80,0x00,
0x01,0x0B,0x18,0x40,0x70,0x07,0xC0,0x46,0x0C,0x00,0x80,0x00,0x01,0x0B,0x18,0x40,
0x70,0x07,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,
0x0C,0x00,0x80,0x00,0x10,0x65,0x03,0x0C,0x00,0xA3,0x23,0x40,0xFF,0x97,0xCC,0x9F,
0x20,0x48,0x10,0x6D,0x0C,0x00,0x80,0x00,0x10,0x65,0x04,0x0C,0x00,0xA3,0x23,0x40,
0xFF,0x97,0xC2,0x9F,0x23,0x48,0x01,0xA0,0x18,0x00,0x10,0x6D,0x0C,0x00,0x80,0x00,
0x30,0x65,0x80,0xA3,0xC2,0x28,0x5B,0xF1,0x9A,0x02,0x04,0xC0,0x0C,0x0B,0x1B,0x58,
0x05,0xA2,0x5A,0x40,0x30,0x6D,0x84,0x28,0x45,0x28,0x00,0xAC,0x0B,0xC0,0x2D,0xF3,
0x28,0xEC,0x01,0xBC,0xFF,0x97,0x1C,0x9F,0x24,0xF4,0x80,0xA3,0x5B,0xF1,0x24,0xFC,
0xED,0xE8,0x00,0xAC,0xF4,0xC1,0x02,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,0xE9,0x87,
0x04,0x8D,0x80,0x00,0x30,0x65,0xC2,0x28,0x84,0x28,0x43,0x28,0x09,0x0D,0x12,0xF4,
0x10,0xEC,0x18,0x03,0x2A,0xEC,0x21,0xEC,0xFF,0x97,0x16,0x9F,0x28,0xEC,0x21,0xEC,
0x00,0x90,0xC4,0x99,0x04,0x0B,0x1B,0x58,0x00,0xA2,0x58,0x20,0x00,0xFC,0x98,0x20,
0x5A,0x40,0x30,0x6D,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0xF0,0x65,0x5F,0x06,
0x56,0x06,0x4D,0x06,0x44,0x06,0xF0,0x64,0x83,0x28,0x42,0x28,0x04,0xEC,0x19,0xEC,
0x38,0x08,0x92,0x06,0x99,0x06,0x00,0x90,0xA9,0x99,0xA3,0x29,0xE2,0x28,0x1B,0xF4,
0x9B,0xE8,0x83,0x02,0x09,0xC0,0x34,0x0B,0x1B,0x58,0x03,0xA2,0x5A,0x40,0x3C,0x6C,
0x90,0x06,0x99,0x06,0xA2,0x06,0xAB,0x06,0xF0,0x6D,0x54,0x06,0x23,0xF5,0x00,0xAB,
0x4E,0xC0,0x00,0xA2,0x91,0x05,0x4F,0xC0,0x80,0xA3,0x5C,0xF0,0x4D,0x06,0x00,0xA7,
0xA3,0x06,0x2C,0xEC,0x5D,0x05,0x01,0xC9,0x80,0xA4,0x64,0xF0,0x25,0x0B,0xB8,0x06,
0xFE,0xE8,0xD0,0x04,0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xF3,0x9E,0x2D,0xEB,
0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xED,0x9E,0x3F,0xE9,0x00,0xAD,0xE8,0xC1,
0x80,0xA7,0x4D,0x06,0x00,0xA6,0x7F,0xF0,0x2C,0xEC,0xBD,0x02,0x01,0xC9,0x80,0xA4,
0x64,0xF0,0x1A,0x0B,0x30,0xEC,0xF2,0xE8,0x50,0x04,0x21,0xEC,0x2D,0xEB,0xFF,0x97,
0xB3,0x9E,0x36,0xE9,0x00,0xAD,0xEF,0xC1,0x13,0x0B,0x18,0x58,0x11,0x0B,0x45,0x40,
0x1A,0x48,0x12,0x0B,0x1B,0x48,0x9A,0x02,0x0F,0xC1,0x00,0xA3,0x07,0x80,0x0D,0x0C,
0x19,0xE9,0x0E,0x0C,0x1A,0xE9,0x09,0x48,0x12,0x48,0x91,0x02,0x05,0xC1,0x01,0xB3,
0x99,0x05,0xF4,0xC8,0x00,0xA3,0x43,0x20,0xA9,0x87,0x09,0xA3,0x43,0x40,0xA6,0x87,
0x50,0x06,0xFF,0x97,0x7D,0x9E,0xAC,0x87,0x03,0x0B,0x18,0x58,0x4A,0x06,0x42,0x40,
0xF0,0x87,0xC0,0x46,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0x80,0x94,0x80,0x00,
0xF0,0x65,0x57,0x06,0x46,0x06,0xC0,0x64,0x80,0xA3,0x07,0xF4,0x00,0xA4,0xDB,0xF0,
0x3F,0xFC,0x00,0xA5,0xA0,0x06,0x9A,0x06,0x3E,0xEC,0x57,0x05,0x01,0xC9,0x80,0xA6,
0xF6,0xF0,0x36,0xF4,0x36,0xFC,0x40,0x06,0x31,0xEC,0x15,0x0A,0xFF,0x97,0x6C,0x9E,
0x00,0xAE,0x19,0xC0,0x70,0xEE,0x13,0x0B,0x00,0xF4,0x00,0xFC,0xC0,0xE8,0x42,0x06,
0x01,0xBB,0x19,0x48,0x64,0xE8,0x51,0x03,0x01,0xB2,0x6D,0xE8,0x24,0xF4,0x2D,0xF4,
0x12,0xF4,0x01,0xB3,0x24,0xFC,0x2D,0xFC,0x12,0xFC,0x83,0x02,0xF1,0xC1,0x33,0xEC,
0x43,0x04,0x1B,0xF4,0x1B,0xFC,0x98,0x06,0xBF,0xEB,0x3F,0xF4,0x3F,0xFC,0x00,0xAF,
0xD2,0xC1,0x28,0xF4,0x20,0x03,0x0C,0x6C,0x90,0x06,0x9A,0x06,0xF0,0x6D,0xC0,0x46,
0x00,0x90,0x80,0x00,0x01,0x90,0x80,0x00,0xF0,0x65,0x19,0x0C,0x00,0xA0,0x08,0xA1,
0x22,0xEC,0xFF,0x97,0x39,0x9E,0x23,0x58,0x01,0xB3,0x1F,0xC0,0x15,0x0B,0x1C,0x28,
0x80,0xA3,0x1B,0xF2,0xA3,0x02,0x00,0xC2,0xF0,0x6D,0x13,0x0B,0x1E,0x28,0x13,0x0B,
0xF6,0xE8,0x73,0xEE,0x9E,0x01,0x00,0xAE,0xF6,0xC1,0x20,0xEC,0xFF,0x97,0xA0,0x9F,
0x0B,0x0D,0x07,0xEC,0x08,0xA1,0x20,0xEC,0x2A,0xEC,0xFF,0x97,0x1D,0x9E,0x2B,0x58,
0xBB,0x02,0xE9,0xC1,0x0A,0x0B,0x1B,0x58,0x5E,0x40,0xE5,0x87,0x09,0x0B,0x1B,0x58,
0x01,0xB3,0xDB,0xC1,0x06,0x0B,0x1B,0x58,0x08,0xA2,0x5A,0x40,0xDC,0x87,0xC0,0x46,
0x00,0x90,0x80,0x00,0x06,0x90,0x80,0x00,0x02,0x90,0x80,0x00,0xCA,0xCA,0xFF,0xFF,
0x04,0x8D,0x80,0x00,0x04,0x90,0x80,0x00,0x70,0x65,0x22,0x0D,0x2B,0x58,0x0F,0xA2,
0x1A,0x40,0x09,0xA2,0x5A,0x40,0x0C,0xA1,0x04,0xEC,0xFF,0x97,0x59,0x9E,0x23,0x48,
0x00,0xA8,0x13,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x0F,0xC1,0x1A,0x0A,0x11,0x48,
0x99,0x02,0x2B,0xC0,0x11,0x4A,0x99,0x02,0x2A,0xC0,0x11,0x4C,0x99,0x02,0x11,0xC0,
0x11,0x4E,0x03,0xA0,0x99,0x02,0x0E,0xC0,0x28,0x58,0x03,0x80,0x28,0x58,0x03,0xA3,
0x43,0x40,0x23,0x48,0x03,0x40,0x06,0xA1,0xFF,0x97,0x3A,0x9E,0x2B,0x58,0x40,0x02,
0xD8,0x20,0x70,0x6D,0x02,0xA0,0x0D,0x09,0x00,0xA3,0x0B,0x40,0x80,0xB1,0x0B,0x40,
0x0B,0x0E,0xC3,0xF0,0x05,0xA1,0xD2,0xE8,0x53,0x58,0x20,0xEC,0x31,0x40,0x00,0x90,
0x73,0x98,0x01,0xA3,0x33,0x40,0x28,0x58,0x23,0x48,0xE3,0x87,0x00,0xA0,0xEA,0x87,
0x01,0xA0,0xE8,0x87,0x04,0x8D,0x80,0x00,0x7C,0x00,0x00,0x00,0x00,0x9E,0x80,0x00,
0x03,0x00,0x80,0x00,0x30,0x65,0x0D,0x0C,0x63,0x4A,0x35,0xAB,0x00,0xC0,0x30,0x6D,
0xFA,0xA0,0x80,0xF0,0xFF,0x97,0xF0,0x9D,0x09,0x0D,0x21,0xEC,0x10,0xA2,0x28,0xEC,
0xFF,0x97,0xFA,0x9D,0x28,0xEC,0xFF,0x97,0x9F,0x9F,0x06,0x08,0x06,0x09,0x10,0xA2,
0xFF,0x97,0xF2,0x9D,0x30,0xA3,0x63,0x42,0xE9,0x87,0xC0,0x46,0x00,0x9F,0x80,0x00,
0x80,0x9F,0x80,0x00,0x40,0x9F,0x80,0x00,0xC0,0x9F,0x80,0x00,0x00,0x65,0x13,0x0B,
0x13,0x0A,0x19,0x58,0x0A,0x00,0x1A,0x50,0x12,0x0B,0x55,0xA2,0x1A,0x40,0x12,0x0A,
0x12,0x0B,0x1A,0x20,0x12,0x0A,0x13,0x0B,0x1A,0x50,0x13,0x0A,0xFF,0xA3,0x1B,0xF6,
0x13,0x50,0x01,0xA3,0x5B,0x02,0x04,0xB2,0x13,0x20,0x10,0x0B,0x00,0xA2,0x10,0x09,
0x1A,0x40,0x01,0xA3,0x0B,0x40,0x10,0xB1,0x0A,0x50,0x0E,0x0A,0x13,0x40,0x80,0xA3,
0x1B,0xF4,0x1F,0xA2,0x1A,0x40,0xFF,0x97,0xB5,0x9F,0xFC,0x87,0x40,0x06,0x80,0x00,
0xFF,0xFF,0xFF,0xFE,0x10,0x04,0x80,0x00,0x00,0x9E,0xFF,0xFF,0x28,0x00,0x80,0x00,
0xC0,0x9F,0x80,0x00,0x04,0x8D,0x80,0x00,0x60,0x00,0x80,0x00,0x68,0x00,0x80,0x00,
0x20,0x06,0x80,0x00,0x03,0x00,0x80,0x00,0x18,0x07,0xC0,0x46,0x30,0x65,0x0D,0xF4,
0x2D,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xAD,0x14,0xC0,0x19,0x48,0x00,0xA4,0x01,0xB3,
0x00,0xA2,0x01,0x80,0x19,0x48,0x01,0xB3,0x08,0xE8,0x51,0x03,0x01,0xB2,0x64,0xE8,
0x12,0xF4,0x00,0xF4,0x24,0xF4,0x12,0xFC,0x00,0xFC,0x24,0xFC,0x95,0x02,0xF1,0xC8,
0x24,0xF4,0x20,0x03,0x30,0x6D,0xC0,0x46
};
#endif

View File

@ -0,0 +1,935 @@
/*===============================================================================================*/
/**
* @file touch.c
*
* @version v1.0
*/
/*=================================================================================================
Rootlink Confidential Proprietary
Advanced Technology and Software Operations
(c) Copyright Rootlink 2015 - , All Rights Reserved
Revision History:
Modification Tracking
Author Date Number Description of Changes
-------- -------- ------- ------------------------
Portability:
Indicate if this module is portable to other compilers or
platforms. If not, indicate specific reasons why is it not portable.
===================================================================================================
INCLUDE FILES
=================================================================================================*/
#include <stdint.h>
#include "fr30xx.h"
#include "chsc5816_ctp.h"
#if 0
#define PRINT_DBG printf
#else
#define PRINT_DBG(...)
#endif
#define RETRY 1000
#define _TOUCH_DOWN 0
#define _TOUCH_UP 1
#define _TOUCH_CONTACT 2
#define CHSC5816_ADDRESS (0x2e<<1)
#define _XSIZE_PHYS 368
#define _YSIZE_PHYS 448
#define __CHSC5816_RESET_SET() touchpad_reset_set()
#define __CHSC5816_RESET_CLEAR() touchpad_reset_clear()
#define HAL_Delay(counter) touchpad_delay_ms(counter)
extern I2C_HandleTypeDef i2c_touchpad_handle;
static struct sm_touch_dev st_dev;
static uint8_t counter;
void touchpad_reset_set(void);
void touchpad_reset_clear(void);
void touchpad_delay_ms(uint32_t counter);
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc5816_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint32_t fu32_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
counter = 0;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 24) & 0xFF;
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 16) & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 1;
goto _exit_i2c_read;
}
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu32_MemAddress & 0xFF;
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 2;
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
return true;
_exit_i2c_read:
PRINT_DBG("I2c r:%d\n",counter);
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_write
*
* @brief i2c memory write.
*/
bool i2c_memory_chsc5816_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
counter = 0;
if (fu32_Size < 2)
goto _exit_i2c_write;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = *fp_Data++;
hi2c->I2Cx->DATA_CMD = *fp_Data++;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 1;
goto _exit_i2c_write;
}
fu32_Size -= 2;
while (fu32_Size - 1 > 0)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = *fp_Data++;
fu32_Size--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 2;
goto _exit_i2c_write;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
while(__I2C_IS_BUSY(hi2c->I2Cx));
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
return true;
_exit_i2c_write:
PRINT_DBG("I2c w:%d\n",counter);
__NOP();
return false;
}
void semi_touch_power_int(void)
{
return;
}
static void semi_touch_msdelay(uint32_t millisecs)
{
HAL_Delay(millisecs);
}
static void semi_touch_reset(void)
{
__CHSC5816_RESET_SET();
HAL_Delay(10);
__CHSC5816_RESET_CLEAR();
HAL_Delay(5);
__CHSC5816_RESET_SET();
HAL_Delay(200);
}
int32_t semi_touch_iic_write(uint32_t reg, uint8_t* pdata, uint16_t len)
{
if(i2c_memory_chsc5816_write(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, pdata, len) == 0)
{
return -1;
}
return SEMI_DRV_ERR_OK;
}
/*
reg : must 4B aligned
len : must multiple of 4
*/
int32_t semi_i2c_read_bytes(uint32_t reg, uint8_t* pdata, uint16_t len)
{
if(i2c_memory_chsc5816_read(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, reg, pdata, len) == 0)
{
return -1;
}
return SEMI_DRV_ERR_OK;
}
/*
reg - register address, must 4B aligned
buffer - data buffer
len - data length, must 4B aligned
return:
0 - pass
others - fail
*/
int32_t semi_touch_read_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
{
int32_t ret = SEMI_DRV_ERR_OK;
uint16_t once;
uint32_t retry;
while(len > 0){
once = (len>MAX_IO_BUFFER_LEN)?MAX_IO_BUFFER_LEN:len;
ret = -1;
for(retry=0; retry<3; retry++){
if(semi_i2c_read_bytes(reg, buffer,once) == SEMI_DRV_ERR_OK){
ret = SEMI_DRV_ERR_OK;
break;
}
}
if(ret != SEMI_DRV_ERR_OK){
break;
}
reg += once;
buffer += once;
len -= once;
}
return ret;
}
/*
reg - register address, must 4B aligned
buffer - data buffer
len - data length, must 4B aligned
return:
0 - pass
others - fail
*/
int32_t semi_touch_write_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
{
int32_t ret = SEMI_DRV_ERR_OK;
uint16_t once;
uint32_t k, retry;
uint8_t writeBuff[MAX_IO_BUFFER_LEN];
while(len > 0){
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
writeBuff[0] = (uint8_t)(reg>>24);
writeBuff[1] = (uint8_t)(reg>>16);
writeBuff[2] = (uint8_t)(reg>>8);
writeBuff[3] = (uint8_t)(reg);
for(k=0; k<once; k++){
writeBuff[k+4] = buffer[k];
}
ret = -1;
for(retry=0; retry<3; retry++){
if(semi_touch_iic_write(reg, writeBuff, once+4) == SEMI_DRV_ERR_OK){
ret = SEMI_DRV_ERR_OK;
break;
}
}
if(ret != SEMI_DRV_ERR_OK){
break;
}
reg += once;
buffer += once;
len -= once;
}
return ret;
}
int32_t semi_touch_write_and_check(uint32_t addr, uint8_t* buffer, uint16_t len)
{
int32_t ret = 0, once = 0, index = 0, retry = 0;
uint8_t cmp_buffer[MAX_IO_BUFFER_LEN-4];
while(len > 0){
retry = 0;
do{
ret = SEMI_DRV_ERR_OK;
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
ret = semi_touch_write_bytes(addr, buffer, once);
ret = semi_touch_read_bytes(addr, cmp_buffer, once);
for(index = 0; index < once; index++){
if(cmp_buffer[index] != buffer[index]){
ret = -SEMI_DRV_ERR_CHECKSUM;
break;
}
}
if(SEMI_DRV_ERR_OK == ret){
break;
}
}while(++retry < 3);
if(SEMI_DRV_ERR_OK != ret){
break;
}
addr += once;
buffer += once;
len -= once;
}
return ret;
}
int32_t semi_touch_run_ram_code(const uint8_t* bin_code, uint16_t len)
{
int32_t retry;
int32_t ret = 0, reg_value = 0;
for(retry = 0; retry < 5; retry++){
//reset mcu
semi_touch_reset();
//hold mcu
reg_value = 0x12044000;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
continue;
}
//open auto feed
reg_value = 0x0000925a;
ret = semi_touch_write_bytes(0x40007010, (uint8_t*)&reg_value, 4);
if(ret != 0){
continue;
}
//run ramcode
ret = semi_touch_write_and_check(0x20000000, (uint8_t* )bin_code, len);
if(ret != 0){
continue;
}
break;
}
if(ret != 0){
return -1;
}
//remap
reg_value = 0x12044002;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
return -1;
}
//release mcu
reg_value = 0x12044003;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
return -1;
}
semi_touch_msdelay(30);
return 0;
}
static uint16_t caculate_checksum_u16(uint16_t *buf, uint16_t length)
{
uint16_t sum, len, i;
sum = 0;
len = length >> 1;
for (i = 0; i < len; i++) {
sum += buf[i];
}
return sum;
}
static uint32_t caculate_checksum_ex(uint8_t * buf, uint16_t length)
{
uint32_t combchk = 0;
uint16_t k = 0, check = 0, checkex = 0;
for (k = 0; k < length; k++) {
check += buf[k];
checkex += (uint16_t)(k * buf[k]);
}
combchk = (checkex<<16) | check;
return combchk;
}
static int32_t cmd_send_to_tp(struct m_ctp_cmd_std_t *ptr_cmd, struct m_ctp_rsp_std_t *ptr_rsp,
int32_t once_delay, int32_t poolgap)
{
int32_t ret = -SEMI_DRV_ERR_HAL_IO;
uint32_t retry = 0;
uint32_t cmd_rsp_ok = 0;
ptr_cmd->tag = 0xE9;
ptr_cmd->chk = 1 + ~caculate_checksum_u16((uint16_t*)&ptr_cmd->d0, sizeof(struct m_ctp_cmd_std_t) - 2);
ret = semi_touch_write_bytes(0x20000000, (uint8_t*)ptr_cmd, sizeof(struct m_ctp_cmd_std_t));
if(ret != 0){ // TODO: need confirm!!!
return -1;
}
semi_touch_msdelay(once_delay);
while(retry++ < 20){
semi_touch_msdelay(poolgap);
ret = semi_touch_read_bytes(0x20000000, (uint8_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t));
if(ret != 0){ // TODO: need confirm!!!
return -1;
}
if(ptr_cmd->id != ptr_rsp->id){
continue;
}
if(!caculate_checksum_u16((uint16_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t))){
if(0 == ptr_rsp->cc){ //success
cmd_rsp_ok = 1;
}
break;
}
}
ret = -1;
if(cmd_rsp_ok == 1){
ret = SEMI_DRV_ERR_OK;
}
return ret;
}
/*
return:
0(SEMI_DRV_ERR_OK) ->success
others ->fail
*/
static int32_t semi_touch_nvm_read(uint8_t *pdes, uint32_t adr, uint32_t len)
{
int32_t ret = -1;
uint32_t left = len;
uint32_t local_check, retry;
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_MEM_RD;
while (left) {
len = (left > 1024) ? 1024 : left;
cmd_send_tp.d0 = adr & 0xffff;
cmd_send_tp.d1 = len;
cmd_send_tp.d2 = 0;
cmd_send_tp.d3 = NVM_R;
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
retry = 0;
while (retry++ < 3) {
ack_from_tp.id = CMD_NA;
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 10);
if(SEMI_DRV_ERR_OK != ret){
continue;
}
semi_touch_read_bytes(TP_RD_BUFF_ADDR, pdes, len);
local_check = caculate_checksum_ex(pdes, len);
if ((ack_from_tp.d0 != (uint16_t)local_check) ||
(ack_from_tp.d1 != (uint16_t)(local_check >> 16))){
ret = -SEMI_DRV_ERR_CHECKSUM;
continue;
}
break;
}
adr += len;
left -= len;
pdes += len;
if(ret != SEMI_DRV_ERR_OK){
break;
}
}
return ret;
}
static int32_t semi_touch_nvm_write(uint8_t *psrc, uint32_t adr, uint32_t len)
{
int32_t ret = -1;
uint32_t left = len;
uint32_t retry, combChk;
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_MEM_WR;
while (left) {
len = (left > 1024) ? 1024 : left;
combChk = caculate_checksum_ex(psrc, len);
cmd_send_tp.d0 = adr & 0xffff; /* addrss space[0,64K) */
cmd_send_tp.d1 = len;
cmd_send_tp.d3 = NVM_W;
cmd_send_tp.d2 = (uint16_t) combChk;
cmd_send_tp.d4 = (uint16_t) (combChk >> 16);
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
retry = 0;
while (++retry <= 3) {
ret = semi_touch_write_bytes(TP_WR_BUFF_ADDR, psrc, len);
if(SEMI_DRV_ERR_OK != ret) continue;
ack_from_tp.id = CMD_NA;
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 200, 20);
if(SEMI_DRV_ERR_OK != ret) continue;
break;
}
left -= len;
adr += len;
psrc += len;
if(ret != SEMI_DRV_ERR_OK){
break;
}
}
return ret;
}
static int32_t semi_touch_burn_erase(void)
{
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_FLASH_ERASE;
cmd_send_tp.d0 = 0x01;
return cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 1000, 40);
}
/*
This function push IC into NVM mode, call it carefully and must reset
IC to enter normal mode.
return:
0(SEMI_DRV_ERR_OK) ->success
others ->fail
*/
static int32_t semi_touch_enter_burn_mode(void)
{
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
ack_from_tp.d0 = 0;
cmd_send_tp.id = CMD_IDENTITY;
cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5);
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
return SEMI_DRV_ERR_OK;
}
if(semi_touch_run_ram_code(fw_5816_burn, sizeof(fw_5816_burn)) != 0){
return -1;
}
cmd_send_tp.id = CMD_IDENTITY;
if(cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5) != 0){
return -1;
}
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
return SEMI_DRV_ERR_OK;
}
return -SEMI_DRV_ERR_HAL_IO;
}
static int32_t semi_get_backup_pid(uint32_t *id)
{
st_dev.ctp_status = CTP_UPGRAD_RUNING;
if(semi_touch_enter_burn_mode() != SEMI_DRV_ERR_OK){
return -1;
}
return semi_touch_nvm_read((uint8_t *)id, VID_PID_BACKUP_ADDR, 4);
}
static int32_t semi_touch_update_check(void)
{
uint32_t pvid;
uint8_t * pfw;
uint32_t * plist;
int32_t k, idx_active;
uint16_t upd_boot_ver = 0;
struct chsc_updfile_header *upd_header;
st_dev.needUpd = 0;
st_dev.updPdata = 0;
st_dev.newBootLen = 0;
if(st_dev.setup_ok == 0){
if(semi_get_backup_pid(&pvid) == 0){
st_dev.vid_pid = pvid;
}
}
if((uint32_t)chsc_upd_data & 3){
PRINT_DBG("chsc::illegal memory buffer, must 4B aliged\n");
return -SEMI_DRV_INVALID_PARAM;
}
upd_header = (struct chsc_updfile_header *)chsc_upd_data;
if((upd_header->sig != 0x43534843) || (upd_header->n_match == 0)) {
PRINT_DBG("chsc::illegal upd_header\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
if((upd_header->len_boot <= 15*1024) || (upd_header->len_boot >= 40*1024)) {
PRINT_DBG("chsc::illegal upd_header\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
plist = (uint32_t *)((uint8_t *)chsc_upd_data + sizeof(struct chsc_updfile_header));
pfw = (uint8_t *)plist + (upd_header->n_match*4) + upd_header->len_cfg;
if((pfw[0x30] != 0x16) || (pfw[0x31] != 0x58)){
PRINT_DBG("chsc:no chsc5816 fw found\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
st_dev.updPdata = pfw;
st_dev.newBootLen = upd_header->len_boot;
idx_active = -1;
upd_boot_ver = (pfw[0x3f] << 8) + pfw[0x3e];
for (k=0; k<upd_header->n_match; k++) {
pvid = plist[k];
PRINT_DBG("chsc::pid_vid in list=0x%x\n", pvid);
if ((pvid & PID_VID_MASK) == (st_dev.vid_pid & PID_VID_MASK)) {
PRINT_DBG("chsc::running_ver=%d, upd_ver=%d\n", st_dev.fw_ver, upd_boot_ver);
if((st_dev.fw_ver < upd_boot_ver) || (st_dev.setup_ok == 0)){
idx_active = k;
}
break;
}
}
if((st_dev.setup_ok == 0) && (idx_active < 0)){
idx_active = 0;
}
if(idx_active >= 0){
st_dev.needUpd = 1;
}
return SEMI_DRV_ERR_OK;
}
/*
return:
0 ->success
others ->fail
*/
static int32_t semi_touch_update(uint8_t *pdata, uint32_t len)
{
if((pdata == NULL) || (len<1024) || (len>0x9f00)){
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
return -1;
}
if((pdata[0x30] != 0x16) || (pdata[0x31] != 0x58)){
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
return -1;
}
if(semi_touch_enter_burn_mode() != 0){
//kal_prompt_trace(MOD_WAP,"chsc::semi_touch_enter_burn_mode fail\n");
return -1;
}
if(semi_touch_burn_erase() != 0){
PRINT_DBG("chsc::semi_touch_burn_erase fail\n");
return -1;
}
if(semi_touch_nvm_write(pdata, 0x00000000, len) != 0){
PRINT_DBG("chsc::semi_touch_nvm_write fail\n");
return -1;
}
return SEMI_DRV_ERR_OK;
}
static void semi_touch_setup_check(void)
{
int32_t retry = 0;
uint32_t naFlag = 0;
img_header_t image_header;
img_header_t image_confirm;
//clean boot status
semi_touch_write_bytes(0x20000018, (uint8_t*)&naFlag, 4);
semi_touch_reset();
st_dev.fw_ver = 0;
st_dev.vid_pid = 0;
st_dev.setup_ok = 0;//default error
image_header.sig = 0;
for(retry=0; retry<10; retry++){
semi_touch_msdelay(10);
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_header, sizeof(image_header)) != 0){
continue;
}
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_confirm, sizeof(image_confirm)) != 0){
continue;
}
if((image_header.sig != image_confirm.sig) ||
(image_header.vid_pid != image_confirm.vid_pid) ||
(image_header.raw_offet != image_confirm.raw_offet) ||
(image_header.dif_offet != image_confirm.dif_offet) ||
(image_header.fw_ver != image_confirm.fw_ver)){
//kal_prompt_trace(MOD_WAP,"chsc::double check, retry\n");
continue;
}
if(image_header.sig == 0x43534843){ //"CHSC"
st_dev.fw_ver = image_header.fw_ver;
st_dev.vid_pid = image_header.vid_pid;
st_dev.raw_adr = image_confirm.raw_offet + 0x20000000;
st_dev.setup_ok = 1;//pass
st_dev.ctp_status = CTP_POINTING_WORK;
break;
}else if(image_header.sig == 0x4F525245){ //boot self check fail
break;
}
}
return;
}
int32_t semi_touch_dect(void)
{
uint32_t u32Data, retry;
for(retry=0; retry<3; retry++){
semi_touch_reset();
if(!semi_touch_read_bytes(0x20000000, (uint8_t *)&u32Data, 4)){
return 0;
}
}
return -1;
}
void semi_touch_irq_handler_imp(void)
{
#define _UI_MAX_POINTS 1
#define GEST_CODE_ACT_LS 0x10 //left
#define GEST_CODE_ACT_RS 0x20 //right
#define GEST_CODE_ACT_US 0x30 //up
#define GEST_CODE_ACT_DS 0x40 //down
int pointed = 0;
union rpt_point_t* ppt;
unsigned char gestCode;
unsigned char data[8];
int x, y;
PRINT_DBG("semi_touch_irq_handler_imp\r\n");
if(semi_touch_read_bytes(0x2000002c, data, 8)){
PRINT_DBG("chsc:read pixel data fail\n" );
return;
}
PRINT_DBG("imp = %x %x\r\n",data[0], data[1]);
pointed = 0;
ppt = (union rpt_point_t*)&data[2];
if((data[0] == 0xff) && (data[1] <= 2)){
if(data[1] > 0){
pointed = 1;
x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
}
}else{
return;
}
}
bool semi_touch_read_coordinate(int16_t *x, int16_t *y)
{
int pointed = 0;
union rpt_point_t* ppt;
unsigned char data[8];
if(semi_touch_read_bytes(0x2000002c, data, 8)){
PRINT_DBG("chsc:read pixel data fail\n" );
return 0;
}
pointed = 0;
ppt = (union rpt_point_t*)&data[2];
if((data[0] == 0xff) && (data[1] <= 2)){
if(data[1] > 0){
pointed = 1;
*x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
*y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
PRINT_DBG("x = %d y = %d \r\n",*x, *y);
}
}
return pointed;
}
int semi_touch_init()
{
semi_touch_power_int();
if(semi_touch_dect() != SEMI_DRV_ERR_OK){
PRINT_DBG("chsc:no chsc5816\r\n" );
return -1;
}
semi_touch_setup_check();
semi_touch_update_check();
semi_touch_reset();
st_dev.ctp_status = CTP_POINTING_WORK;
PRINT_DBG("chsc init ok\r\n" );
return 0;
}

View File

@ -0,0 +1,170 @@
#include <stdint.h>
#include "driver_touchpad.h"
#include "FreeRTOS.h"
#include "task.h"
//#define TOUCHPAD_SH8601A
//#define TOUCHPAD_ICNA3310
//#define TOUCHPAD_CHSC586
//#define TOUCHPAD_CHSC6x
//#define TOUCHPAD_CTP820
#define TOUCHPAD_FT6336U
#ifdef TOUCHPAD_SH8601A
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x2C<<1) // from sh8601a
#endif
#ifdef TOUCHPAD_ICNA3310
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x48 << 1) // from icna3310
#endif
#ifdef TOUCHPAD_CTP820
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x15 << 1) // from ctp820
#endif
#ifdef TOUCHPAD_FT6336U
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x71) // from ft6336u
#endif
#ifdef TOUCHPAD_CHSC586
extern bool semi_touch_read_coordinate(int16_t *x, int16_t *y);
extern int semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
bool chsc6x_read_touch_info(int16_t *x, int16_t *y);
void chsc6x_init(void);
#endif
bool touchpad_read(int16_t *x, int16_t *y)
{
#ifdef TOUCHPAD_SH8601A
uint8_t buffer[8];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0, buffer, 8);
if (buffer[2] != 0) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_ICNA3310
uint8_t buffer[9];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x1000, buffer, 9);
if (buffer[1] == 1) {
*x = ((buffer[4]&0x0f)<<8) | buffer[3];
*y = ((buffer[6]&0x0f)<<8) | buffer[5];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_CHSC586
return semi_touch_read_coordinate(x, y);
#endif
#ifdef TOUCHPAD_CHSC6x
return chsc6x_read_touch_info(x, y);
#endif
#ifdef TOUCHPAD_CTP820
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_FT6336U
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
return false;
}
void touchpad_init(void)
{
#ifdef TOUCHPAD_ICNA3310
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(5);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(200);
#endif
#ifdef TOUCHPAD_CHSC586
semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
chsc6x_init();
#endif
#ifdef TOUCHPAD_CTP820
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(50);
#endif
#ifdef TOUCHPAD_FT6336U
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_RESET_CLEAR();
vTaskDelay(10);
__TOUCHPAD_RESET_SET();
vTaskDelay(250);
#endif
}
void touchpad_sleep(void)
{
#ifdef TOUCHPAD_CTP820
uint8_t value = 0x03;
i2c_memory_write(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0xE5, &value, 1);
#endif
}

View File

@ -0,0 +1,88 @@
#ifndef _DRIVER_TOUCHPAD_H
#define _DRIVER_TOUCHPAD_H
#include <stdint.h>
#include "driver_i2c.h"
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
// Macro Variables definitions
//
//*****************************************************************************
#define __TOUCHPAD_RESET_SET() touchpad_reset_set()
#define __TOUCHPAD_RESET_CLEAR() touchpad_reset_clear()
#define __TOUCHPAD_DELAY_MS(counter) touchpad_delay_ms(counter)
//*****************************************************************************
//
// Global Variables definitions
//
//*****************************************************************************
extern I2C_HandleTypeDef i2c_touchpad_handle;
//*****************************************************************************
//
// External function definitions
//
//*****************************************************************************
/************************************************************************************
* @fn touchpad_reset_set
*
* @brief Set touchpad driver RESET pin to HIGH, this function should be implemented by user..
*/
void touchpad_reset_set(void);
/************************************************************************************
* @fn touchpad_reset_clear
*
* @brief Set touchpad driver RESET pin to LOW, this function should be implemented by user.
*/
void touchpad_reset_clear(void);
/************************************************************************************
* @fn touchpad_delay_ms
*
* @brief Used in touchpad driver. co_delay_100us or vTaskDelay can be used for implementation
* by user.
*/
void touchpad_delay_ms(uint32_t counter);
/************************************************************************************
* @fn touchpad_read
*
* @brief used to read data from touchpad, these data are update in interrupt
*
* @param x: current x position.
* y: current y position.
*
* @return true: pressed and x, y value is valid; false: released
*/
bool touchpad_read(int16_t *x, int16_t *y);
/************************************************************************************
* @fn touchpad_init
*
* @brief used to init touchpad
*/
void touchpad_init(void);
/************************************************************************************
* @fn touchpad_sleep
*
* @brief touchpad go to sleep
*/
void touchpad_sleep(void);
#ifdef __cplusplus
}
#endif
#endif // _DRIVER_TOUCHPAD_H

View File

@ -0,0 +1,870 @@
/**************************************************************************//**
* @file cmsis_armcc.h
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
* @version V5.0.4
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CMSIS_ARMCC_H
#define __CMSIS_ARMCC_H
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
#error "Please use Arm Compiler Toolchain V4.0.677 or later!"
#endif
/* CMSIS compiler control architecture macros */
#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \
(defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) )
#define __ARM_ARCH_6M__ 1
#endif
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
#define __ARM_ARCH_7M__ 1
#endif
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
#define __ARM_ARCH_7EM__ 1
#endif
/* __ARM_ARCH_8M_BASE__ not applicable */
/* __ARM_ARCH_8M_MAIN__ not applicable */
/* CMSIS compiler specific defines */
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE __inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static __inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE static __forceinline
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __declspec(noreturn)
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __weak
#endif
#ifndef __PACKED
#define __PACKED __attribute__((packed))
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT __packed struct
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION __packed union
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
#endif
#ifndef __UNALIGNED_UINT16_WRITE
#define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
#define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr)))
#endif
#ifndef __UNALIGNED_UINT32_WRITE
#define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __attribute__((aligned(x)))
#endif
#ifndef __RESTRICT
#define __RESTRICT __restrict
#endif
/* ########################### Core Function Access ########################### */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
@{
*/
/**
\brief Enable IRQ Interrupts
\details Enables IRQ interrupts by clearing the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
/* intrinsic void __enable_irq(); */
/**
\brief Disable IRQ Interrupts
\details Disables IRQ interrupts by setting the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
/* intrinsic void __disable_irq(); */
/**
\brief Get Control Register
\details Returns the content of the Control Register.
\return Control Register value
*/
__STATIC_INLINE uint32_t __get_CONTROL(void)
{
register uint32_t __regControl __ASM("control");
return(__regControl);
}
/**
\brief Set Control Register
\details Writes the given value to the Control Register.
\param [in] control Control Register value to set
*/
__STATIC_INLINE void __set_CONTROL(uint32_t control)
{
register uint32_t __regControl __ASM("control");
__regControl = control;
}
/**
\brief Get IPSR Register
\details Returns the content of the IPSR Register.
\return IPSR Register value
*/
__STATIC_INLINE uint32_t __get_IPSR(void)
{
register uint32_t __regIPSR __ASM("ipsr");
return(__regIPSR);
}
/**
\brief Get APSR Register
\details Returns the content of the APSR Register.
\return APSR Register value
*/
__STATIC_INLINE uint32_t __get_APSR(void)
{
register uint32_t __regAPSR __ASM("apsr");
return(__regAPSR);
}
/**
\brief Get xPSR Register
\details Returns the content of the xPSR Register.
\return xPSR Register value
*/
__STATIC_INLINE uint32_t __get_xPSR(void)
{
register uint32_t __regXPSR __ASM("xpsr");
return(__regXPSR);
}
/**
\brief Get Process Stack Pointer
\details Returns the current value of the Process Stack Pointer (PSP).
\return PSP Register value
*/
__STATIC_INLINE uint32_t __get_PSP(void)
{
register uint32_t __regProcessStackPointer __ASM("psp");
return(__regProcessStackPointer);
}
/**
\brief Set Process Stack Pointer
\details Assigns the given value to the Process Stack Pointer (PSP).
\param [in] topOfProcStack Process Stack Pointer value to set
*/
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
{
register uint32_t __regProcessStackPointer __ASM("psp");
__regProcessStackPointer = topOfProcStack;
}
/**
\brief Get Main Stack Pointer
\details Returns the current value of the Main Stack Pointer (MSP).
\return MSP Register value
*/
__STATIC_INLINE uint32_t __get_MSP(void)
{
register uint32_t __regMainStackPointer __ASM("msp");
return(__regMainStackPointer);
}
/**
\brief Set Main Stack Pointer
\details Assigns the given value to the Main Stack Pointer (MSP).
\param [in] topOfMainStack Main Stack Pointer value to set
*/
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
{
register uint32_t __regMainStackPointer __ASM("msp");
__regMainStackPointer = topOfMainStack;
}
/**
\brief Get Priority Mask
\details Returns the current state of the priority mask bit from the Priority Mask Register.
\return Priority Mask value
*/
__STATIC_INLINE uint32_t __get_PRIMASK(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
/**
\brief Set Priority Mask
\details Assigns the given value to the Priority Mask Register.
\param [in] priMask Priority Mask
*/
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
/**
\brief Enable FIQ
\details Enables FIQ interrupts by clearing the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __enable_fault_irq __enable_fiq
/**
\brief Disable FIQ
\details Disables FIQ interrupts by setting the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __disable_fault_irq __disable_fiq
/**
\brief Get Base Priority
\details Returns the current value of the Base Priority register.
\return Base Priority register value
*/
__STATIC_INLINE uint32_t __get_BASEPRI(void)
{
register uint32_t __regBasePri __ASM("basepri");
return(__regBasePri);
}
/**
\brief Set Base Priority
\details Assigns the given value to the Base Priority register.
\param [in] basePri Base Priority value to set
*/
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
{
register uint32_t __regBasePri __ASM("basepri");
__regBasePri = (basePri & 0xFFU);
}
/**
\brief Set Base Priority with condition
\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
or the new value increases the BASEPRI priority level.
\param [in] basePri Base Priority value to set
*/
__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
{
register uint32_t __regBasePriMax __ASM("basepri_max");
__regBasePriMax = (basePri & 0xFFU);
}
/**
\brief Get Fault Mask
\details Returns the current value of the Fault Mask register.
\return Fault Mask register value
*/
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
{
register uint32_t __regFaultMask __ASM("faultmask");
return(__regFaultMask);
}
/**
\brief Set Fault Mask
\details Assigns the given value to the Fault Mask register.
\param [in] faultMask Fault Mask value to set
*/
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask __ASM("faultmask");
__regFaultMask = (faultMask & (uint32_t)1U);
}
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
/**
\brief Get FPSCR
\details Returns the current value of the Floating Point Status/Control register.
\return Floating Point Status/Control register value
*/
__STATIC_INLINE uint32_t __get_FPSCR(void)
{
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
register uint32_t __regfpscr __ASM("fpscr");
return(__regfpscr);
#else
return(0U);
#endif
}
/**
\brief Set FPSCR
\details Assigns the given value to the Floating Point Status/Control register.
\param [in] fpscr Floating Point Status/Control value to set
*/
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
{
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
register uint32_t __regfpscr __ASM("fpscr");
__regfpscr = (fpscr);
#else
(void)fpscr;
#endif
}
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/*@} end of CMSIS_Core_RegAccFunctions */
/* ########################## Core Instruction Access ######################### */
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
Access to dedicated instructions
@{
*/
/**
\brief No Operation
\details No Operation does nothing. This instruction can be used for code alignment purposes.
*/
#define __NOP __nop
/**
\brief Wait For Interrupt
\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
*/
#define __WFI __wfi
/**
\brief Wait For Event
\details Wait For Event is a hint instruction that permits the processor to enter
a low-power state until one of a number of events occurs.
*/
#define __WFE __wfe
/**
\brief Send Event
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
*/
#define __SEV __sev
/**
\brief Instruction Synchronization Barrier
\details Instruction Synchronization Barrier flushes the pipeline in the processor,
so that all instructions following the ISB are fetched from cache or memory,
after the instruction has been completed.
*/
#define __ISB() do {\
__schedule_barrier();\
__isb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Data Synchronization Barrier
\details Acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
#define __DSB() do {\
__schedule_barrier();\
__dsb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Data Memory Barrier
\details Ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
#define __DMB() do {\
__schedule_barrier();\
__dmb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Reverse byte order (32 bit)
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
\param [in] value Value to reverse
\return Reversed value
*/
#define __REV __rev
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
\param [in] value Value to reverse
\return Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
{
rev16 r0, r0
bx lr
}
#endif
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
\param [in] value Value to reverse
\return Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
{
revsh r0, r0
bx lr
}
#endif
/**
\brief Rotate Right in unsigned value (32 bit)
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
\param [in] op1 Value to rotate
\param [in] op2 Number of Bits to rotate
\return Rotated value
*/
#define __ROR __ror
/**
\brief Breakpoint
\details Causes the processor to enter Debug state.
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
\param [in] value is ignored by the processor.
If required, a debugger can use it to store additional information about the breakpoint.
*/
#define __BKPT(value) __breakpoint(value)
/**
\brief Reverse bit order of value
\details Reverses the bit order of the given value.
\param [in] value Value to reverse
\return Reversed value
*/
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
#define __RBIT __rbit
#else
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
{
uint32_t result;
uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
result = value; /* r will be reversed bits of v; first get LSB of v */
for (value >>= 1U; value != 0U; value >>= 1U)
{
result <<= 1U;
result |= value & 1U;
s--;
}
result <<= s; /* shift when v's highest bits are zero */
return result;
}
#endif
/**
\brief Count leading zeros
\details Counts the number of leading zeros of a data value.
\param [in] value Value to count the leading zeros
\return number of leading zeros in value
*/
#define __CLZ __clz
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
/**
\brief LDR Exclusive (8 bit)
\details Executes a exclusive LDR instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
#else
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief LDR Exclusive (16 bit)
\details Executes a exclusive LDR instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
#else
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief LDR Exclusive (32 bit)
\details Executes a exclusive LDR instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
#else
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief STR Exclusive (8 bit)
\details Executes a exclusive STR instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXB(value, ptr) __strex(value, ptr)
#else
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief STR Exclusive (16 bit)
\details Executes a exclusive STR instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXH(value, ptr) __strex(value, ptr)
#else
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief STR Exclusive (32 bit)
\details Executes a exclusive STR instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXW(value, ptr) __strex(value, ptr)
#else
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief Remove the exclusive lock
\details Removes the exclusive lock which is created by LDREX.
*/
#define __CLREX __clrex
/**
\brief Signed Saturate
\details Saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
#define __SSAT __ssat
/**
\brief Unsigned Saturate
\details Saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
#define __USAT __usat
/**
\brief Rotate Right with Extend (32 bit)
\details Moves each bit of a bitstring right by one bit.
The carry input is shifted in at the left end of the bitstring.
\param [in] value Value to rotate
\return Rotated value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
{
rrx r0, r0
bx lr
}
#endif
/**
\brief LDRT Unprivileged (8 bit)
\details Executes a Unprivileged LDRT instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
/**
\brief LDRT Unprivileged (16 bit)
\details Executes a Unprivileged LDRT instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
/**
\brief LDRT Unprivileged (32 bit)
\details Executes a Unprivileged LDRT instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
/**
\brief STRT Unprivileged (8 bit)
\details Executes a Unprivileged STRT instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRBT(value, ptr) __strt(value, ptr)
/**
\brief STRT Unprivileged (16 bit)
\details Executes a Unprivileged STRT instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRHT(value, ptr) __strt(value, ptr)
/**
\brief STRT Unprivileged (32 bit)
\details Executes a Unprivileged STRT instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRT(value, ptr) __strt(value, ptr)
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/**
\brief Signed Saturate
\details Saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
{
if ((sat >= 1U) && (sat <= 32U))
{
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
const int32_t min = -1 - max ;
if (val > max)
{
return max;
}
else if (val < min)
{
return min;
}
}
return val;
}
/**
\brief Unsigned Saturate
\details Saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
{
if (sat <= 31U)
{
const uint32_t max = ((1U << sat) - 1U);
if (val > (int32_t)max)
{
return max;
}
else if (val < 0)
{
return 0U;
}
}
return (uint32_t)val;
}
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
/* ################### Compiler specific Intrinsics ########################### */
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
Access to dedicated SIMD instructions
@{
*/
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
#define __SADD8 __sadd8
#define __QADD8 __qadd8
#define __SHADD8 __shadd8
#define __UADD8 __uadd8
#define __UQADD8 __uqadd8
#define __UHADD8 __uhadd8
#define __SSUB8 __ssub8
#define __QSUB8 __qsub8
#define __SHSUB8 __shsub8
#define __USUB8 __usub8
#define __UQSUB8 __uqsub8
#define __UHSUB8 __uhsub8
#define __SADD16 __sadd16
#define __QADD16 __qadd16
#define __SHADD16 __shadd16
#define __UADD16 __uadd16
#define __UQADD16 __uqadd16
#define __UHADD16 __uhadd16
#define __SSUB16 __ssub16
#define __QSUB16 __qsub16
#define __SHSUB16 __shsub16
#define __USUB16 __usub16
#define __UQSUB16 __uqsub16
#define __UHSUB16 __uhsub16
#define __SASX __sasx
#define __QASX __qasx
#define __SHASX __shasx
#define __UASX __uasx
#define __UQASX __uqasx
#define __UHASX __uhasx
#define __SSAX __ssax
#define __QSAX __qsax
#define __SHSAX __shsax
#define __USAX __usax
#define __UQSAX __uqsax
#define __UHSAX __uhsax
#define __USAD8 __usad8
#define __USADA8 __usada8
#define __SSAT16 __ssat16
#define __USAT16 __usat16
#define __UXTB16 __uxtb16
#define __UXTAB16 __uxtab16
#define __SXTB16 __sxtb16
#define __SXTAB16 __sxtab16
#define __SMUAD __smuad
#define __SMUADX __smuadx
#define __SMLAD __smlad
#define __SMLADX __smladx
#define __SMLALD __smlald
#define __SMLALDX __smlaldx
#define __SMUSD __smusd
#define __SMUSDX __smusdx
#define __SMLSD __smlsd
#define __SMLSDX __smlsdx
#define __SMLSLD __smlsld
#define __SMLSLDX __smlsldx
#define __SEL __sel
#define __QADD __qadd
#define __QSUB __qsub
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
((int64_t)(ARG3) << 32U) ) >> 32U))
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/*@} end of group CMSIS_SIMD_intrinsics */
#endif /* __CMSIS_ARMCC_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,274 @@
/**************************************************************************//**
* @file cmsis_compiler.h
* @brief CMSIS compiler generic header file
* @version V5.0.4
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CMSIS_COMPILER_H
#define __CMSIS_COMPILER_H
#include <stdint.h>
/*
* Arm Compiler 4/5
*/
#if defined ( __CC_ARM )
#include "cmsis_armcc.h"
/*
* Arm Compiler 6 (armclang)
*/
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#include "cmsis_armclang.h"
/*
* GNU Compiler
*/
#elif defined ( __GNUC__ )
#include "cmsis_gcc.h"
#define __forceinline static inline
#ifndef __INLINE
#define __INLINE __forceinline
#endif
#define __IRQ __irq
#define __FIQ __irq
#define __ARRAY_EMPTY
#define __BLEIRQ
#define __MODULE__ "none.c"
/*
* IAR Compiler
*/
#elif defined ( __ICCARM__ )
#include <cmsis_iccarm.h>
/*
* TI Arm Compiler
*/
#elif defined ( __TI_ARM__ )
#include <cmsis_ccs.h>
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __attribute__((noreturn))
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif
#ifndef __PACKED
#define __PACKED __attribute__((packed))
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT struct __attribute__((packed))
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION union __attribute__((packed))
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
struct __attribute__((packed)) T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __attribute__((aligned(x)))
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
/*
* TASKING Compiler
*/
#elif defined ( __TASKING__ )
/*
* The CMSIS functions have been implemented as intrinsics in the compiler.
* Please use "carm -?i" to get an up to date list of all intrinsics,
* Including the CMSIS ones.
*/
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __attribute__((noreturn))
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif
#ifndef __PACKED
#define __PACKED __packed__
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT struct __packed__
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION union __packed__
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
struct __packed__ T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __align(x)
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
/*
* COSMIC Compiler
*/
#elif defined ( __CSMC__ )
#include <cmsis_csm.h>
#ifndef __ASM
#define __ASM _asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
// NO RETURN is automatically detected hence no warning here
#define __NO_RETURN
#endif
#ifndef __USED
#warning No compiler specific solution for __USED. __USED is ignored.
#define __USED
#endif
#ifndef __WEAK
#define __WEAK __weak
#endif
#ifndef __PACKED
#define __PACKED @packed
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT @packed struct
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION @packed union
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
@packed struct T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
#define __ALIGNED(x)
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
#else
#error Unknown compiler.
#endif
#endif /* __CMSIS_COMPILER_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,916 @@
/**************************************************************************//**
* @file cmsis_iccarm.h
* @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file
* @version V5.0.5
* @date 10. January 2018
******************************************************************************/
//------------------------------------------------------------------------------
//
// Copyright (c) 2017-2018 IAR Systems
//
// Licensed under the Apache License, Version 2.0 (the "License")
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//------------------------------------------------------------------------------
#ifndef __CMSIS_ICCARM_H__
#define __CMSIS_ICCARM_H__
#ifndef __ICCARM__
#error This file should only be compiled by ICCARM
#endif
#pragma system_include
#define __IAR_FT _Pragma("inline=forced") __intrinsic
#if (__VER__ >= 8000000)
#define __ICCARM_V8 1
#else
#define __ICCARM_V8 0
#endif
#ifndef __ALIGNED
#if __ICCARM_V8
#define __ALIGNED(x) __attribute__((aligned(x)))
#elif (__VER__ >= 7080000)
/* Needs IAR language extensions */
#define __ALIGNED(x) __attribute__((aligned(x)))
#else
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
#define __ALIGNED(x)
#endif
#endif
/* Define compiler macros for CPU architecture, used in CMSIS 5.
*/
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__
/* Macros already defined */
#else
#if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#elif defined(__ARM8M_BASELINE__)
#define __ARM_ARCH_8M_BASE__ 1
#elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M'
#if __ARM_ARCH == 6
#define __ARM_ARCH_6M__ 1
#elif __ARM_ARCH == 7
#if __ARM_FEATURE_DSP
#define __ARM_ARCH_7EM__ 1
#else
#define __ARM_ARCH_7M__ 1
#endif
#endif /* __ARM_ARCH */
#endif /* __ARM_ARCH_PROFILE == 'M' */
#endif
/* Alternativ core deduction for older ICCARM's */
#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \
!defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__)
#if defined(__ARM6M__) && (__CORE__ == __ARM6M__)
#define __ARM_ARCH_6M__ 1
#elif defined(__ARM7M__) && (__CORE__ == __ARM7M__)
#define __ARM_ARCH_7M__ 1
#elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__)
#define __ARM_ARCH_7EM__ 1
#elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__)
#define __ARM_ARCH_8M_BASE__ 1
#elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#else
#error "Unknown target."
#endif
#endif
#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1
#define __IAR_M0_FAMILY 1
#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1
#define __IAR_M0_FAMILY 1
#else
#define __IAR_M0_FAMILY 0
#endif
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __NO_RETURN
#if __ICCARM_V8
#define __NO_RETURN __attribute__((__noreturn__))
#else
#define __NO_RETURN _Pragma("object_attribute=__noreturn")
#endif
#endif
#ifndef __PACKED
#if __ICCARM_V8
#define __PACKED __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED __packed
#endif
#endif
#ifndef __PACKED_STRUCT
#if __ICCARM_V8
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED_STRUCT __packed struct
#endif
#endif
#ifndef __PACKED_UNION
#if __ICCARM_V8
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED_UNION __packed union
#endif
#endif
#ifndef __RESTRICT
#define __RESTRICT restrict
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __FORCEINLINE
#define __FORCEINLINE _Pragma("inline=forced")
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE
#endif
#ifndef __UNALIGNED_UINT16_READ
#pragma language=save
#pragma language=extended
__IAR_FT uint16_t __iar_uint16_read(void const *ptr)
{
return *(__packed uint16_t*)(ptr);
}
#pragma language=restore
#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
#pragma language=save
#pragma language=extended
__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val)
{
*(__packed uint16_t*)(ptr) = val;;
}
#pragma language=restore
#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL)
#endif
#ifndef __UNALIGNED_UINT32_READ
#pragma language=save
#pragma language=extended
__IAR_FT uint32_t __iar_uint32_read(void const *ptr)
{
return *(__packed uint32_t*)(ptr);
}
#pragma language=restore
#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
#pragma language=save
#pragma language=extended
__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val)
{
*(__packed uint32_t*)(ptr) = val;;
}
#pragma language=restore
#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL)
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
#pragma language=save
#pragma language=extended
__packed struct __iar_u32 { uint32_t v; };
#pragma language=restore
#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v)
#endif
#ifndef __USED
#if __ICCARM_V8
#define __USED __attribute__((used))
#else
#define __USED _Pragma("__root")
#endif
#endif
#ifdef __WEAK
#undef __WEAK
#endif
#ifndef __WEAK
#if __ICCARM_V8
#define __WEAK __attribute__((weak))
#else
#define __WEAK _Pragma("__weak")
#endif
#endif
#ifndef __ICCARM_INTRINSICS_VERSION__
#define __ICCARM_INTRINSICS_VERSION__ 0
#endif
#if __ICCARM_INTRINSICS_VERSION__ == 2
#if defined(__CLZ)
#undef __CLZ
#endif
#if defined(__REVSH)
#undef __REVSH
#endif
#if defined(__RBIT)
#undef __RBIT
#endif
#if defined(__SSAT)
#undef __SSAT
#endif
#if defined(__USAT)
#undef __USAT
#endif
#include "iccarm_builtin.h"
#define __disable_fault_irq __iar_builtin_disable_fiq
#define __disable_irq __iar_builtin_disable_interrupt
#define __enable_fault_irq __iar_builtin_enable_fiq
#define __enable_irq __iar_builtin_enable_interrupt
#define __arm_rsr __iar_builtin_rsr
#define __arm_wsr __iar_builtin_wsr
#define __get_APSR() (__arm_rsr("APSR"))
#define __get_BASEPRI() (__arm_rsr("BASEPRI"))
#define __get_CONTROL() (__arm_rsr("CONTROL"))
#define __get_FAULTMASK() (__arm_rsr("FAULTMASK"))
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
#define __get_FPSCR() (__arm_rsr("FPSCR"))
#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE)))
#else
#define __get_FPSCR() ( 0 )
#define __set_FPSCR(VALUE) ((void)VALUE)
#endif
#define __get_IPSR() (__arm_rsr("IPSR"))
#define __get_MSP() (__arm_rsr("MSP"))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
#define __get_MSPLIM() (0U)
#else
#define __get_MSPLIM() (__arm_rsr("MSPLIM"))
#endif
#define __get_PRIMASK() (__arm_rsr("PRIMASK"))
#define __get_PSP() (__arm_rsr("PSP"))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
#define __get_PSPLIM() (0U)
#else
#define __get_PSPLIM() (__arm_rsr("PSPLIM"))
#endif
#define __get_xPSR() (__arm_rsr("xPSR"))
#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE)))
#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE)))
#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE)))
#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE)))
#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE)))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
#define __set_MSPLIM(VALUE) ((void)(VALUE))
#else
#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE)))
#endif
#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE)))
#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE)))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
#define __set_PSPLIM(VALUE) ((void)(VALUE))
#else
#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE)))
#endif
#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS"))
#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE)))
#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS"))
#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE)))
#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS"))
#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE)))
#define __TZ_get_SP_NS() (__arm_rsr("SP_NS"))
#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE)))
#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS"))
#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE)))
#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS"))
#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE)))
#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS"))
#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE)))
#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS"))
#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE)))
#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS"))
#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE)))
#define __NOP __iar_builtin_no_operation
#define __CLZ __iar_builtin_CLZ
#define __CLREX __iar_builtin_CLREX
#define __DMB __iar_builtin_DMB
#define __DSB __iar_builtin_DSB
#define __ISB __iar_builtin_ISB
#define __LDREXB __iar_builtin_LDREXB
#define __LDREXH __iar_builtin_LDREXH
#define __LDREXW __iar_builtin_LDREX
#define __RBIT __iar_builtin_RBIT
#define __REV __iar_builtin_REV
#define __REV16 __iar_builtin_REV16
__IAR_FT int16_t __REVSH(int16_t val)
{
return (int16_t) __iar_builtin_REVSH(val);
}
#define __ROR __iar_builtin_ROR
#define __RRX __iar_builtin_RRX
#define __SEV __iar_builtin_SEV
#if !__IAR_M0_FAMILY
#define __SSAT __iar_builtin_SSAT
#endif
#define __STREXB __iar_builtin_STREXB
#define __STREXH __iar_builtin_STREXH
#define __STREXW __iar_builtin_STREX
#if !__IAR_M0_FAMILY
#define __USAT __iar_builtin_USAT
#endif
#define __WFE __iar_builtin_WFE
#define __WFI __iar_builtin_WFI
#if __ARM_MEDIA__
#define __SADD8 __iar_builtin_SADD8
#define __QADD8 __iar_builtin_QADD8
#define __SHADD8 __iar_builtin_SHADD8
#define __UADD8 __iar_builtin_UADD8
#define __UQADD8 __iar_builtin_UQADD8
#define __UHADD8 __iar_builtin_UHADD8
#define __SSUB8 __iar_builtin_SSUB8
#define __QSUB8 __iar_builtin_QSUB8
#define __SHSUB8 __iar_builtin_SHSUB8
#define __USUB8 __iar_builtin_USUB8
#define __UQSUB8 __iar_builtin_UQSUB8
#define __UHSUB8 __iar_builtin_UHSUB8
#define __SADD16 __iar_builtin_SADD16
#define __QADD16 __iar_builtin_QADD16
#define __SHADD16 __iar_builtin_SHADD16
#define __UADD16 __iar_builtin_UADD16
#define __UQADD16 __iar_builtin_UQADD16
#define __UHADD16 __iar_builtin_UHADD16
#define __SSUB16 __iar_builtin_SSUB16
#define __QSUB16 __iar_builtin_QSUB16
#define __SHSUB16 __iar_builtin_SHSUB16
#define __USUB16 __iar_builtin_USUB16
#define __UQSUB16 __iar_builtin_UQSUB16
#define __UHSUB16 __iar_builtin_UHSUB16
#define __SASX __iar_builtin_SASX
#define __QASX __iar_builtin_QASX
#define __SHASX __iar_builtin_SHASX
#define __UASX __iar_builtin_UASX
#define __UQASX __iar_builtin_UQASX
#define __UHASX __iar_builtin_UHASX
#define __SSAX __iar_builtin_SSAX
#define __QSAX __iar_builtin_QSAX
#define __SHSAX __iar_builtin_SHSAX
#define __USAX __iar_builtin_USAX
#define __UQSAX __iar_builtin_UQSAX
#define __UHSAX __iar_builtin_UHSAX
#define __USAD8 __iar_builtin_USAD8
#define __USADA8 __iar_builtin_USADA8
#define __SSAT16 __iar_builtin_SSAT16
#define __USAT16 __iar_builtin_USAT16
#define __UXTB16 __iar_builtin_UXTB16
#define __UXTAB16 __iar_builtin_UXTAB16
#define __SXTB16 __iar_builtin_SXTB16
#define __SXTAB16 __iar_builtin_SXTAB16
#define __SMUAD __iar_builtin_SMUAD
#define __SMUADX __iar_builtin_SMUADX
#define __SMMLA __iar_builtin_SMMLA
#define __SMLAD __iar_builtin_SMLAD
#define __SMLADX __iar_builtin_SMLADX
#define __SMLALD __iar_builtin_SMLALD
#define __SMLALDX __iar_builtin_SMLALDX
#define __SMUSD __iar_builtin_SMUSD
#define __SMUSDX __iar_builtin_SMUSDX
#define __SMLSD __iar_builtin_SMLSD
#define __SMLSDX __iar_builtin_SMLSDX
#define __SMLSLD __iar_builtin_SMLSLD
#define __SMLSLDX __iar_builtin_SMLSLDX
#define __SEL __iar_builtin_SEL
#define __QADD __iar_builtin_QADD
#define __QSUB __iar_builtin_QSUB
#define __PKHBT __iar_builtin_PKHBT
#define __PKHTB __iar_builtin_PKHTB
#endif
#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */
#if __IAR_M0_FAMILY
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
#define __CLZ __cmsis_iar_clz_not_active
#define __SSAT __cmsis_iar_ssat_not_active
#define __USAT __cmsis_iar_usat_not_active
#define __RBIT __cmsis_iar_rbit_not_active
#define __get_APSR __cmsis_iar_get_APSR_not_active
#endif
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
#define __get_FPSCR __cmsis_iar_get_FPSR_not_active
#define __set_FPSCR __cmsis_iar_set_FPSR_not_active
#endif
#ifdef __INTRINSICS_INCLUDED
#error intrinsics.h is already included previously!
#endif
#include <intrinsics.h>
#if __IAR_M0_FAMILY
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
#undef __CLZ
#undef __SSAT
#undef __USAT
#undef __RBIT
#undef __get_APSR
__STATIC_INLINE uint8_t __CLZ(uint32_t data)
{
if (data == 0U) { return 32U; }
uint32_t count = 0U;
uint32_t mask = 0x80000000U;
while ((data & mask) == 0U)
{
count += 1U;
mask = mask >> 1U;
}
return count;
}
__STATIC_INLINE uint32_t __RBIT(uint32_t v)
{
uint8_t sc = 31U;
uint32_t r = v;
for (v >>= 1U; v; v >>= 1U)
{
r <<= 1U;
r |= v & 1U;
sc--;
}
return (r << sc);
}
__STATIC_INLINE uint32_t __get_APSR(void)
{
uint32_t res;
__asm("MRS %0,APSR" : "=r" (res));
return res;
}
#endif
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
#undef __get_FPSCR
#undef __set_FPSCR
#define __get_FPSCR() (0)
#define __set_FPSCR(VALUE) ((void)VALUE)
#endif
#pragma diag_suppress=Pe940
#pragma diag_suppress=Pe177
#define __enable_irq __enable_interrupt
#define __disable_irq __disable_interrupt
#define __NOP __no_operation
#define __get_xPSR __get_PSR
#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0)
__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr)
{
return __LDREX((unsigned long *)ptr);
}
__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr)
{
return __STREX(value, (unsigned long *)ptr);
}
#endif
/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
#if (__CORTEX_M >= 0x03)
__IAR_FT uint32_t __RRX(uint32_t value)
{
uint32_t result;
__ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc");
return(result);
}
__IAR_FT void __set_BASEPRI_MAX(uint32_t value)
{
__asm volatile("MSR BASEPRI_MAX,%0"::"r" (value));
}
#define __enable_fault_irq __enable_fiq
#define __disable_fault_irq __disable_fiq
#endif /* (__CORTEX_M >= 0x03) */
__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2)
{
return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2));
}
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
__IAR_FT uint32_t __get_MSPLIM(void)
{
uint32_t res;
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
res = 0U;
#else
__asm volatile("MRS %0,MSPLIM" : "=r" (res));
#endif
return res;
}
__IAR_FT void __set_MSPLIM(uint32_t value)
{
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
(void)value;
#else
__asm volatile("MSR MSPLIM,%0" :: "r" (value));
#endif
}
__IAR_FT uint32_t __get_PSPLIM(void)
{
uint32_t res;
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
res = 0U;
#else
__asm volatile("MRS %0,PSPLIM" : "=r" (res));
#endif
return res;
}
__IAR_FT void __set_PSPLIM(uint32_t value)
{
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
(void)value;
#else
__asm volatile("MSR PSPLIM,%0" :: "r" (value));
#endif
}
__IAR_FT uint32_t __TZ_get_CONTROL_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,CONTROL_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value)
{
__asm volatile("MSR CONTROL_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PSP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,PSP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_PSP_NS(uint32_t value)
{
__asm volatile("MSR PSP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_MSP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,MSP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_MSP_NS(uint32_t value)
{
__asm volatile("MSR MSP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_SP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,SP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_SP_NS(uint32_t value)
{
__asm volatile("MSR SP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,PRIMASK_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value)
{
__asm volatile("MSR PRIMASK_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,BASEPRI_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value)
{
__asm volatile("MSR BASEPRI_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value)
{
__asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,PSPLIM_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value)
{
__asm volatile("MSR PSPLIM_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,MSPLIM_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value)
{
__asm volatile("MSR MSPLIM_NS,%0" :: "r" (value));
}
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */
#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value))
#if __IAR_M0_FAMILY
__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
{
if ((sat >= 1U) && (sat <= 32U))
{
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
const int32_t min = -1 - max ;
if (val > max)
{
return max;
}
else if (val < min)
{
return min;
}
}
return val;
}
__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
{
if (sat <= 31U)
{
const uint32_t max = ((1U << sat) - 1U);
if (val > (int32_t)max)
{
return max;
}
else if (val < 0)
{
return 0U;
}
}
return (uint32_t)val;
}
#endif
#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr)
{
uint32_t res;
__ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr)
{
uint32_t res;
__ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDRT(volatile uint32_t *addr)
{
uint32_t res;
__ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return res;
}
__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr)
{
__ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
}
__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr)
{
__ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
}
__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr)
{
__ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory");
}
#endif /* (__CORTEX_M >= 0x03) */
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDA(volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return res;
}
__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr)
{
__ASM volatile ("STLB %1, [%0]" :: "r" (*ptr), "r" (value) : "memory");
}
__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr)
{
__ASM volatile ("STLH %1, [%0]" :: "r" (*ptr), "r" (value) : "memory");
}
__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr)
{
__ASM volatile ("STL %1, [%0]" :: "r" (*ptr), "r" (value) : "memory");
}
__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory");
return res;
}
__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory");
return res;
}
__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory");
return res;
}
__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory");
return res;
}
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
#undef __IAR_FT
#undef __IAR_M0_FAMILY
#undef __ICCARM_V8
#pragma diag_default=Pe940
#pragma diag_default=Pe177
#endif /* __CMSIS_ICCARM_H__ */

View File

@ -0,0 +1,39 @@
/**************************************************************************//**
* @file cmsis_version.h
* @brief CMSIS Core(M) Version definitions
* @version V5.0.2
* @date 19. April 2017
******************************************************************************/
/*
* Copyright (c) 2009-2017 ARM Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#elif defined (__clang__)
#pragma clang system_header /* treat file as system include file */
#endif
#ifndef __CMSIS_VERSION_H
#define __CMSIS_VERSION_H
/* CMSIS Version definitions */
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,888 @@
/**************************************************************************//**
* @file core_cm0.h
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
* @version V5.0.3
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#elif defined (__clang__)
#pragma clang system_header /* treat file as system include file */
#endif
#ifndef __CORE_CM0_H_GENERIC
#define __CORE_CM0_H_GENERIC
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
\page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
CMSIS violates the following MISRA-C:2004 rules:
\li Required Rule 8.5, object/function definition in header file.<br>
Function definitions in header files are used to allow 'inlining'.
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
Unions are used for effective representation of core registers.
\li Advisory Rule 19.7, Function-like macro defined.<br>
Function-like macros are used to allow more efficient code.
*/
/*******************************************************************************
* CMSIS definitions
******************************************************************************/
/**
\ingroup Cortex_M0
@{
*/
#include "cmsis_version.h"
/* CMSIS CM0 definitions */
#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \
__CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
#define __CORTEX_M (0U) /*!< Cortex-M Core */
/** __FPU_USED indicates whether an FPU is used or not.
This core does not support an FPU at all
*/
#define __FPU_USED 0U
#if defined ( __CC_ARM )
#if defined __TARGET_FPU_VFP
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#if defined __ARM_PCS_VFP
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __GNUC__ )
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __ICCARM__ )
#if defined __ARMVFP__
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __TI_ARM__ )
#if defined __TI_VFP_SUPPORT__
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __TASKING__ )
#if defined __FPU_VFP__
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#elif defined ( __CSMC__ )
#if ( __CSMC__ & 0x400U)
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#endif
#endif
#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
#ifdef __cplusplus
}
#endif
#endif /* __CORE_CM0_H_GENERIC */
#ifndef __CMSIS_GENERIC
#ifndef __CORE_CM0_H_DEPENDANT
#define __CORE_CM0_H_DEPENDANT
#ifdef __cplusplus
extern "C" {
#endif
/* check device defines and use defaults */
#if defined __CHECK_DEVICE_DEFINES
#ifndef __CM0_REV
#define __CM0_REV 0x0000U
#warning "__CM0_REV not defined in device header file; using default!"
#endif
#ifndef __NVIC_PRIO_BITS
#define __NVIC_PRIO_BITS 2U
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
#endif
#ifndef __Vendor_SysTickConfig
#define __Vendor_SysTickConfig 0U
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
#endif
#endif
/* IO definitions (access restrictions to peripheral registers) */
/**
\defgroup CMSIS_glob_defs CMSIS Global Defines
<strong>IO Type Qualifiers</strong> are used
\li to specify the access to peripheral variables.
\li for automatic generation of peripheral register debug information.
*/
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions */
#else
#define __I volatile const /*!< Defines 'read only' permissions */
#endif
#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
/* following defines should be used for structure members */
#define __IM volatile const /*! Defines 'read only' structure member permissions */
#define __OM volatile /*! Defines 'write only' structure member permissions */
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
/*@} end of group Cortex_M0 */
/*******************************************************************************
* Register Abstraction
Core Register contain:
- Core Register
- Core NVIC Register
- Core SCB Register
- Core SysTick Register
******************************************************************************/
/**
\defgroup CMSIS_core_register Defines and Type Definitions
\brief Type definitions and defines for Cortex-M processor based devices.
*/
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_CORE Status and Control Registers
\brief Core Register type definitions.
@{
*/
/**
\brief Union type to access the Application Program Status Register (APSR).
*/
typedef union
{
struct
{
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} APSR_Type;
/* APSR Register Definitions */
#define APSR_N_Pos 31U /*!< APSR: N Position */
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
#define APSR_Z_Pos 30U /*!< APSR: Z Position */
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
#define APSR_C_Pos 29U /*!< APSR: C Position */
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
#define APSR_V_Pos 28U /*!< APSR: V Position */
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
/**
\brief Union type to access the Interrupt Program Status Register (IPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} IPSR_Type;
/* IPSR Register Definitions */
#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
/**
\brief Union type to access the Special-Purpose Program Status Registers (xPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} xPSR_Type;
/* xPSR Register Definitions */
#define xPSR_N_Pos 31U /*!< xPSR: N Position */
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
#define xPSR_C_Pos 29U /*!< xPSR: C Position */
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
#define xPSR_V_Pos 28U /*!< xPSR: V Position */
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
#define xPSR_T_Pos 24U /*!< xPSR: T Position */
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
/**
\brief Union type to access the Control Registers (CONTROL).
*/
typedef union
{
struct
{
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
} b; /*!< Structure used for bit access */
uint32_t w; /*!< Type used for word access */
} CONTROL_Type;
/* CONTROL Register Definitions */
#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
/*@} end of group CMSIS_CORE */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
\brief Type definitions for the NVIC Registers
@{
*/
/**
\brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
*/
typedef struct
{
__IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[31U];
__IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[31U];
__IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[31U];
__IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[31U];
uint32_t RESERVED4[64U];
__IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
} NVIC_Type;
/*@} end of group CMSIS_NVIC */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_SCB System Control Block (SCB)
\brief Type definitions for the System Control Block Registers
@{
*/
/**
\brief Structure type to access the System Control Block (SCB).
*/
typedef struct
{
__IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
__IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
uint32_t RESERVED0;
__IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
__IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
__IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
uint32_t RESERVED1;
__IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
} SCB_Type;
/* SCB CPUID Register Definitions */
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
/* SCB Interrupt Control State Register Definitions */
#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
/* SCB Application Interrupt and Reset Control Register Definitions */
#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
/* SCB System Control Register Definitions */
#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
/* SCB Configuration Control Register Definitions */
#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
/* SCB System Handler Control and State Register Definitions */
#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
/*@} end of group CMSIS_SCB */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
\brief Type definitions for the System Timer Registers.
@{
*/
/**
\brief Structure type to access the System Timer (SysTick).
*/
typedef struct
{
__IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;
/* SysTick Control / Status Register Definitions */
#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
/* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
/* SysTick Current Register Definitions */
#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
/* SysTick Calibration Register Definitions */
#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
/*@} end of group CMSIS_SysTick */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
\brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.
Therefore they are not covered by the Cortex-M0 header file.
@{
*/
/*@} end of group CMSIS_CoreDebug */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_core_bitfield Core register bit field macros
\brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
@{
*/
/**
\brief Mask and shift a bit field value for use in a register bit range.
\param[in] field Name of the register bit field.
\param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
\return Masked and shifted value.
*/
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
/**
\brief Mask and shift a register value to extract a bit filed value.
\param[in] field Name of the register bit field.
\param[in] value Value of register. This parameter is interpreted as an uint32_t type.
\return Masked and shifted bit field value.
*/
#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
/*@} end of group CMSIS_core_bitfield */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_core_base Core Definitions
\brief Definitions for base addresses, unions, and structures.
@{
*/
/* Memory mapping of Core Hardware */
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
/*@} */
/*******************************************************************************
* Hardware Abstraction Layer
Core Function Interface contains:
- Core NVIC Functions
- Core SysTick Functions
- Core Register Access Functions
******************************************************************************/
/**
\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
*/
/* ########################## NVIC functions #################################### */
/**
\ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
\brief Functions that manage interrupts and exceptions via the NVIC.
@{
*/
#ifdef CMSIS_NVIC_VIRTUAL
#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
#endif
#include CMSIS_NVIC_VIRTUAL_HEADER_FILE
#else
/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0 */
/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0 */
#define NVIC_EnableIRQ __NVIC_EnableIRQ
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
#define NVIC_DisableIRQ __NVIC_DisableIRQ
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */
#define NVIC_SetPriority __NVIC_SetPriority
#define NVIC_GetPriority __NVIC_GetPriority
#define NVIC_SystemReset __NVIC_SystemReset
#endif /* CMSIS_NVIC_VIRTUAL */
#ifdef CMSIS_VECTAB_VIRTUAL
#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
#endif
#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
#else
#define NVIC_SetVector __NVIC_SetVector
#define NVIC_GetVector __NVIC_GetVector
#endif /* (CMSIS_VECTAB_VIRTUAL) */
#define NVIC_USER_IRQ_OFFSET 16
/* Interrupt Priorities are WORD accessible only under Armv6-M */
/* The following MACROS handle generation of the register offset and byte masks */
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
/**
\brief Enable Interrupt
\details Enables a device specific interrupt in the NVIC interrupt controller.
\param [in] IRQn Device specific interrupt number.
\note IRQn must not be negative.
*/
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
}
}
/**
\brief Get Interrupt Enable status
\details Returns a device specific interrupt enable status from the NVIC interrupt controller.
\param [in] IRQn Device specific interrupt number.
\return 0 Interrupt is not enabled.
\return 1 Interrupt is enabled.
\note IRQn must not be negative.
*/
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
}
else
{
return(0U);
}
}
/**
\brief Disable Interrupt
\details Disables a device specific interrupt in the NVIC interrupt controller.
\param [in] IRQn Device specific interrupt number.
\note IRQn must not be negative.
*/
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
__DSB();
__ISB();
}
}
/**
\brief Get Pending Interrupt
\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
\param [in] IRQn Device specific interrupt number.
\return 0 Interrupt status is not pending.
\return 1 Interrupt status is pending.
\note IRQn must not be negative.
*/
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
}
else
{
return(0U);
}
}
/**
\brief Set Pending Interrupt
\details Sets the pending bit of a device specific interrupt in the NVIC pending register.
\param [in] IRQn Device specific interrupt number.
\note IRQn must not be negative.
*/
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
}
}
/**
\brief Clear Pending Interrupt
\details Clears the pending bit of a device specific interrupt in the NVIC pending register.
\param [in] IRQn Device specific interrupt number.
\note IRQn must not be negative.
*/
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
}
}
/**
\brief Set Interrupt Priority
\details Sets the priority of a device specific interrupt or a processor exception.
The interrupt number can be positive to specify a device specific interrupt,
or negative to specify a processor exception.
\param [in] IRQn Interrupt number.
\param [in] priority Priority to set.
\note The priority cannot be set for every processor exception.
*/
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if ((int32_t)(IRQn) >= 0)
{
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
}
else
{
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
}
}
/**
\brief Get Interrupt Priority
\details Reads the priority of a device specific interrupt or a processor exception.
The interrupt number can be positive to specify a device specific interrupt,
or negative to specify a processor exception.
\param [in] IRQn Interrupt number.
\return Interrupt Priority.
Value is aligned automatically to the implemented priority bits of the microcontroller.
*/
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
{
if ((int32_t)(IRQn) >= 0)
{
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
}
else
{
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
}
}
/**
\brief Set Interrupt Vector
\details Sets an interrupt vector in SRAM based interrupt vector table.
The interrupt number can be positive to specify a device specific interrupt,
or negative to specify a processor exception.
Address 0 must be mapped to SRAM.
\param [in] IRQn Interrupt number
\param [in] vector Address of interrupt handler function
*/
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
{
uint32_t *vectors = (uint32_t *)0x0U;
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
}
/**
\brief Get Interrupt Vector
\details Reads an interrupt vector from interrupt vector table.
The interrupt number can be positive to specify a device specific interrupt,
or negative to specify a processor exception.
\param [in] IRQn Interrupt number.
\return Address of interrupt handler function
*/
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
{
uint32_t *vectors = (uint32_t *)0x0U;
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
}
/**
\brief System Reset
\details Initiates a system reset request to reset the MCU.
*/
__STATIC_INLINE void __NVIC_SystemReset(void)
{
__DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB(); /* Ensure completion of memory access */
for(;;) /* wait until reset */
{
__NOP();
}
}
/*@} end of CMSIS_Core_NVICFunctions */
/* ########################## FPU functions #################################### */
/**
\ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_FpuFunctions FPU Functions
\brief Function that provides FPU type.
@{
*/
/**
\brief get FPU type
\details returns the FPU type
\returns
- \b 0: No FPU
- \b 1: Single precision FPU
- \b 2: Double + Single precision FPU
*/
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
{
return 0U; /* No FPU */
}
/*@} end of CMSIS_Core_FpuFunctions */
/* ################################## SysTick function ############################################ */
/**
\ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
\brief Functions that configure the System.
@{
*/
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
/**
\brief System Tick Configuration
\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
Counter is in free running mode to generate periodic interrupts.
\param [in] ticks Number of ticks between two interrupts.
\return 0 Function succeeded.
\return 1 Function failed.
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
must contain a vendor-specific implementation of this function.
*/
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
return (1UL); /* Reload value impossible */
}
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0UL); /* Function successful */
}
#endif
/*@} end of CMSIS_Core_SysTickFunctions */
#ifdef __cplusplus
}
#endif
#endif /* __CORE_CM0_H_DEPENDANT */
#endif /* __CMSIS_GENERIC */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More